Lambdaのイベントソース処理のリトライ設計値をまとめる(Streams/SQS編)


はじめに

Lambdaのイベントソース処理の設定値と動作は複雑でわかりにくい。
しかも、DynamoDB Streams/Kinesis のストリーム系のイベントソース処理と、SQS イベントソース処理では設定値が異なる。

今回は、上記の非同期系処理を適切にリトライするための設計値をまとめる。
また、Terraformで設定する際のリソースと設定値も付記しておこう。

なお、イベントソース処理は動作上は非同期処理なので、Lambdaの非同期処理と勘違いしがちだが、Lambdaの非同期処理とイベントソース処理はそもそも概念が異なるので注意が必要。具体的なサービスについては、開発者ガイドの以下の節を参照していただきたい。

それぞれの機能の具体的な差異の例として、Lambda実行のリトライ/保持期間/DLQの設定について、非同期呼び出しではLambdaの設定が適用され、イベントソースマッピング呼び出しではイベントソース側の設定が適用される。

ストリーム系非同期処理の設計値

ストリーム系イベントソース処理の設計値は、以下の項目が重要になる。

マネージメントコンソールの設定値 Terraformリソース Terraformの設定値 デフォルト値
レコードの最長有効期間 aws_lambda_event_source_mapping maximum_record_age_in_seconds -1(無制限)
再試行 aws_lambda_event_source_mapping maximum_retry_attempts -1(無制限)
障害時の送信先 aws_lambda_event_source_mapping destination_config - on_failure 未設定

マネージメントコンソールの画面では以下の項目を見ると良い。

障害時の送信先は、下記のように定義する。なお、本設定を行う場合は、Lambda の IAM ロールに sqs:SendMessage の実行権を付与しておく必要がある。

resource "aws_lambda_event_source_mapping" "test" {
  // (中略)
  destination_config {
    on_failure {
      destination_arn = aws_sqs_queue.test.arn
    }
  }
}

SQSの設計値

SQSによるイベントソース処理の設計値は、以下の項目が重要になる。

マネージメントコンソールの設定値 Terraformリソース Terraformの設定値 デフォルト値
タイムアウト aws_lambda_function timeout 3秒
デフォルトの可視性タイムアウト aws_sqs_queue visibility_timeout_seconds 30秒
メッセージ保持期間 aws_sqs_queue message_retention_seconds 345600(4日)
最大受信数 aws_sqs_queue redrive_policy - maxReceiveCount 未設定
デッドレターキュー aws_sqs_queue redrive_policy - deadLetterTargetArn 未設定

マネージメントコンソールの画面で関連する部分は以下。

ここで、気を付けなければいけないのは以下の制限事項だ。

  • 可視性タイムアウトの設定値は>Lambdaのタイムアウト値 でないといけない
  • メッセージの保持期間>デフォルトの可視性タイムアウト×最大受信数 でないといけない(保持期間を過ぎるとDLQに入らず消滅する)

詳細な動作については以下の記事が分かりやすかった。

【Qiita】SQS → Lambdaのリトライ処理について整理してみた

これで、どちらのパターンでもエラー処理のキューに格納することができるようになった。
あとは、エラー処理のキューを監視するなりの設定を入れておくのが良い。