リアルタイムログ出力をサポートしたCloudFrontを試してみた
AWSチームのすずきです。
Amazon CloudFront、リアルタイムなアクセスログ出力をサポートするアップデートがありました。
Amazon CloudFront announces real-time logs
Kinesis Data Streams へのログ出力設定と、アクセスログが参照可能になるまでのタイムラグを確認する機会がありましたので、紹介させていただきます。
AWS設定
Kinesis
バージニア(us-east-1)リージョンに、Kinesis Data Stream を設置しました。
今回、シャード数は「1」で設定しました。
ログが発生量が多くスロットルが発生する場合には、シャード数を適量まで追加してご利用ください。
CloudFront
CloudFrontダッシュボードに「Logs」が追加されました。
「Real-time log configurations」の「Create Configuration」より、設定を行いました。
アクセスログの出力内容について設定します。
アクセスログは生成量を抑制する指定が可能です。
- サンプリングレート : 1~100%
- 不要なフィールドの除外
- ログ出力対象とする Distributor、Behavior の指定
確認
Firehose
アクセスログ出力先とした データストリームに、Kinesis Data Firehose を設定しました。
Firehose の配信ストリーム設定、ソースを「Kinesis Data Stream」、出力先はS3と設定しました。
Firehoseの出力先としたS3より、S3 Selectを利用してCloudFrontのアクセスログを確認する事ができました。
CLI
AWS CLIを利用して、Kinesis Data Stream に配信された CloudFrontのアクセスログの確認を行いました。
StreamName=aaa TMP1=`aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type LATEST --stream-name ${StreamName}` ShardIterator=`echo ${TMP1} | jq -r .ShardIterator` TMP2=`aws kinesis get-records --shard-iterator ${ShardIterator}` TMP3=`date`
CloudFrontのアクセスログ、発生から数秒程度のタイムラグで確認することができました。
- CloudFrontログのタイムスタンプ
$ date -d @`echo ${TMP2} | jq -r .Records[].Data | tail -1 | base64 -d | cut -f 1` Tue Sep 1 03:50:52 UTC 2020
-
Kinesis Data Stream に登録された時刻
$ echo ${TMP2} | jq -r .Records[].ApproximateArrivalTimestamp | tail -1 2020-09-01T03:50:55.761000+00:00
-
CLIの処理完了時刻
$ echo ${TMP3} Tue Sep 1 03:50:56 UTC 2020
まとめ
CloudFront 標準で S3 へのアクセスログ出力 や、アクセス数などのレポート機能を備えていますが、 出力されるまでのタイムラグや、解析にAthenaを利用する場合、パーティション利用が難しいなどの課題がありました。
今回 CloudFront のアップデートにより、Kinesis ファミリー(Firehose、Analytics)や、Lambda、Elasticsearch Service などを利用したリアルタイムなアクセスログ処理が実現可能になりました。
大規模なイベントなどでCloudFrontを配信基盤として採用し、その稼働状況についてリアルタイムな把握が望まれる場合、今回のアップデートをお試しください。