Lambdaのタイムアウト検知の仕方とタイムアウト時の対処法・調査方法

Lambdaのタイムアウトについて書いていきまーす!

具体的には、以下の内容について、記載します。

本記事でやること
  • Lambdaのタイムアウトの検知
    • ログからタイムアウトの有無を確認する
    • CloudWatchのメトリクスフィルタを使用してタイムアウトをメトリクス化(可視化)する方法
  • タイムアウト時の対処法

まずタイムアウトの検知方法からみていきます。

スポンサーリンク

タイムアウトの検知方法

ログからタイムアウトを検知可能です。

ログを検索してタイムアウトの有無を確認する

Lambdaタイムアウト時には「Task timed out」というフレーズがログに吐かれますので、CloudWatchLogsのログインサイトを使ってログを検索することで、タイムアウトの有無を確認できます。

対象のロググループを指定してログインサイト画面へ行き、以下のクエリを実行することで、タイムアウトのログを検索できます。

fields @timestamp, @message, @logStream, @log
| filter @message like 'Task timed out'
| sort @timestamp desc
| limit 20

次にメトリクスフィルタを使用して、タイムアウトをメトリクス化します!

メトリクスフィルタを使用してタイムアウトをメトリクス化する

メトリクスフィルタでタイムアウトをメトリクス化し、メトリクスのグラフ表示でタイムアウトを確認する方法です。

これにより、タイムアウトの回数や頻度を可視化できます。

メトリクスフィルターとは?という方は以下の記事をご参照ください。

CloudWatchLogsのメトリクスフィルターの使い方ーログデータをメトリクス化して監視する
メトリクスフィルターを使いCloudWatchLogsのログデータを 「CloudWatchのメトリクスで見える化する」「メトリクスを監視してアラートをあげる」ということをやってみます。JSONログデータのメトリクス化も可能です。メトリクス化ができれば監視は通常のアラーム設定と同様となります
  1. AWSマネージメントコンソール画面からCloudWatchダッシュボードを表示
  2. ロググループリンクを押下する
  3. メトリクスフィルタータブを開く
  4. 「メトリクスフィルターを作成」ボタンを押下
メモリクスフィルターを作成

メモリクスフィルターを作成

以下の画面が表示されるので、「フィルターパターン」を入力します。

フィルターパターンに「Task timed out」と入力します。

フィルタパターンを設定して、Nextボタンを押下すると

メトリクスの割り当て画面が表示されます。以下の設定をしてNextボタンを押下します。

  • フィルター名:適切なもの
  • メトリクス空間:CloudWatchのメトリクスの名前空間を指定します。メトリクスフィルターであることが分かりやすいものを入力すると良いです
  • メトリクス名:どのようなメトリクスなのか分かりやすい名前をつけると良いです。
  • メトリクス値:「1」を指定します

Review and confirm画面が表示されるので、「メトリクスフィルターを作成」ボタンを押下します。

AWSマネージメントコンソール画面からCloudWatchダッシュボードを表示して、すべてのメトリクスを押下して作成したメトリクスを選択するとグラフを確認できます。

また、作成したメトリクスでアラームを設定し、エラーが起きた時にメールやSlackなどに通知をすることも可能です。

タイムアウト時の対処法

公式記事にトラブルシューティングの方法が記載されています。

Lambda 関数呼び出しタイムアウトエラーのトラブルシューティング | AWS re:Post
コードの変更をデプロイしていなくても、AWS Lambda 関数が断続的にタイムアウトします。Lambda 関数呼び出しタイムアウトの問題をトラブルシューティングおよび防止するにはどうすればよいですか?

タイムアウト時の対処法は大きく3つと読み取れます

3つの対処法

AWS SDK の再試行とタイムアウト設定の見直し
タイムアウト時間を延ばす
メモリを増やす

まずは、AWS SDK の再試行とタイムアウト設定の見直しについて書いていきます!

AWS SDK の再試行とタイムアウト設定の見直し

以下にAWS SDK の再試行のデフォルト設定が記載されています。

AWS SDK を使用するときの Lambda 関数の再試行とタイムアウトに関する問題のトラブルシューティング | AWS re:Post
AWS SDK を使用して AWS Lambda 関数を呼び出す際に、関数がタイムアウトするか、API リクエストが応答を停止するか、API アクションが重複します。これらの問題の解決方法を教えてください。

これを現在のLambdaタイムアウト値と見比べ調整する感じです。

特に、GoとJavaScript/Node.jsは、接続タイムアウトの設定がないため、注意が必要です。

次は、タイムアウト時間を延ばす対策です。

タイムアウト時間を延ばす

こちらは、一旦タイムアウト値を伸ばして様子をみてみようという作戦です。

タイムアウト時間を延ばすことで、アプリケーションログが出力され、時間を要している箇所の特定ができるといったことが期待できます。

次はメモリを増やす対策です。

メモリを増やす

メモリを増やすことで

  • 呼び出し時間のレイテンシーを短縮
  • コンピューティング性能を向上

が期待できるようです。簡単にいうと早くなると言うことですね。

メモリを増やせば必ず解決する訳ではないので、メモリを増やしたうえで経過観察が必要となります。

それでも解決しないとき

Lambda Insights を有効化して、リソースの状態を確認してみるのが良いです。

Lambda Insightsの有効化方法は以下をご参照ください

AWS Lambda Insightsを有効化する方法と無効化する方法
AWS Lambda Insightsの有効化と無効化の切り替えは簡単に行えます。Lambda Insightsは有料ですので、エラー発生時など調査が必要な時だけ有効化、不要な時は無効化した方がいいと思います。Lambda関数の実行数に応じて料金も増えていくので、実行数が多い場合は要注意かと思います

X-Ray でも時間を要している箇所(ボトルネック)の確認が可能です。

AWS LambdaでX-Rayを有効化する方法と無効化する方法
AWS Lambda で X-Rayの有効化と無効化の切り替えは簡単に行えます。X-Rayは有料ですので、パフォーマンスに問題発生時など調査が必要な時だけ有効化、不要な時は無効化した方がいいと思います。Lambda関数の実行数に応じて(トレースする数に応じて)料金も増えていくので、実行数が多い場合は要注意かと思います

Lambda InsightsとX-Rayのどちらを使えば良いかで迷ったら、以下の基準で判断します。

  • サーバリソースの状況を確認したい場合:Lambda Insights
  • 間を要している箇所(ボトルネック)を確認したい場合:X-Ray