Amazon API Gatewayのレスポンスサイズをモニタリングしてみた

Amazon API Gatewayのアクセスログを有効にすると、出力される$context.responseLengthからレスポンスサイズを取得できます。
2022.01.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon API Gateway(REST)でレスポンスサイズをモニタリングしたい場合、 API Gatewayのアクセスログを有効にし、 Logs Insightsで $context.responseLength をパースしましょう。

レスポンスサイズの分布やレスポンスサイズがペイロード上限に抵触していないことを簡単にモニタリング出来ます。

やってみた

それでは、API Gatewayのレスポンスサイズを取得してみましょう。

1. API Gatewayのアクセスログを有効化

API Gatewayのコンソールにおいて、Stages → Logs/Tracing からアクセスログを有効にします。

レスポンスサイズは $context.responseLength です。

今回は パースしやすいように、JSON形式で出力します。

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

※実際は1行で入力します。

2. アクセスログの出力を確認

CloudWatch Logsのコンソールにおいて、上述のアクセスログ用のロググループにログ出力されていることを確認します。

{
    "requestId": "xxx-xxx-xxx-xxx-xxx",
    "ip": "xx.xx.xx.xx",
    "caller": "-",
    "user": "-",
    "requestTime": "02/Nov/2021:15:22:18 +0000",
    "httpMethod": "GET",
    "resourcePath": "/xxx",
    "status": "200",
    "protocol": "HTTP/1.1",
    "responseLength": "123"
}

3. Logs Insightsで問い合わせ

CloudWatch Logsのコンソールにおいて、Logs Insights からこのロググループに対して、クエリを実行します。 CloudWatchのダッシュボードにウィジェット追加しておきましょう。

例えば、1時間ごとの最大レスポンスサイズ(MB)を取得したい場合のクエリは以下の通りです。

stats
  max(responseLength)/1024 as MaxSizeInKB by bin(1h)

クエリ構文の詳細は、次のドキュメントを参照ください。

ペイロード上限

API Gateway と Lambda を連携する場合、それぞれにペイロード上限があります。

この2つを組み合わせると、サービスのペイロード上限はより小さい Lambda の 6MB です。

ペイロード上限を超えるような処理が必要な場合、S3 操作用の pre-signed URL を発行するといったワークアラウンドをご検討ください。