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

LangkahYang Harus DicekStatus Aman
1Status subscription di SNSPendingConfirmation → belum dikonfirmasi
2Email konfirmasi di inbox / spamKlik link 'Confirm subscription'
3Token konfirmasi expired (3 hari)Unsubscribe lalu subscribe ulang
4Topic policy memblokir publishPastikan principal punya izin sns:Publish
5Filter policy aktif di subscriptionPastikan 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.

graph TD A["aws sns subscribe (protokol: email)"] --> B["Status: PendingConfirmation SNS kirim email konfirmasi"] B --> C{"Penerima klik link konfirmasi?"} C -- "Ya, dalam 3 hari" --> D["Status: Confirmed Email alert aktif"] C -- "Tidak / Token Expired" --> E["Subscription tetap PendingConfirmation"] E --> F["Unsubscribe lalu Subscribe ulang"] F --> B D --> G["sns:Publish diterima Email dikirim ke inbox"]
  1. Subscribe: Anda memanggil aws sns subscribe dengan protokol email.
  2. PendingConfirmation: SNS mengirim email konfirmasi. Subscription belum aktif.
  3. Konfirmasi: Penerima klik link di email → SNS memvalidasi token.
  4. Confirmed: Subscription aktif. Pesan dari topic mulai dikirim ke email.
  5. 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

IstilahPenjelasan
SNS TopicSaluran komunikasi di Amazon SNS tempat publisher mengirim pesan dan subscriber menerima notifikasi.
PendingConfirmationStatus subscription SNS yang menunjukkan email konfirmasi sudah dikirim tapi belum diklik oleh penerima.
Subscription TokenToken unik satu kali pakai yang dikirim SNS dalam email konfirmasi, berlaku selama 3 hari.
Filter PolicyKonfigurasi opsional pada subscription SNS yang menyaring pesan berdasarkan message attribute — pesan yang tidak cocok tidak diteruskan.
Topic PolicyResource-based policy pada SNS topic yang mengontrol siapa yang boleh melakukan aksi seperti sns:Publish atau sns:Subscribe.

Related Posts

Komentar

Postingan populer dari blog ini

EC2 Tidak Bisa Akses Internet di Custom VPC: Cara Pasang Internet Gateway dan Update Route Table