BLOG

2019/11/21

API Gateway のアクセスログを Kinesis Data Firehose と連携させる

【目次】
1. はじめに
2. API Gateway とは
3. Kinesis Data Firehose とは
4. API Gateway を準備する
5. Kinesis Data Firehose と連携する
6. おわりに

1. はじめに
2019/10/16 AWS からAmazon API Gateway が Amazon Kinesis Data Firehose へのアクセスログ記録をサポート開始がリリースされました。今回はこの機能を使用して実際にアクセスログを取得してみます。

2. API Gateway とは
まずは API Gateway とは何かを確認しましょう。
公式情報は以下となります。
https://aws.amazon.com/jp/api-gateway/
https://aws.amazon.com/jp/api-gateway/features/

簡単に API の作成、配布、保守、監視、保護が行えて、REST API および WebSocket API の「玄関」として機能します。AWS 環境ではない外部との連携も可能なので、まさに API の Gateway を作ることができます。

3. Kinesis Data Firehose とは
WafCharm をご利用のユーザー様は設定いただいたことがあるかと思いますが、WafCharm では「レポート機能/通知機能」で利用しています。
公式情報は以下となります。
https://aws.amazon.com/jp/kinesis/data-firehose/
https://aws.amazon.com/jp/kinesis/data-firehose/features/

機能としてはほぼリアルタイムにストリーミングデータをデータストアや分析ツールにロードすることができるものとなります。Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Kinesis Data Analytics、Splunk にロードできます。

4. API Gateway を準備する

今回の確認では API は重要ではないので Lambda に連携させるだけの簡単なものを用意します。

こちらを参考にさせていただきました。
https://qiita.com/tamura_CD/items/46ba8a2f3bfd5484843f

5. Kinesis Data Firehose と連携する
今回はアクセスログを Kinesis Data Firehose に連携させて S3 に出力するように設定していきます。

公式情報を見て設定していきます。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-logging-to-kinesis.html

まずは Kinesis Data Firehose の準備です。
コンソールにログイン後 Kinesis Data Firehose の画面を開きます。
「Create delivery stream」を押下します。

次に「Delivery stream name」を入力します。API Gateway と連携するには名前にルールがあるので注意が必要です。
「amazon-apigateway-{your-delivery-stream-name}」で入力します。
そのほかはデフォルトで進みます。

次のページもデフォルトで進みます。

次のページでは Kinesis Data Firehose の連携先を選択します。
今回は S3 に出力したいので S3 を選択します。

S3 bucket の選択があるので、「Create new」で作成します。
その他は何も入力せずに進みます。

※既存の S3 bucket を使用する際はプルダウンより選択して指定します。

次のページで Buffer size / Buffer interval の指定ができます。
今回はテストなので最小値 1MB / 60seconds に変更します。
S3の使用料をできるだけ下げるため S3 compression で GZIP を選択します。

画面下部にて IAM roleを新規作成で作ります。
※今回新規作成でついた権限は以下のサービスでした。
・CloudWatch Logs
・Glue
・Kinesis
・Lambda
・S3

あとは最後まで進めて Kinesis Data Firehose の設定は終わりです。
では、 API Gateway に紐付けを行いましょう。

まず、対象の API Gateway を選択して「ステージ」を押下します。「ログ/トレース」内の「カスタムアクセスのログ記録」 の 「アクセスログの作成の有効化」 を選択します。
続いて、[Access Log Destination ARN (アクセスログの送信先 ARN)] に Kinesis Data Firehose 配信ストリームの ARNを入力します。ARN 形式は次のとおりです。arn:aws:firehose:{region}:{account-id}:deliverystream:amazon-apigateway-{your-delivery-stream-name}
※対象の Kinesis Data Firehose の「 Delivery stream ARN 」の情報で問題ないです。

最後に[ログの形式] にログの形式を入力します。[CLF]、[JSON]、[XML]、[CSV] から選択して使用できます。

設定が終われば S3 にファイルができます。
作成されるタイミングは Kinesis Data Firehose で設定した Buffer size / Buffer interval に依存します。

CLFのデフォルトログは以下のような型式でした。
見覚えのあるアクセスログと同じでとても見やすいです。

実際のログ
153.156.XXX.XXX – – [01/Nov/2019:02:XX:XX +0000] “GET /hello HTTP/1.1” 200 32 bb0afe31-edba-46a7-97c1-XXXXXXXXXXXX

フォーマット
$context.identity.sourceIp $context.identity.caller $context.identity.user [$context.requestTime] “$context.httpMethod $context.resourcePath $context.protocol” $context.status $context.responseLength $context.requestId

※フォーマットはカスタマイズ可能です。変数リストは公式ページをご確認ください。( $context.requestId は必須で外せませんでした。)

おわりに

Kinesis Data Firehose を利用することで、ログの収集がとても便利になりました。API の分析など様々な使用方法が考えられます。 WafCharmではアクセスログを解析していますが、現状 API のアクセスログには対応していないので検討していきたいと思います。