AWS Lambda で関数の実行が成功しているにもかかわらず意図せず複数回実行されている理由を教えてください

AWS Lambda で関数の実行が成功しているにもかかわらず意図せず複数回実行されている理由を教えてください

2026.04.07

困っていた内容

AWS Lambda 関数を AWS CLI から実行後に実行ログを確認したところ、関数が意図せず複数回実行されていました。
関数の実行は成功しているためリトライされている理由を調査しています。

AWS Lambda で関数の実行が成功しているにもかかわらず意図せず複数回実行されている理由を教えてください。

どう対応すればいいの?

Lambda 関数の実行時間が AWS CLI のデフォルトのタイムアウト値である 60 秒を超えている可能性が考えられます。

AWS CLI には --cli-read-timeout というオプションがあり、デフォルト値は 60 秒です。
Command line options in the AWS CLI - AWS Command Line Interface

--cli-read-timeout <integer>
ソケットの最大読み込み時間を秒単位で指定します。この値をゼロ (0) に設定すると、ソケットの読み込みは無期限に待機し (ブロックされ)、タイムアウトになりません。デフォルト値は 60 秒です。

また、--cli-read-timeout の時間を超過すると AWS CLI はデフォルトで 2 回の再試行を実施します。
AWS CLI retries in the AWS CLI - AWS Command Line Interface

最大再試行回数のデフォルト値は 2 で、合計で 3 回呼び出しが試みられます。この値は、max_attempts 設定パラメータを使用して上書きできます。

上記のデフォルト設定の場合、AWS CLI から Lambda 関数を実行した際に Lambda 関数の実行時間が 60 秒を超えるとリトライされるため、関数の実行が成功しているにもかかわらず関数が複数回実行されます。

本挙動を防ぐ方法としては、AWS CLI からの関数実行時に --cli-read-timeout オプションを 0 に設定する方法をご検討ください。

やってみた

まずは以下の設定で Lambda 関数を作成しました。

  • ランタイム: Python 3.14
  • 実行ロール: AdministratorAccess 権限を付与したロール
  • タイムアウト: 120 秒
  • コード: 以下の通り
import json
import time

def lambda_handler(event, context):
    time.sleep(65)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

関数作成後、AWS CLI の以下のコマンドで関数を実行します。
詳細なログの確認のために --debug オプションも付与しています。

$ aws lambda invoke --function-name test output.json --debug

上記コマンドの実行から数分後、デバッグログの末尾には以下のエラーが記録されていました。

botocore.exceptions.ReadTimeoutError: Read timeout on endpoint URL: "https://lambda.ap-northeast-1.amazonaws.com/2015-03-31/functions/test/invocations"

一方で、Lambda 関数の実行ログを確認すると 3 回実行されており、いずれも実行が成功していました。

2026-04-07T08:36:29.406+09:00
START RequestId: 3255d8d9-7bbe-4314-a1a1-39f01cca2977 Version: $LATEST
2026-04-07T08:37:34.409+09:00
END RequestId: 3255d8d9-7bbe-4314-a1a1-39f01cca2977
2026-04-07T08:37:34.409+09:00
REPORT RequestId: 3255d8d9-7bbe-4314-a1a1-39f01cca2977 Duration: 65002.61 ms Billed Duration: 65311 ms Memory Size: 128 MB Max Memory Used: 40 MB Init Duration: 307.48 ms

2026-04-07T08:37:30.259+09:00
START RequestId: 64639d37-12c5-4df0-bea7-0e05d6fd0fce Version: $LATEST
2026-04-07T08:38:35.262+09:00
END RequestId: 64639d37-12c5-4df0-bea7-0e05d6fd0fce
2026-04-07T08:38:35.262+09:00
REPORT RequestId: 64639d37-12c5-4df0-bea7-0e05d6fd0fce Duration: 65002.57 ms Billed Duration: 65170 ms Memory Size: 128 MB Max Memory Used: 40 MB Init Duration: 167.35 ms

2026-04-07T08:38:31.722+09:00
START RequestId: 3c1a5f5d-325f-4c44-b1c7-a40bcad3b935 Version: $LATEST
2026-04-07T08:39:36.725+09:00
END RequestId: 3c1a5f5d-325f-4c44-b1c7-a40bcad3b935
2026-04-07T08:39:36.725+09:00
REPORT RequestId: 3c1a5f5d-325f-4c44-b1c7-a40bcad3b935 Duration: 65002.24 ms Billed Duration: 65003 ms Memory Size: 128 MB Max Memory Used: 40 MB

AWS CLI のデバッグログには以下の内容が記録されていました。

# 1 回目のリクエスト
2026-04-06 23:36:28,918 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): lambda.ap-northeast-1.amazonaws.com:443

# 1 回目のリクエストから 60 秒後にリトライ
2026-04-06 23:37:28,972 - MainThread - botocore.hooks - DEBUG - Event needs-retry.lambda.Invoke: calling handler <bound method RetryHandler.needs_retry of <botocore.retries.standard.RetryHandler object at 0x7f11b6e35be0>>

# 2 回目のリクエスト
2026-04-06 23:37:29,914 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (2): lambda.ap-northeast-1.amazonaws.com:443

# 2 回目のリクエストから 60 秒後にリトライ
2026-04-06 23:38:29,986 - MainThread - botocore.hooks - DEBUG - Event needs-retry.lambda.Invoke: calling handler <bound method RetryHandler.needs_retry of <botocore.retries.standard.RetryHandler object at 0x7f11b6e35be0>>

# 3 回目のリクエスト
2026-04-06 23:38:31,685 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (3): lambda.ap-northeast-1.amazonaws.com:443

# 3 回目のリクエストから 60 秒後にリトライ
2026-04-06 23:39:31,756 - MainThread - botocore.hooks - DEBUG - Event needs-retry.lambda.Invoke: calling handler <bound method RetryHandler.needs_retry of <botocore.retries.standard.RetryHandler object at 0x7f11b6e35be0>>

# リトライの上限値に達したのでエラーで終了
2026-04-06 23:39:31,756 - MainThread - botocore.retries.standard - DEBUG - Max attempts of 3 reached.

botocore.exceptions.ReadTimeoutError: Read timeout on endpoint URL: "https://lambda.ap-northeast-1.amazonaws.com/2015-03-31/functions/test/invocations"

以上より、Lambda 関数の実行時間が AWS CLI の --cli-read-timeout のデフォルト値である 60 秒を超えている場合には関数の実行が成功しているにもかかわらず関数が複数回実行されることを確認できました。

なお、以下のように --cli-read-timeout を 0 に設定した場合にはタイムアウトエラーは発生せず関数の実行も 1 回のみとなりました。

$ aws lambda invoke --function-name test output.json --debug --cli-read-timeout 0

2026-04-07 00:26:36,252 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): lambda.ap-northeast-1.amazonaws.com:443

2026-04-07 00:27:41,658 - MainThread - botocore.retries.standard - DEBUG - Not retrying request.

2026-04-07 00:27:41,658 - MainThread - awscli.formatter - DEBUG - RequestId: db4a152c-e43d-47ce-b6a1-ce281050a623
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

参考資料

この記事をシェアする

関連記事