API Gateway のログとクライアントのログから同一のリクエストであることを確認する方法を教えてください

困っていた内容

クライアントから API Gateway へリクエストした際のログを確認しています。
しかし、クライアント側のログと API Gateway 側のログが多くて、ログの突き合わせが困難です。
良い方法はありますでしょうか?

どう対応すればいいの?

クライアント側と API Gateway のログのリクエスト IDを確認してください。
リクエスト ID が同じログが、同一のリクエストです。

確認してみた

以下のチュートリアルの API Gateway を作成しておきます。

デフォルトでは、API Gateway の実行ログやアクセスログは CloudWatch Logs には出力されないので、以下のコンソールで出力されるように設定しておきます。

では、ローカルマシンから API Gateway のデフォルトエンドポイントへ curl でリクエストを送ってみます。

  • クライアント側ログ
$ curl -i https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/
HTTP/2 200
date: Thu, 17 Feb 2022 07:09:43 GMT
content-type: text/html
content-length: 1310
x-amzn-requestid: 51f3d508-2067-4417-9b34-25f40e77c186
x-amz-apigw-id: NrXXXXXXXXXX

x-amzn-requestid の箇所が、API Gateway からクライアントへレスポンスされたリクエスト ID です。

一方で、API Gateway のアクセスログを CloudWatch Logs で確認してみます。

  • API Gateway のアクセスログ
{
    "requestId": "51f3d508-2067-4417-9b34-25f40e77c186",
    "ip": "1xx.xxx.xx.x",
    "caller": "-",
    "user": "-",
    "requestTime": "17/Feb/2022:07:09:43 +0000",
    "httpMethod": "GET",
    "resourcePath": "/",
    "status": "200",
    "protocol": "HTTP/1.1",
    "responseLength": "1310"
}

アクセスログの方は、requestId  というキーの値に、クライアント側のリクエスト ID と同一の値が含まれていました。

最後に、実行ログも確認します。

  • API Gateway の実行ログ
timestamp,message
1645081783588,(51f3d508-2067-4417-9b34-25f40e77c186) Extended Request Id: NrXXXXXXXXXX
1645081783589,(51f3d508-2067-4417-9b34-25f40e77c186) Verifying Usage Plan for request: 51f3d508-2067-4417-9b34-25f40e77c186. API Key:  API Stage: xxxxxxxxx/Prod
1645081783589,(51f3d508-2067-4417-9b34-25f40e77c186) API Key  authorized because method 'GET /' does not require API Key. Request will not contribute to throttle or quota limits
1645081783589,(51f3d508-2067-4417-9b34-25f40e77c186) Usage Plan check succeeded for API Key  and API Stage 71v0bdh4bk/Prod
1645081783590,(51f3d508-2067-4417-9b34-25f40e77c186) Starting execution for request: 51f3d508-2067-4417-9b34-25f40e77c186
1645081783590,"(51f3d508-2067-4417-9b34-25f40e77c186) HTTP Method: GET, Resource Path: /"
1645081783590,(51f3d508-2067-4417-9b34-25f40e77c186) Successfully completed execution
1645081783590,(51f3d508-2067-4417-9b34-25f40e77c186) Method completed with status: 200

実行ログは、タイムスタンプ毎のイベントに対してリクエスト ID が付与されていることがわかります。

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

API の運用で、ログを確認する際に混乱することがあるかと思います。
例として以下のようなケースが考えられます。

  • API Gateway 側のアクセスログにはログが記録されているが、クライアントへレスポンスされていないように見受けられ、事実確認が困難
  • クライアント側で複数の API と連携しており、どの API と疎通したか不明

こういったケースで、接続元と接続先のログのリクエスト ID を突き合わせて、疎通の有無の事実確認を行うことで調査効率がアップするので、試してみてください。
また上記のケースのように問題が起きた際にすぐに調査ができるように、ログの出力は開発段階から考えておくと良いでしょう。

参考資料