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 を突き合わせて、疎通の有無の事実確認を行うことで調査効率がアップするので、試してみてください。
また上記のケースのように問題が起きた際にすぐに調査ができるように、ログの出力は開発段階から考えておくと良いでしょう。