Only great people have the courage to speak about their own mistakes. Good job and good explanation. My suggestion here would be to add an extra step between `SNSTopic` and `SendEmailSerivce` - it will be an SQS queue. We would use Fanout Pattern, and we can have ability to add another subscription topic such as SMS, Slack notification, phone notification, etc. The only drawback is a little bit of latency, and at least one delivery (some lambdas can be trigger more than once). Using SQS subscription to the topic, we will be sure that the message is delivered and persisted. We can add retry logic and dead letter queue there.
An excellent article definitely.