AWS Lambda 関数と統合されている Amazon API Gateway API にリクエストを送信すると、応答時間が遅くなります。高遅延の原因を特定したいです。
解決策
Lambda 関数と統合されている API エンドポイントがクライアントに応答を送信するのに時間がかかりすぎる場合は、高遅延に対処する必要があります。API Gateway のメトリクスを確認して、高遅延の原因となっているリクエスト/応答フローのセクションを特定します。高遅延の原因を特定した後、遅延を軽減する対応を行います。
CloudWatch メトリクスをフィルター処理して API の遅延に関するメトリクスを確認する
高遅延の原因となっているリクエスト/応答フローのセクションを特定するには、まず次の手順を実行します。
- API にリクエストを送信した後のクライアントの遅延を確認します。
- 全体の遅延を確認した後、Amazon CloudWatch コンソールを開きます。左側のナビゲーションペインで、[メトリクス]、[すべてのメトリクス] を選択します。メトリクスの検索ボックスに ApiGateway と入力します。検索結果から、[API Gateway]、[ApiId] を選択します。
- API のリストで、API の ID または API 名を使用して指定した API をフィルター処理します。フィルター処理を行った後、IntegrationLatency および Latency にチェックを入れます。
注: API ID と API 名は、API Gateway コンソールから取得します。
- [グラフ化されたメトリクス] タブを開きます。[統計情報] で [最大値] を選択します。[期間] で [1 分] を選択します。グラフの上にある [カスタム] 期間を選択します。クライアントで高い遅延が発生した期間を選択します。
- IntegrationLatency および Latency メトリクスを確認します。これらのメトリクスの値が高くなっている時点の値とタイムスタンプを書き留めます。これらの値が、高遅延の原因を示している場合があります。
メトリクスを比較して高遅延の原因を特定する
リクエスト/応答フローに関連するメトリクスを引き続き確認して、高遅延の原因を特定します。
- API Gatewayの Latency メトリクスをクライアントで発生した全体的な遅延値と比較します。
たとえば、API の Latency メトリクスで Maximum 値がクライアント側の Max Latency とほぼ同値である場合、これらの値により、リクエスト/応答フローの最大遅延は API Gateway がリクエストを処理するのにかかる時間であることが示唆されます。API Gateway の処理時間には、Lambda へのリクエストの送信、Lambda からの応答の待機、クライアントへの応答の送信にかかる時間が含まれます。
- API の IntegrationLatency メトリクスを、Latency メトリクスと比較します。
たとえば、IntegrationLatency メトリクスが Latency メトリクスとほぼ同値である場合、これらの値により、API の遅延の主要因は Lambda に送信されたバックエンドリクエストの応答に時間がかかっていることであることが示唆されます。IntegrationLatency メトリクスは、API Gateway がリクエストを送信してから、API Gateway がバックエンドから応答を受信するまでの時間を示します。
- API の IntegrationLatency メトリクスが Latency メトリクスよりも低い場合、バックエンドの応答時間が短いです。このシナリオでは、API リクエストまたは応答の処理に時間がかかります。
たとえば、API または API Gateway Lambda オーソライザーで設定されたマッピングテンプレートは、どちらも遅延の原因となる可能性があります。
- API の Latency メトリクスがクライアント側で発生した遅延よりも大幅に低い場合、経路が遅延の原因である可能性があります。クライアントと API Gateway の間の経路をレビューし、遅延増加の原因である中間エンドポイントがないかどうかを確認します。
たとえば、プライベート VPN 接続やプロキシによって遅延が発生する可能性があります。
Lambda メトリクスを確認し、IntegrationLatency が高い原因を特定する
最後に、リクエスト/応答フローに関連する Lambda メトリクスに焦点を当て、IntegrationLatency が高くなる原因を特定します。
- Lambda 関数の Duration メトリクスをチェックして、Lambda 関数の実行時間が長くなっているかどうかを確認します。Lambda 関数の実行時間が長くなっている場合は、CloudWatch ログをレビューし、高遅延の原因となっているコードのセクションを特定します。デフォルトでは、Lambda 関数は START、END、REPORT ステートメントを CloudWatch ログに記録します。Lambda 関数コードの各論理セクションにカスタムログステートメントを追加することで、詳細な CloudWatch ログを取得できます。
- クライアントの遅延が高い期間に Duration メトリクスが変化していない場合は、初期化時間が増加したかどうかを判断します。Lambda 関数の初期化時間は、リクエストを処理するための実行環境の設定にかかった時間を指します。API Gateway からのリクエストを処理するには、新しい環境が必要になる場合があります。これは Lambda により設定されます。通常、Lambda 関数ハンドラーの外部にあるコードは、初期化中に実行されます。コードの完了に時間がかかると、クライアントへの全体的な応答時間が遅れる場合があります。
注: 初期化時間は INIT またはコールドスタートと呼ばれます。
- Lambda 関数ログのレポートステートメントを検証し、初期化時間の Duration が増加しているかどうかを確認します。一部のリクエストの初期化時間が長いと、API Gateway の IntegrationLatency メトリクスが増加する可能性があります。
関連情報
HTTP API のメトリクスを使用する
Amazon API Gateway のディメンションとメトリクス
CloudWatch メトリクスを使用して WebSocket API の実行を監視する
CloudWatch コンソールでメトリクスを確認する
Lambda ランタイム環境のライフサイクル