Lambda 関数呼び出しタイムアウトエラーのトラブルシューティング方法を教えてください。
最終更新日: 2022 年 1 月 11 日
コードの変更をデプロイしていなくても、AWS Lambda 関数が断続的にタイムアウトします。Lambda 関数のタイムアウトに関する問題のトラブルシューティング方法、および Lambda 関数のタイムアウトを防ぐにはどうすればよいですか?
解決方法
Lambda 関数はさまざまな理由でタイムアウトすることがあります。Lambda 関数のタイムアウトをトラブルシューティングするには、まずこの記事に記載されている AWS のサービスと機能のいずれかを使用して、問題の原因を特定します。次に、ユースケースに基づいて問題を修正します。
Lambda 関数がタイムアウトしないようにするには、この記事の「Lambda 関数のタイムアウトを防止するためのベストプラクティス」セクションを参照してください。
Lambda 関数がタイムアウトしていることを確認する
関数の Amazon CloudWatch Logsグループで「Task timed out」という語句を検索して、タイムアウトした呼び出しのリクエスト ID を取得します。次に、関連付けられているタイムアウトした呼び出しのリクエスト ID を使用して、呼び出しタイムアウトごとに完全なログを取得します。
手順については、「Lambda 関数がタイムアウトしているかどうかを確認するにはどうすればよいですか?」を参照してください。
Lambda 関数がタイムアウトする原因を特定する
次の方法の 1 つまたは複数を使用して、関数のタイムアウトの原因となっている障害点を特定します。
ラムダの Amazon CloudWatch Logsを確認する
CloudWatch を使用して、関数のコードで生成されたすべてのログを表示し、潜在的な問題を特定できます。手順については、「AWS Lambda の Amazon CloudWatch Logsへのアクセス」を参照してください。
関数がスタックトレースを返している場合、スタックトレースのエラーメッセージは、エラーの原因を意味します。
重要:Lambda は、呼び出しごとに 3 つのログ行 (START、 END、 REPORT) を自動的に生成します。次のいずれかに該当する場合、関数の CloudWatch Logsには、これら 3 行しか表示されません:
- Lambda 関数のカスタムコードには、他に明確なロギングが設定されていません。
- Lambda がログを出力する関数のコードを実行できるようになる前に、関数の期間制限に達した場合。
ログを確認してもタイムアウトの原因を特定できない場合は、次の 1 つまたは複数の操作を試してください。
- 使用している AWS SDK の再試行回数とタイムアウトの設定にて、関数が初期化されるのに十分な時間があることを確認します。
- Lambda 関数のタイムアウト設定を一時的に増やして、関数コードがログデータを生成するのに十分な時間を確保します。
- 関数の構成済みメモリを増やして、呼び出し時間のレイテンシーを短縮します。
関数のコードにロギング出力を追加するには、使用している Lambda ランタイムに関する以下のドキュメントを参照してください。
- Node.js の AWS Lambda 関数ログ作成
- Python の AWS Lambda 関数ログ作成
- Ruby の AWS Lambda 関数ログ作成
- Java の AWS Lambda 関数ログ作成
- Go の AWS Lambda 関数ログ作成
- C# の AWS Lambda 関数ログ作成
- PowerShell の AWS Lambda 関数ログ作成
AWS X-Ray を使用して、コードパフォーマンスのボトルネックを特定します。
Lambda 関数でダウンストリーム AWS リソース、マイクロサービス、データベース、HTTP ウェブ API を使用している場合は、AWS X-Ray を使用してパフォーマンス問題のトラブルシューティングを行います。
詳細については、「 AWS X-Ray で AWS Lambda を使用する」を参照してください。
Lambda Insights を使用して、関数のシステムレベルのメトリクスを収集する
Lambda Insights は、CPU 時間、メモリ、ディスク、ネットワークメトリクスなどのシステムレベルのメトリクスを収集します。また、コールドスタートや Lambda ワーカーのシャットダウンなどの診断情報も収集し、Lambda 関数の問題を切り分けるのに役立ちます。
詳細については、「Lambda Insights の使用」を参照してください。
注:Lambda Insights を使用すると、AWS アカウントに課金されます。Lambda 拡張機能が消費した呼び出し時間に対して 1 ミリ秒単位で課金されます。
VPC フローログを使用して、特定の呼び出しリクエストが拒否された、またはルーティングされなかった理由を判断する
VPC フローログを使用すると、Amazon 仮想プライベートクラウド (Amazon VPC) との間で送受信されるすべてのネットワークトラフィックを確認できます。
詳細については、「 Lambda のネットワークの問題のトラブルシューティング 」を参照してください。
注:VPC フローログを設定する場合は、次の点に留意してください。
- フローログを下記のいずれかに発行する場合、Vended Logs のデータ取得とアーカイブ料金が適用されます。
CloudWatch Logs
Amazon Simple Storage Service (Amazon S3) - Amazon Virtual Private Cloud (Amazon VPC) のリソースにアクセスするように Lambda 関数を設定すると、Lambda は関数をelasticネットワークインターフェイスに割り当てます。Lambda 関数に関連付けられているネットワークトラフィックを特定するには、関数のネットワークインターフェイスを見つける必要があります。手順については、「Lambda が作成した Elastic ネットワークインターフェイスをデタッチまたは削除できないのはなぜですか?」を参照してください。
HTTP ワイヤトレースを使用して、呼び出し中に関数のコードによって生成されたネットワークリクエストを詳細にログに記録します。
詳細については、「HTTP ワイヤトレースのロギング」を参照してください。
Lambda 関数のタイムアウトを防ぐためのベストプラクティス
Lambda 関数がべき等であることを確認する
ネットワーク接続で問題が発生すると、API コールに想定より長い時間がかかることがあります。ネットワークの問題も、再試行や重複した API リクエストを引き起こす可能性があります。このような事態に備えるには、Lambda 関数がべき等であることを確認してください。
詳細については、「Lambda 関数をべき等にするにはどうすればよいですか?」を参照してください。
関数ハンドラーの外部で関数の静的ロジックを初期化する
Lambda 関数を初期化すると、Lambda は呼び出しの Init フェーズが完了するまでに最大 10 秒を割り当てます。この時間制約のため、初期化コードでは関数ハンドラの外部で次の操作を行うのがベストプラクティスです。
- ライブラリと依存関係をインポートする
- 構成を設定する
- 他のダウンストリームサービスおよびリソースへの接続を初期化する
この静的な初期化により、これらのリソースはサンドボックスごとに 1 回初期化され、ランタイム環境での今後のすべての呼び出しで再利用できます。
詳細については、「静的初期化の最適化」を参照してください。また、Lambda オペレータガイドの「ダウンストリーム利用不可」およびLambda デベロッパーガイド の関数コードも参照してください。
注:Lambda はダウンストリームリソースへのアイドル接続を削除します。関数が永続的な接続を維持できるようにするには、使用している Lambda ランタイムに関連付けられている tcp_keepalive 変数を使用します。
使用している AWS SDK の再試行回数とタイムアウトの設定で、関数が初期化されるのに十分な時間があることを確認します。
AWS SDK を使用して API コールを行い、その呼び出しが失敗した場合、AWS SDK は自動的に呼び出しを再試行します。AWS SDK が再試行する回数とその期間は、AWS SDK ごとに異なる設定によって決まります。関数の初期化には、AWS SDK のデフォルト設定よりも長い時間がかかる場合があります。
詳細は、「AWS SDK を使用して Lambda 関数を呼び出す際の再試行とタイムアウトの問題をトラブルシューティングする方法について教えてください」を参照してください。
Lambda 関数のプロビジョニングされた同時実行を設定する
プロビジョニングされた同時実行は、要求された数のランタイム環境を初期化して、関数の呼び出しに即座に応答できるようにします。関数にプロビジョニングされた同時実行を設定するには、「プロビジョニングされた同時実行を設定する」の手順に従います。
詳細については、Lambda 関数の同時実行数の管理を参照してください。
注意:プロビジョニングされた同時実行を設定すると、AWS アカウントに料金が発生します。プロビジョニングされた同時実行は、特定のバージョンの関数または Lambda 関数エイリアスに設定できます。
Lambda 関数に十分なシステムリソースがあることを確認する
Lambda 関数の呼び出しに割り当てられるネットワーク帯域幅と CPU の量は、関数のメモリ設定によって決まります。
詳細については、『Lambda オペレータガイド』の「メモリと計算能力」を参照してください。
関数ハンドラーが文字列を返す前に、Lambda 関数が使用するバックグラウンドプロセスがすべて完了していることを確認してください。
詳細については、「AWS Lambda でのコンテナの再利用について」を参照してください。
Lambda 関数が、統合された AWS サービスの最大タイムアウト設定内で動作するように設定されていることを確認します。
Lambda 関数の最大呼び出しタイムアウト制限は 15 分ですが、他の AWS サービスではタイムアウト制限が異なる場合があります。
たとえば、Amazon API Gateway は Lambda 関数プロキシの呼び出しが完了するまで最大 29 秒間待機します。詳細については、「API Gateway を Lambda 関数と統合したときに表示されるエラーを解決するにはどうすればよいですか?」を参照してください。 また、 AWS Lambda を他のサービスと共に使用する。
関数が到達しようとしているエンドポイントへの有効なネットワークパスがあることを確認します。
ネットワーク設定を確認するには、「Amazon VPC 内の Lambda 関数でタイムアウトの問題をトラブルシューティングするにはどうすればよいですか?」の手順に従ってください。