API Gateway(REST API)の実行ログとアクセスログを確認する方法を教えてください

2023.10.30

困っていた内容

API Gateway(REST API)の実行ログとアクセスログを確認したいのですが、どうしたらよいでしょうか?

どう対応すればいいの?

CloudWatch Logs ロググループからご確認ください。
なお、アクセスログは Kinesis Data Firehose に送信することもできますが、本ブログでは CloudWatch Logs ロググループへの送信を扱います。
それぞれのロググループ名は以下のとおりです。

実行ログ:API-Gateway-Execution-Logs_{APIのID}/{ステージ名}
アクセスログ:設定で指定したロググループ名

なお、それぞれのログは事前に有効化する必要があります。
ログの設定は、以下のとおりステージから編集できます。

有効化するには以下のように設定し、保存します。

実行ログにはログレベルがありますが、今回は「リクエストとレスポンスの完全なログ」を選択しています。

API Gateway での CloudWatch による REST API のログの設定 - Amazon API Gateway

[Full Request and Response Logs] (リクエストとレスポンスの完全なログ) は API のトラブルシューティングに役立ちますが、機密データが記録される可能性があります。本稼働用 API には、[Full Request and Response Logs] (リクエストとレスポンスの完全なログ) を有効にしないことをお勧めします。

アクセスログの送信先 ARN に指定したロググループが、アクセスログが送信されるロググループです。
アクセスログの形式には以下のような内容を設定できますが、必要に応じて修正します。

{
  "requestId": "$context.requestId",
  "ip": "$context.identity.sourceIp",
  "caller": "$context.identity.caller",
  "user": "$context.identity.user",
  "requestTime": "$context.requestTime",
  "httpMethod": "$context.httpMethod",
  "resourcePath": "$context.resourcePath",
  "status": "$context.status",
  "errorMessage": "$context.error.message",
  "protocol": "$context.protocol",
  "responseLength": "$context.responseLength"
}

2023.10.29時点では上記の形式で保存するとAccess Log format must be single line, new line character is allowed only at end of the format:...というエラーが発生しましたので、以下のようにで 1 行にまとめて保存しましょう。

{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user","requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","resourcePath":"$context.resourcePath", "status":"$context.status", "errorMessage": "$context.error.message", "protocol":"$context.protocol", "responseLength":"$context.responseLength" }

設定している $context 変数の詳細や、その他追加できる $context 変数については以下ドキュメントをご確認ください。

API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス - Amazon API Gateway

また、API Gateway の設定でログに書き込む権限を持つ IAM ロールを設定する必要がありますので、ご注意ください。

API Gateway での CloudWatch による REST API のログの設定 - Amazon API Gateway

CloudWatch Logs を有効にするには、API Gateway の CloudWatch に対するログの読み取りと書き込みのアクセス許可をアカウントに付与する必要があります。この AmazonAPIGatewayPushToCloudWatchLogs 管理ポリシー (ARN が arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs) には、すべての必要なアクセス権限があります。

上記の各設定が完了後、該当 API へリクエストを行えば、CloudWatch Logs ロググループから実行ログ・アクセスログが確認できます。
なお、ログ設定の更新だけであれば、設定反映のために API のデプロイは必要ありません。

API Gateway での CloudWatch による REST API のログの設定 - Amazon API Gateway

ステージ設定、ログ、またはステージ変数を更新するときに API を再デプロイする必要はありません。

参考資料

API Gateway での CloudWatch による REST API のログの設定 - Amazon API Gateway

API Gateway マッピングテンプレートとアクセスのログ記録の変数リファレンス - Amazon API Gateway

API コールのログの Kinesis Data Firehose への記録 - Amazon API Gateway

API Gateway のアクセスログを Kinesis 経由で S3 に保管してみた | DevelopersIO