Lambdaをスケジュール実行して関数エラーが起きた際の再試行を確認してみた
データアナリティクス事業本部の鈴木です。
Amazon EventBridgeからAWS Lambdaを非同期的に呼び出して関数エラーが起きる際に、再試行されるか試してみました。
Lambdaの非同期呼び出しで関数エラーが起きた際に設定した回数だけ再試行されることは知っていましたが、「EventBridgeからは何呼び出しになって、再試行されたっけ?」と分からなくなってしまったので、参考にした資料とEventBridgeでの動作確認例をご紹介します。
Lambdaの非同期呼び出し
EventBridgeをトリガーにした場合は、記事執筆時点だと、非同期呼び出しで関数が実行されます。
S3やSNSなどの複数のサービスでは、Lambdaの関数を非同期的に呼び出してイベントを処理します。非同期呼び出しの場合、Lambdaはリクエストをイベントキューに入れ、別のプロセスがキューからイベントを読み取って関数に送信し、関数が起動するようになっています。
非同期呼び出しでLambdaの実行時に関数エラーが起きる場合には、0〜2の設定した回数だけ再試行が行われます。
詳しくは以下のドキュメントをご確認ください。
Lambdaのトリガーにサービスを設定している場合、どのサービスからだとどの呼び出し方法になるのかは、以下のドキュメントから確認できました。
やってみる
EventBridgをトリガーにした際に、関数エラーでlambdaの関数がリトライされることを試してみました。
以下のような構成を作っていきます。
Lambda関数を作成する
コンソールからpython3.8のランタイムのLambdaの関数を新規に作成し、以下のようなコードをデプロイしておきました。
import json def lambda_handler(event, context): print("例外を送出します。") raise Exception return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
このようにしておくことで、Lambda関数が実行後に関数エラーを返すため、再試行の回数だけLambdaがリトライされます。
再試行の回数は2としておきました。
トリガーにEventBridgeを設定する
Lambdaの関数のトリガーにEventBridgeを設定します。今回はスケジュール実行を想定して、cronで実行時間を設定しておきます。
実行結果を確認する
スケジュール設定しておいたので、時間になったらCloudWatch Logsを確認してみました。
トリガーはスケジュールの1回だけのはずですが、ログの出力通り、再試行の回数だけリトライされていることが分かりました。
最後に
今回はEventBridgeからLambdaを非同期呼び出して関数エラーが起きた際の、再試行の挙動を確認しました。
参考になりましたら幸いです。