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