はじめに
Amazon SNSには、Eメッセージの配信レート(1秒あたり10件)の上限を超過した場合に、SNSサブスクリプションを非アクティブ化させる仕様があります。
参考URL: Amazon SNS サブスクリプションを手動で無効にしたことを示す E メールが AWS から届いたのはなぜですか?
つい先日この問題を対処したことがあったため、投稿しました。
発生ケース
- CloudWatch Logsのロググループにサブスクリプションフィルターを設定
- サブスクリプションフィルターのフィルターパターンに一致したログがロググループに出力
- サブスクリプションフィルターをトリガーにLambdaが起動し、SNSへ配信
- SNSからメール配信
上記ケースにおいて、
フィルターパターンに一致するログが大量出力され、
結果的にメール大量送信、
SNSサブスクリプションの非アクティブ化に繋がりました。
起きてしまったら…
引用: https://dev.classmethod.jp/articles/intor-subscribe-sns-with-email/
対象のSNSサブスクリプションのコンソール画面を確認すると、
「保留中の確認」となっているため、「リクエストの確認」から確認メールを送信し、
サブスクリプションの有効化を実施することで解消させることができます。
対策 - Lambda同時実行数の調整
引用: https://aws.amazon.com/jp/blogs/news/new-provisioned-concurrency-for-lambda-functions/
Lambdaは、デフォルトで同時実行数が1,000に設定されております。
この同時実行数は、複数のリクエストを同時に処理するインスタンスの数を指し、現状では大量のログイベントを処理できる状態となっております。
参考URL: Lambda 関数のスケーリング
この同時実行数を下げることで配信レートを減少させることが可能です。
実施するコマンドは下記です。
aws lambda put-function-concurrency \
--function-name <対象のLambda> \
--reserved-concurrent-executions 1
プラスα
上記方法の場合、SNSサブスクリプションの非アクティブ化回避策として有効ですが、
メール配信の一部が欠損する可能性がございます。
Lambdaのイベント最大時間(最大6時間)までは再試行による処理が可能となりますが、
最大時間以降はメッセージが破棄されてしまいます。[1]
Lambdaの内部キューにSQSを使用されているため、[2]
キューとして保持されるメッセージ数は無制限、
デッドレターキューの活用により破棄されるメッセージを退避させることが可能です。
[1] 最大イベント経過時間
[2] Security Overview of AWS Lambda - Invoke Data Path
終わりに
あくまで要件の都合で対象ログのイベントを全量メール送信はやむを得ない場合や、
緊急の場合の対処法として検討いただきたい内容のため、
大原則対象ログのイベントを全量メール送信する運用を回避する方法も並行して検討いただくと良いかもしれません。(メトリクスフィルターによるメトリクス監視のみ実施するとか)
他に良い方法がございましたらぜひコメントいただけますと幸いです。
調査不足かもしれませんが、SNSサブスクリプションの非アクティブ化の対処に関するナレッジが見つからなかったため、どなたかの役に立てば嬉しいです。