⚠️
boto3でLambda関数から別のLambda関数を呼ぶと何回も繰り返し呼ばれる際の対処法
1.boto3を使ったLambda関数の呼び出しについて
boto3を使ってLambda関数を呼び出す際は以下のようにクライアントを定義します。
一方でパラメータを設定せずにクライアント定義した場合、問題が生じます。
lmd_client = boto3.client("lambda")
2.boto3のパラメータがデフォルトの場合に生じる問題
■ 前提
- Lambda AからLambda Bを呼び出す際、boto3を使って呼び出す
- Lambda Bの処理のタイムアウトは5分
- boto3クライアントのパラメータはデフォルト
■ 問題事象:呼び出されるLambda関数が何回も呼び出される
このとき、Lambda Bの実行時間が1分を超えると、Lambda Bが3回呼び出されてしまいます。
■ 理由:boto3のデフォルトパラメータが悪さをしている
boto3クライアントには以下のパラメータがあります。
設定値 | 説明 | デフォルト値 |
---|---|---|
connect_timeout | Lambda Bへの接続を待機する時間 (秒) | 60秒 |
read_timeout | Lambda Bからのレスポンスを待機する時間(秒) | 60秒 |
retries.total_max_attempts | タイムアウト時にLambda B再度呼び出す回数 | 3回 |
したがって、boto3クライアントのパラメータがデフォルトの場合、
- Lambda Bからのレスポンスを待機する時間が1分
- Lambda関数の再呼び出し回数が3回
となるため、Lambda Bの実行時間が1分を超えると、Lambda Bが3回呼び出されてしまいます。
3.結論
呼び出されるLambda関数の処理時間が1分を超える際、必ず「config」パラメータを設定しましょう。
-
read_timeout=300
:呼び出されるLambdaの実行を待機してくれます。 -
retries={"max_attempts": 0}
:Lambdaの再実行を防いでくれます。
lmd_client = boto3.client("lambda", config=Config(connect_timeout=120, read_timeout=300, retries={"max_attempts": 0}))
補足
補足ですが、boto3のパラメータがデフォルトの場合、
Lambda関数側の以下設定部分を変更しても、問答無用で繰り返しLambda関数が呼ばれます。
必ず、boto3側で設定してあげましょう。
<再帰ループ検出>
- 再帰検出設定:再帰ループを終了する
<非同期呼び出し>
- 再試行:0
Discussion