Mengirim Email Alert via SNS: Cara Mengatasi Email yang Tidak Masuk
Anda sudah membuat SNS topic, menambahkan subscription email, tapi alert tidak pernah sampai di inbox — situasi ini lebih sering terjadi dari yang seharusnya. Penyebab paling umum bukan konfigurasi IAM atau policy yang salah, melainkan satu langkah yang terlewat: konfirmasi subscription melalui link yang dikirim SNS ke email Anda.
TL;DR: Checklist Cepat SNS Email Alert
| Langkah | Yang Harus Dicek | Status Aman |
|---|---|---|
| 1 | Status subscription di SNS | PendingConfirmation → belum dikonfirmasi |
| 2 | Email konfirmasi di inbox / spam | Klik link 'Confirm subscription' |
| 3 | Token konfirmasi expired (3 hari) | Unsubscribe lalu subscribe ulang |
| 4 | Topic policy memblokir publish | Pastikan principal punya izin sns:Publish |
| 5 | Filter policy aktif di subscription | Pastikan message attribute cocok atau hapus filter |
Bagaimana SNS Email Subscription Bekerja
SNS menggunakan model opt-in untuk subscription email. Ketika Anda memanggil sns:Subscribe dengan protokol email, SNS tidak langsung mengaktifkan subscription — SNS mengirim email konfirmasi ke alamat yang didaftarkan, berisi link unik dengan token satu kali pakai. Subscription baru aktif setelah penerima mengklik link tersebut.
Selama status subscription masih PendingConfirmation, semua pesan yang dipublish ke topic tidak akan dikirim ke alamat email tersebut. Tidak ada error yang muncul di sisi publisher — pesan diterima SNS, tapi delivery ke endpoint yang belum dikonfirmasi memang diabaikan secara desain.
- Subscribe: Anda memanggil
aws sns subscribedengan protokolemail. - PendingConfirmation: SNS mengirim email konfirmasi. Subscription belum aktif.
- Konfirmasi: Penerima klik link di email → SNS memvalidasi token.
- Confirmed: Subscription aktif. Pesan dari topic mulai dikirim ke email.
- Token Expired: Jika link tidak diklik dalam 3 hari, token kadaluarsa. Subscription harus dibuat ulang.
Bayangkan SNS email subscription seperti form pendaftaran newsletter — server tidak akan mengirim konten sampai Anda mengklik 'verify email' di kotak masuk. Ini bukan bug, ini mekanisme anti-spam yang disengaja.
Diagnosis SNS Email Alert Tidak Masuk
Langkah 1: Cek Status Subscription
Langkah pertama adalah memastikan status subscription Anda. Status PendingConfirmation mengonfirmasi bahwa masalahnya ada di proses konfirmasi, bukan di konfigurasi topic atau IAM — ini mempersempit ruang debug secara signifikan sebelum Anda membuang waktu mengecek policy.
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic \
--query 'Subscriptions[*].{Endpoint:Endpoint,Protocol:Protocol,SubscriptionArn:SubscriptionArn}' \
--output table
Jika output menampilkan PendingConfirmation di kolom SubscriptionArn, lanjut ke Langkah 2. Jika status sudah Confirmed tapi email tetap tidak masuk, loncat ke Langkah 4.
Langkah 2: Cek Inbox dan Folder Spam
Email konfirmasi dari SNS dikirim dari domain no-reply@sns.amazonaws.com dengan subject 'AWS Notification - Subscription Confirmation'. Email ini sering masuk ke folder spam atau diblokir oleh filter korporat. Cek folder spam terlebih dahulu sebelum melakukan langkah lebih lanjut.
Jika email konfirmasi ditemukan, klik link 'Confirm subscription' di dalam email tersebut. Setelah diklik, status subscription akan berubah menjadi Confirmed secara otomatis.
Langkah 3: Kirim Ulang Email Konfirmasi (Jika Token Expired)
Token konfirmasi SNS berlaku selama 3 hari. Jika sudah lewat, link di email lama tidak akan berfungsi. Satu-satunya cara adalah menghapus subscription lama dan membuat yang baru — SNS tidak menyediakan endpoint untuk regenerasi token tanpa subscribe ulang.
Gunakan SubscriptionArn yang Anda terima dari output perintah aws sns subscribe sebelumnya. Jika Anda tidak menyimpannya, Anda dapat menemukannya dengan menjalankan aws sns list-subscriptions.
# Hapus subscription lama
aws sns unsubscribe \
--subscription-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Buat subscription baru — SNS akan mengirim ulang email konfirmasi
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic \
--protocol email \
--notification-endpoint your-email@example.com
Setelah perintah subscribe dijalankan, cek inbox dalam beberapa menit. Klik link konfirmasi sebelum 3 hari berlalu.
Langkah 4: Verifikasi Topic Policy
Jika subscription sudah Confirmed tapi email tetap tidak masuk, periksa apakah ada topic policy yang memblokir aksi sns:Publish. Topic policy yang terlalu restriktif — misalnya hanya mengizinkan publish dari akun atau principal tertentu — bisa menyebabkan pesan gagal masuk ke topic tanpa error yang jelas di sisi pemanggil.
aws sns get-topic-attributes \
--topic-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic \
--query 'Attributes.Policy' \
--output text
Pastikan policy mengizinkan principal yang relevan (misalnya CloudWatch, Lambda, atau akun Anda) untuk melakukan sns:Publish. Contoh policy minimal yang mengizinkan publish dari akun sendiri:
🔽 Klik untuk melihat contoh Topic Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublishFromAccount",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-1:123456789012:MyAlertTopic"
}
]
}
Langkah 5: Periksa Filter Policy pada Subscription
Filter policy adalah fitur yang sering dilupakan saat debugging — subscription yang sudah Confirmed tetap tidak menerima pesan jika message attribute yang dipublish tidak cocok dengan filter yang dikonfigurasi. Ini silent failure: SNS menerima pesan, tapi tidak meneruskannya ke subscription yang tidak match.
aws sns get-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--query 'Attributes.FilterPolicy' \
--output text
Jika output menampilkan filter policy, pastikan pesan yang Anda publish menyertakan message attribute yang cocok. Atau hapus filter policy untuk sementara guna memverifikasi bahwa ini penyebabnya:
aws sns set-subscription-attributes \
--subscription-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--attribute-name FilterPolicy \
--attribute-value '{}'
Pengalaman Lapangan: Misdiagnosis yang Sering Terjadi
Skenario yang berulang: engineer membuat SNS topic, menambahkan email subscription, lalu menghabiskan satu jam mengecek IAM role Lambda, CloudWatch alarm configuration, dan VPC endpoint — semua terlihat benar. Alert tetap tidak masuk.
Asumsi awalnya adalah ada yang salah dengan konfigurasi CloudWatch atau permission Lambda untuk memanggil SNS. Tapi ketika dicek dengan list-subscriptions-by-topic, status subscription masih PendingConfirmation. Email konfirmasi ternyata ada di folder spam sejak tiga hari lalu — dan token sudah expired.
Pelajarannya: selalu cek status subscription sebagai langkah pertama, bukan terakhir. Status PendingConfirmation adalah dead giveaway yang mengeliminasi semua hipotesis lain sekaligus.
IAM Minimum untuk Operasi SNS Email Alert
Jika Anda menjalankan perintah CLI di atas dari IAM user atau role, pastikan principal memiliki izin berikut. Operasi list-subscriptions dan get-topic-attributes memerlukan Resource: "*" karena tidak mendukung resource-level permission pada semua kondisi — verifikasi di Service Authorization Reference sebelum mempersempit scope.
🔽 Klik untuk melihat IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SNSSubscriptionManagement",
"Effect": "Allow",
"Action": [
"sns:Subscribe",
"sns:Unsubscribe",
"sns:ListSubscriptionsByTopic",
"sns:ListSubscriptions",
"sns:GetSubscriptionAttributes",
"sns:SetSubscriptionAttributes",
"sns:GetTopicAttributes"
],
"Resource": "*"
},
{
"Sid": "SNSPublish",
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-1:123456789012:MyAlertTopic"
}
]
}
Mengirim Test Message untuk Verifikasi Akhir
Setelah subscription dikonfirmasi, kirim pesan test langsung ke topic untuk memastikan end-to-end delivery bekerja sebelum mengandalkan alert ini di production.
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789012:MyAlertTopic \
--subject 'Test Alert dari SNS' \
--message 'Ini adalah pesan test. Jika Anda menerima email ini, konfigurasi SNS email alert Anda sudah benar.'
Email seharusnya masuk dalam hitungan detik hingga beberapa menit, tergantung kondisi jaringan dan filter email. Jika setelah 5 menit belum masuk, ulangi Langkah 4 dan 5.
Wrap-Up: Mengirim Email Alert via SNS dengan Benar
Masalah SNS email alert yang tidak masuk hampir selalu bermuara pada satu dari tiga hal: subscription belum dikonfirmasi, token konfirmasi sudah expired, atau filter policy yang tidak cocok. Urutan diagnosis yang tepat — cek status subscription dulu, baru konfigurasi lainnya — menghemat waktu debug secara signifikan.
Untuk referensi lebih lanjut, lihat dokumentasi resmi Amazon SNS Email Notifications dan SNS Subscription Filter Policies.
Glosarium
| Istilah | Penjelasan |
|---|---|
| SNS Topic | Saluran komunikasi di Amazon SNS tempat publisher mengirim pesan dan subscriber menerima notifikasi. |
| PendingConfirmation | Status subscription SNS yang menunjukkan email konfirmasi sudah dikirim tapi belum diklik oleh penerima. |
| Subscription Token | Token unik satu kali pakai yang dikirim SNS dalam email konfirmasi, berlaku selama 3 hari. |
| Filter Policy | Konfigurasi opsional pada subscription SNS yang menyaring pesan berdasarkan message attribute — pesan yang tidak cocok tidak diteruskan. |
| Topic Policy | Resource-based policy pada SNS topic yang mengontrol siapa yang boleh melakukan aksi seperti sns:Publish atau sns:Subscribe. |
Komentar
Posting Komentar