Lambdaイベントの種類
イベント:何かが起こったことを通知するためのJSONデータ
イベントソース:イベントを発行し、Lambdaを呼び出す具体的なAWSサービス (e.g. API Gateway, SNS, DynamoDBStreams, ,,,)
呼び出しタイプ:Lambdaの呼び出し方 (Event | RequestResponse | DryRun)
イベントソースの種類によってどの呼び出しタイプでLambdaを起動するかは決まっている
(CLIからLambdaをInvokeするときはデフォルトではRequestResponseだが、オプションで指定することもできる)
イベントのサンプル:
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/eventsources.html
イベントモデル:イベントの取得がポーリングベースかどうか(参考:イベントソースマッピング)
プッシュモデル
プル以外のサービス
プルモデル
Kinesis
DynamoDB
SQS
イベントモデルの種類によってAWS Lambda アクセス権限モデルが変わる
サンプルイベントデータ
プルモデルのイベントにはトップレベルプロパティとしてRecordsがあり、複数のRecordが入ってくる。
プッシュモデルのイベントに規則性は特になさそう。
プッシュモデルのイベントのトップレベルプロパティとしてRecordsがあるイベントでも、Recordsの中に一つのRecordしか入ってこないイベントソースがある(SNS, S3, ,,,?)
https://stackoverflow.com/questions/33690231/when-lambda-is-invoked-by-sns-will-there-always-be-just-1-record
https://stackoverflow.com/questions/40765699/how-many-records-can-be-in-s3-put-event-lambda-trigger
なんでこういう重要な情報が書かれているのがドキュメントではなくFAQなのかAWSに問いたい、、、。
確かにサンプルコードではRecords[0]的な書き方をしてるが、確信が持てないのではっきりとドキュメントに書いてほしい。
再試行動作
Lambdaのタイムアウト設定値の時間まで処理が終わらない
LambdaHandlerが例外を投げる
メモリ不足
...
というような理由でLambdaがエラーになった場合の動作。
イベントソースの種類によって異なる動作をする。
ストリームベースでない
同期(=API Gateway, ,,,)→429 (proxy request設定されたAPI Gateway越しだとクライアントには502)を返すので、クライアントでリトライ処理を行う。DLQとしてSNSTopicかSQSキューを設定しておけばそこに失敗したイベントが送られる。(設定されてなければ破棄)
非同期(=SNS, S3, ,,,)→デフォルトで2回リトライされる。それでも成功しなかった場合、DLQとしてSNSTopicかSQSキューを設定しておけばそこに失敗したイベントが送られる。(設定されてなければ破棄) #非同期呼び出しLambdaのリトライ間隔
ストリームベース
ポーリングベース(=Kinesis Data Streams, DynamoDBStreams)→失敗したレコードの有効期限が切れるまで最大7日間(デフォルトだと24時間?)リトライし続ける。順序保証をするために失敗したレコードでキューが詰まる(後続のレコードが処理されない)。このブロッキングを避けたければ手前にSQSを挟んでおくと順序保証がなくなる代わりに詰まらなくなる。
ポーリングベースでない(=SQS)→正常に終了すればキューからイベントを削除。エラーなら削除しないので可視性タイムアウトしたときに他のコンシューマが処理しはじめる。?(若干よくわからない記述がある)
参考:
AWS Lambda 関数の呼び出し
知っておいたほうがいいLambda関数の呼び出しタイプとリトライ方式まとめ
#AWS
#Lambda
#技術