ただメモができるだけのブラウザアプリ「TextArea」はこちらw

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

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

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

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

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

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

https://it.kensan.net/it/cloudwatchlogs_metrics_filter.html
  1. AWSマネージメントコンソール画面からCloudWatchダッシュボードを表示
  2. ロググループリンクを押下する
  3. メトリクスフィルタータブを開く
  4. 「メトリクスフィルターを作成」ボタンを押下
メモリクスフィルターを作成

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

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

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

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

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

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

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

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

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

タイムアウト時の対処法

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

Lambda 関数呼び出しのタイムアウトエラーをトラブルシューティングする
コード変更をデプロイしていないにもかかわらず、AWS Lambda 関数が断続的にタイムアウトしました。

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

3つの対処法

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

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

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

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

AWS SDK での、Lambda 関数の再試行とタイムアウトに関する問題のトラブルシューティング
AWS SDK で AWS Lambda 関数を呼び出すと、関数のタイムアウト、API リクエストの失敗、API アクションの重複などの問題が発生します。

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

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

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

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

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

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

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

メモリを増やす

メモリを増やすことで

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

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

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

それでも解決しないとき

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

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

https://it.kensan.net/it/lambda-insights-start-end.html

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

https://it.kensan.net/it/aws-lambda-x-ray-start-end.html

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

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