API Gateway のレイテンシを算出する方法を教えてください

この記事はアノテーション株式会社 AWS Technical Support Advent Calendar 2021 のカレンダー | Advent Calendar 2021 - Qiita 16 日目の記事です。

困っていた内容

クライアントからバックエンドのサーバに API Gateway 経由でアクセスする場合に、レスポンスが遅いとの報告をユーザより受けています。
そのため、クライアントから API Gateway 経由でレスポンスが返ってくる際の実際の処理時間(レイテンシ)を計測して、API Gateway による問題なのか原因を特定したいです。
API Gateway のレイテンシを算出する方法を教えてください。

どう対応すればいいの?

API Gateway のアクセスログで、 $context.responseLatency から $context.integrationLatency の差をとることで算出ができます。

responseLatency と integrationLatency の違い

パラメータの違いは以下の通りです。

  • $context.responseLatency
    • API Gateway がリクエストをバックエンドへ中継してから、API Gateway の統合レスポンスがレスポンスを受け取る直前までにかかった時間
  • $context.integrationLatency
    • API Gateway がクライアントからリクエストを受け取ってから 、クライアントへレスポンスを返却する直前までにかかった時間

※なお、$context.integration.latency は、$context.integrationLatency と同等のパラメータですので、以下省略します。

違いを図示すると以下の通りです。

設定方法

$context.responseLatency と $context.integrationLatency をログとして出力できるように API Gateway のアクセスログに設定します。
また、$context.integration.latency と $context.integrationLatency が同値になることを確かめるために、両方とも設定しました。

{
    "requestId": "$context.requestId",
    "integration-latency": "$context.integration.latency",
    "integrationLatency": "$context.integrationLatency",
    "responselatency": "$context.responseLatency"
}

以下のように CloudWatch Logs に出力されます。

{
    "requestId": "19xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
    "integration-latency": "7",
    "integrationLatency": "7",
    "responselatency": "14"
}

上記出力結果の responselatency と integrationLatency の差分をとることで API Gateway の処理時間を算出できます。

API Gateway のレイテンシ算出

以下の式で、API Gateway のレイテンシが算出できます。

$context.responseLatency の結果 (14ms) - $context.integrationLatenbcy の結果 (7ms) = API Gateway のレイテンシ (7 ms)

今回の例では、API Gateway で 7ms、バックエンドで 7ms のレイテンシが発生しています。

運用観点でのワンポイント

今回は理想的な API を利用した検証でしたので、極端にバックエンドのレスポンスが遅すぎるなどのパフォーマンス低下は見られませんでした。
一方で、ユーザの API 利用で遅延が発生した際の調査の足がかりとして、アクセスログに responselatency と integrationLatency を出力するように備えておくことをおすすめします。

参考資料