Lambdaをスケジュール実行して関数エラーが起きた際の再試行を確認してみた

2021.12.21

データアナリティクス事業本部の鈴木です。

Amazon EventBridgeからAWS Lambdaを非同期的に呼び出して関数エラーが起きる際に、再試行されるか試してみました。

Lambdaの非同期呼び出しで関数エラーが起きた際に設定した回数だけ再試行されることは知っていましたが、「EventBridgeからは何呼び出しになって、再試行されたっけ?」と分からなくなってしまったので、参考にした資料とEventBridgeでの動作確認例をご紹介します。

Lambdaの非同期呼び出し

EventBridgeをトリガーにした場合は、記事執筆時点だと、非同期呼び出しで関数が実行されます。

S3やSNSなどの複数のサービスでは、Lambdaの関数を非同期的に呼び出してイベントを処理します。非同期呼び出しの場合、Lambdaはリクエストをイベントキューに入れ、別のプロセスがキューからイベントを読み取って関数に送信し、関数が起動するようになっています。

非同期呼び出しでLambdaの実行時に関数エラーが起きる場合には、0〜2の設定した回数だけ再試行が行われます。

詳しくは以下のドキュメントをご確認ください。

非同期呼び出し - AWS Lambda

Lambdaのトリガーにサービスを設定している場合、どのサービスからだとどの呼び出し方法になるのかは、以下のドキュメントから確認できました。

他のサービスで AWS Lambda を使用する - サービスの一覧と詳細情報へのリンク

やってみる

EventBridgをトリガーにした際に、関数エラーでlambdaの関数がリトライされることを試してみました。

以下のような構成を作っていきます。

作成した構成

Lambda関数を作成する

コンソールからpython3.8のランタイムのLambdaの関数を新規に作成し、以下のようなコードをデプロイしておきました。

lambda_function.py

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で実行時間を設定しておきます。

EventBridgeの設定

実行結果を確認する

スケジュール設定しておいたので、時間になったらCloudWatch Logsを確認してみました。

トリガーはスケジュールの1回だけのはずですが、ログの出力通り、再試行の回数だけリトライされていることが分かりました。

再施行結果のログ

最後に

今回はEventBridgeからLambdaを非同期呼び出して関数エラーが起きた際の、再試行の挙動を確認しました。

参考になりましたら幸いです。

参考