⚠️

boto3でLambda関数から別のLambda関数を呼ぶと何回も繰り返し呼ばれる際の対処法

2024/09/29に公開

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