【新機能】Amazon API Gateway でアクセスログを記録する #reinvent

2017.12.04

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

re:Invent が始まる少し前ですが、 API Gateway がアクセスログの出力に対応しました。

本記事では API Gateway のアクセスログ出力の流れを記録します。

利用するAPIを作成する

アクセスログを出力する目的においては、 API でやることはひとまずなんでも構いません。今回は以下のブログで作成した DynamoDB からデータを取得するAPIを利用します。

APIを作成したら、デプロイしてしまってOKです。 API Gateway のアクセスログは、デプロイした後のステージに対して設定します。

ログ出力用 IAM ロールを設定する

API Gateway が Cloudwatch Logs へ出力するための権限が必要です。これは、 そのリージョンの API Gateway 全体に設定します。

log_arn.png

ここで設定するロールには、AmazonAPIGatewayPushToCloudWatchLogs ポリシーがアタッチされている必要があります。これがアタッチされてないと、設定しても何もログが出力されません。

アクセスログを有効にする

AWSコンソールで、ステージ > アクセスログを設定したいステージ名 > ログのタブ を開きます。アクセスログの設定ができるようになっているので、以下のように設定します。

accesslog_settings.png

  • アクセスログ作成の有効化 にチェック
  • CloudWatch ロググループを指定。すでにあるグループを指定しても良いですし、新しいグループを指定すれば自動で生成してくれます
  • ログの形式は、入力例から自動入力するか、または自分で自由に編集できます。ここで利用できる変数は、API Gateway のコンテキスト変数です
  • 「変更を保存」する

この時点でアクセスログが有効になりました。ちなみに出力先ロググループの変更や、ログ形式の変更のあとに、APIのデプロイをやり直す必要はありません。保存するとただちに変更が適用されます。ですので、アクセスログを AWS Lambda でパースしている場合や、Athena でテーブルを作っている場合などは、形式の変更の影響を考慮してください。

リクエストを送る

この状態でリクエストを送ってみます。

postman_request.png

Cloudwatch Logs を見てみましょう。

cloudwatch_logs.png

アクセスログが出力されていました!

ログに情報を追加してみましょう。サンプルで書き出されるログに対して、UserAgent を出力するように設定してみます。API Gateway のアクセスログ形式で、以下のように userAgent を追加してください。

{
  "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",
  "protocol": "$context.protocol",
  "responseLength": "$context.responseLength",
  "userAgent": "$context.identity.userAgent"
}

CloudWatch Logs で、UserAgent が出力されていることを確認できました。

cloudwatch_add_useragent.png

まとめ

個人的な感想としては、以下のことができるようになるとさらにアクセスログ利用の幅が広がると感じています。

  • リクエスト変数を展開した状態でパスを記録する(今回の例だと{candidateId}です)
  • アクセスログだけではなく実行ログもそうですが、CloudFront や API Gateway S3に直接ログを記録する

ただ、前者に関しては、実行ログにリクエスト変数が展開された状態で保存されるため、 requestId によるアクセスログとの突き合わせが可能なのと、後者に関しては CloudWatch Logs から S3 へエクスポート可能です。あくまで、利便性、コスト低減のためにあったら嬉しいな、というものです。

本記事では API Gateway に追加されたアクセスログ出力機能を使ってみました。これまでは、実行ログをパース・統合してアクセスログのように使うといった工夫が必要でしたが、今回の機能追加により簡単な設定で出力できるようになりました。アクセスログが出力できるとなると、CloudFront や ALB と同様、Athena でのログ解析が真っ先に思いつく用途です。様々なメトリクスで分析が求められる昨今では、まずは何か、アクセスに関する情報をみてみる、といったことができるたけだも大きな進展だと思います。今後は、Athena や ElasticSearch、CloudWatch Alarms といったエコシステムと連携して、サーバーレスアプリケーションに組み込んでいくことを試していきます。

参考