Email yang dikirim menggunakan AWS SES (Simple Email Service) lognya bisa disimpan ke dalam cloudwatch. Contohnya seperti ini:
Contoh diatas adalah log email yang berhasil dikirim ketujuan. Lognya berisi:
- Email pengirim
- IP pengirim
- Email tujuan
- Subject email
- Body email
- Tanggal kirim
Bagaimana mengaktifkan log SES?
Untuk mengaktifkan log SES, ada beberapa service yang harus kita gunakan:
- SNS (Simple Notification Service)
- Lambda
- CloudWatch
- CloudFormation -> Untuk mengupload codingan IaC (Infrastructure as Code)
Tutorial ini diambil dari blog AWS How to Log Amazon SES details using Amazon CloudWatch.
Disini saya akan jabarkan lebih detail alurnya.
Jadi alur sampai lognya bisa disimpan ke cloudwatch, adalah:
- Sender mengirim email ke SES
- SES akan mentrigger service SNS untuk mengirimkan lognya ke SNS dan SNS akan mengirimkan kembali lognya ke lambda function. Perlu diketahui SNS disini hanya berfungsi sebagai message broker saja. Semua log yg dikirimkan ke SNS akan diantrikan (queue), lalu dikirimkan ke lambda function sesuai urutan
- Lamda Function akan menerima log email. Lambda Function ini berisi script codingan (ditutorial ini kita gunakan Python). Semua log yang sudah diterima akan dikirimkan ke Cloudwatch sesuai codingan python
- CloudWatch akan menerima lognya dan menyimpannya. Disini lognya akan berupa JSON
Di gambar atas juga terdapat bounce, complaint, delivery.
- Bounce: Terjadi ketika email gagal dikirimkan karena beberapa alasan: email penerima tidak ditemukan, inbox penerima penuh, timeout, masuk ke suppression list (daftar email yang diblock) SES
- Complaint: Email berhasil dikirim, namun penerima menandai emailnya sebagai spam
- Delivery: Email berhasil dikirim
CloudFormation, nantinya kita akan mengupload file IaC (Infrastructure as Code) yang sudah disediakan oleh AWS. Berisi Codingan untuk membuat Lambda Function (menggunakan Python), CloudWatch.
Prasyarat
- Pastikan sudah mempunyai domain/email yang verified di SES
Mari kita mulai ..
Buat SES Topic
Pertama, buat SES topic.
- Masuk ke dashboard SES, klik menu Topics, klik Create topic
- Pada halaman create topic, isikan:
- Type: standard
- Name: SNS-SES
- Display name: SNS-SES
- Lalu klik Create topic
- SNS Topic berhasil dibuat
Kaitkan SNS Topic ke SES
Selanjutnya kaitkan SNS Topic yang sudah kita buat (SNS-SES) ke SES.
- Buka dashboard SES
- Masuk ke Configuration > Identities > pilih Domain/Email kalian, maka akan masuk ke detailnya
- Pilih tab Notifications > Feedback Notifications > klik Edit
- Disini kita akan mengaktifkan semua log SES (bounce, complaint, delivery).
Pada Bounce feedback, Complaint feedback, Delivery feedback pilih SNS-SES, lalu centang Include original email headers. - Klik Save changes
- Setelah disave, maka akan ada bounce, complaint dan delivery pada Feedback notifications
Upload code IaC (Infrastructure as Code) dengan CloudFormation
IaC berisi codingan untuk membuat lambda function, dan cloudwatch. Linknya bisa didownload dari sini, dan save dengan nama ses_bounce_logging_blog.yml
Jika sudah terdownload, selanjutnya upload code IaC dengan CloudFormation, caranya:
- Buka dashboard CloudFormation > masuk ke halaman Stacks
- klik Create stack
- Upload file ses_bounce_logging_blog.yml
- klik Next
- Pada halaman Specify stack details, isikan:
- Stack name: SNS-SES
- CloudWatchGroupName: /aws/ses/bounce_logs
Note: Disini kita hanya menyimpan log untuk bounce saja. Jika ingin menyimpan semua log (complaint dan delivery), silahkan upload kembali file ses_bounce_logging_blog.yml dan berikan Stack name yang berbeda dan pilih EventType: Complaint atau Delivery - EventType: Bounce
- SNSTopicARN: masukkan ARN SNS Topic yang sudah dibuat sebelumnya (silahkan masuk ke detail SNS topic untuk mendapatkan ARN)
- Halaman selanjutnyaConfigure stack options, biarkan semua default, klik Next
- Halaman Review, klik Submit
- Pada gambar diatas, ada 5 yang statusnya CREATE_COMPLETE sisanya masih CREATE_IN_PROGESS (biarkan saja, bukan menjadi masalah)
- Sampai proses ini, lambda function sudah terbuat. Untuk cloudwatch, akan terbuat ketika ada log email yang masuk.
Melihat Lambda Function
Untuk mengecek apakah lambda function sudah terbuat, langkahnya:
- Buka dashboard Lambda > Functions
- Akan ada nama function yang berawalan
SNS-SES-LambdaFunction-(random string)
- Jika kita masuk ke detailnya, pada tab Code maka akan ada codingan seperti ini:
- Codingan tersebut tidak perlu dirubah. Harusnya sudah works, mari kita test
Mengetes bounce email
Kita akan simulasi kirim email bounce.
- Masuk ke dashboard SES
- Pilih domain / email kalian, masuk ke detailnya
- Klik Send test email
- Pada halaman send test email, masukkan:
- Email format: Formatted
- from-address: test-bouce@(email kalian)
- Scenario: Bounce
- Subject: test-bounce-subject
- Body: test-bounce-body
- Klik Send test email
- Buka dashboard CloudWatch, klik Log groups
- Akan ada path log yang terbuat, klik log tersebut untuk melihat detail
- Klik salah satu log pada Log streams
- Klik lognya, maka tampilan JSONnya akan seperti ini
Mengetest complaint, delivery email
CloudFormation:
- Buat Stack baru pada CloudFormation dengan mengupload kembali file ses_bounce_logging_blog.yml, beri nama pada Stack name: SNS-SES-complaint atau SNS-SES-delivery
- Pada CloudWatchGroupName: masukkan /aws/ses/complaint_logs atau /aws/ses/delivery_logs
- Pada EventType: masukkan Complaint atau Delivery
SES:
- Masuk ke detail domain / email, klik Send test email
- Pilih Scenario: Complaint atau Successful Delivery (bisa juga Custom)
- Masukkan subject dan body, klik Send test email
CloudWatch:
- Akan ada 2 path log, yaitu:
- /aws/ses/complaint_logs
- /aws/ses/delivery_logs
- Klik path log tersebut untuk melihat detail lognya