Amazon SNSから通知を送る際、
- 「本当に送信された?」
- 「どこでエラーになった?」
- 「送信先からどんな応答が返ってきた?」
といった点を確認したくなることがあります。
Amazon SNSには、配信先へのメッセージ配信状況をCloudWatch Logsへ記録する Delivery Status Logging(配信ステータスログ) の機能があります。
ただし、すべての配信先が同じようにログの対象になるわけではありません。 今回は、SNSの配信先ごとに「どこまで確認できるのか」を整理します。
1. SNS Delivery Status Loggingとは?
SNSのDelivery Status Loggingでは、対象となるエンドポイントへのメッセージ配信について、CloudWatch Logsに配信ステータスを記録できます。
AWS公式では、Delivery Status Loggingの対象として以下が挙げられています。
- Amazon Data Firehose
- Amazon SQS
- AWS Lambda
- HTTP / HTTPS
- Platform application endpoint
ログからは、主に以下のような情報を確認できます。
- メッセージがエンドポイントへ正常に配信されたか
- エンドポイントからSNSへ返された応答
- メッセージのdwell time(Publishからエンドポイントへの引き渡しまでの時間)
成功した配信については設定したサンプル率に応じてログを取得でき、失敗した配信については失敗ログを記録する設定が可能です。
参考:AWS公式:Amazon SNS message delivery status
2. プロトコル・配信先別のログ取得状況
| 配信先 | Delivery Status Logging | 主に確認できる内容 |
|---|---|---|
| Email / Email-JSON | ✕ 対象外 | – |
| HTTP / HTTPS | ○ | 配信成功/失敗、送信先からの応答、dwell timeなど |
| SQS | ○ | 配信成功/失敗、SQSからの応答、dwell timeなど |
| Lambda | ○ | 配信成功/失敗、Lambdaからの応答、dwell timeなど |
| Amazon Data Firehose | ○ | 配信成功/失敗、Firehoseからの応答、dwell timeなど |
| Platform application endpoint | ○ | 配信成功/失敗、プッシュ通知サービスからの応答、dwell timeなど |
| SMS | ※別の配信ステータスログ | 成功/失敗、失敗理由、価格、dwell timeなど |
3. 配信先ごとの注意点
Emailは、SNSの標準Email/Email-JSON購読はDelivery Status Loggingの対象外です。「メールが届いたか一切わからない」わけではなく、SNS側の詳細な配信ステータスは確認できない、という意味です。メール配信の追跡性を重視する場合は、メール配信サービス側のログやイベント機能の利用を検討します。
HTTP/HTTPSは対象で、SlackやMicrosoft TeamsへのWebhook通知も、SNSから見れば単なるHTTPSエンドポイントへの配信として扱われます。特殊な扱いにはなりません。
Platform application endpointは、モバイルプッシュ通知向けの配信先です。配信成功/失敗や応答に加えて、試行回数やprovider responseといった項目もログに含まれます。
SQS・Lambda・Amazon Data Firehoseもいずれも対象ですが、共通して次の点に注意が必要です。
- SNSからの配信成功と、その先の処理成功は別物
- SNS → SQSの成功と、SQSのメッセージをコンシューマーが処理できたかは別問題(後者はSQSやコンシューマー側で確認)
- SNS → Lambdaの呼び出し成功と、Lambda内部処理が正常終了したかは別問題(後者はLambda側のCloudWatch Logsで確認)
- SNS → Firehoseの配信成功と、その後のデータ処理・保存先での問題は別問題(後者はFirehose側で確認)
Delivery Status Loggingで確認できるのは、基本的に「SNSから配信先エンドポイントへの配信状況」です。配信先での後続処理や、その先のユーザーへの最終到達までは別途確認する必要があります。
4. SMSは少し扱いが違う
SMSも配信状況をCloudWatch Logsで確認できますが、上記の一般的なDelivery Status Loggingとは別の仕組みとして考えた方がわかりやすいです。
SMS専用の配信ステータスログでは、以下のような情報を確認できます。
- 成功 / 失敗、失敗理由
- メッセージ価格
- message ID
- キャリアからの応答
- dwell time など
成功したSMSについてはログ記録の割合をサンプリング設定できます。例えば、成功は10%だけ記録し、失敗は記録するといった設定が可能です。
参考:AWS公式:Amazon SNS SMS delivery monitoring
5. メールの詳細な配信状況を確認したい場合は?
送信成功・バウンス・苦情・配信イベントなど、メールの詳細な追跡を行いたい場合は、要件に応じてAmazon SESなどのメール配信サービスを利用する方法があります。
以下のような構成も考えられます。
アプリケーション → SNS → Lambda → SES → メール送信
ただし、これが「SNSの標準Emailより必ず優れている」という単純な話ではありません。メール配信の追跡性をどこまで必要とするか、システム構成や運用要件に応じて判断するのがポイントです。
まとめ
Amazon SNSの配信ログは、「SNSからどの配信先へ、どこまで正常に引き渡せたか」 を確認するための情報です。
- 通常のDelivery Status Loggingの対象は HTTP/HTTPS・SQS・Lambda・Amazon Data Firehose・Platform application endpoint
- Emailは通常のDelivery Status Loggingの対象外
- SMSは専用の配信ステータスログとして別管理
- SNSのDelivery Status Loggingと、配信先サービス自体の実行ログ・処理結果は別物
- SNSの配信成功 = 最終的なユーザーへの到達成功、とは限らない
「SNSでは成功になっているのに、なぜユーザーには届かないのか?」という障害調査では、SNSのログだけで判断せず、配信先サービス側のログやメトリクスも合わせて確認することが重要です。
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK