【AWSのログ管理】CloudFrontのログをAthenaを使って調査してみる
CloudFront標準ログについて
CloudFront標準ログを設定することで、CloudFrontが配信するコンテンツのアクセス情報を記録してくれます。ログには、リクエストの日時、場所、リクエストのサイズ、リクエスト元のIPアドレス、レスポンスのステータスコードなど、さまざまな情報が含まれています。
これらのログは取得するだけではなく、分析することで、CloudFrontの配信の状況や利用者の挙動などを理解することができるようになります。ログの分析により、トラフィックのパターンやボトルネックの特定、セキュリティ上の問題の発見などが可能になります。
今回は、CloudFrontの標準ログをAthenaを使って分析をしてみたいと思います。わかりやすく図にすると以下のような構成になります。
前提
CloudFrontディストリビューションがすでにできている、かつ、標準ログの設定がオフの状態を前提ですすめます。
※今回は、リアルタイムログの設定は行いません。
ログの保存先設定(S3バケット)
S3バケットの作成と注意点
まずは、ログを保存するためのS3バケットを作成します。
S3バケット作成の手順は割愛しますが、
注意点としてS3バケットにACLの有効化が必要になります。
下記のドキュメントに注意事項が記載してあります。
参考:https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#AccessLogsBucketAndFileOwnership
ログの設定(CloudFront)
※CloudFront標準ログの設定が済んでいる場合は、この作業は必要ありません。
1.AWS コンソールにログインし、CloudFrontを選択します。
2.ログを有効化する対象のCloudFrontディストリビューションをクリックします。
3.「一般」タブの中から設定欄の「編集」をクリックします。
4.設定項目の編集
設定項目の下段にある
「標準ログ記録」オンをチェックします。
「S3バケット」ログ保存用に作成したS3バケットを選択します。
「ログプレフィックス」必要があれば記入します。空欄でも構いません。
「cookie ログ記録」オンかオフを選択します。
※オンにするとオリジンに転送する cookie にかかわらず、すべてのリクエストで cookie をログ記録するようになります。
設定項目の入力は以上です。
最下段の「変更を保存」をクリックすると設定は完了です。
※CloudFrontにアクセスがされて、しばらく待つとログが指定したS3バケットに出力し始めます。
ログの形式について
ログは以下のような形で出力されます。
2023-05-14 22:46:59 NRT57-P1 299 2400:****:****:****:****:****:**** GET 123456789012.cloudfront.net / 304 - Mozilla/5.0%20(Macintosh;) - - Hit TRGOI1of2Ccb8vr0NBsaosycS6iQ== 123456789012.cloudfront.net https 28 0.000 - TLSv1.3 TLS_AES_128_GCM_SHA256 Hit HTTP/2.0 - - 60149 0.000 Hit - - - -
ログ形式については、こちらを参考にしてください。
参考:AWSドキュメント
Athenaの設定
CloudFrontのログを調査できるように、Athenaを設定していきます。
1.AWS コンソールにログインし、Athenaを選択します。
2.「クエリエディタを起動」をクリック。
3.クエリ結果の保存設定
初めてAthenaを利用する場合、画像にあるような注意事項が表示され、クエリエディタからクエリを実行することができません。
Athenaのクエリ結果を保存するためのS3バケット設定が必要になります。
予めS3バケットの用意がある場合はそのまま「設定を編集」をクリックして設定にすすみます。
S3バケットの用意が無い場合は、S3バケットを新たに作成してから画像にある「設定を編集」にすすみます。
「設定を編集」をクリック後、いくつか入力項目があります。
「クエリ」結果の場所にS3バケット名を指定します。
他の設定は適宜指定をしてください。後で変更することもできます。
「保存」をクリックするとクエリが実行できるようになります。
4.データベースの設定
Athena内にCloudFrontを分析するためのデータベースを作成します。
データベース名はわかりやすいように「cloudfrontlogs」としてます。
クエリエディタ画面に下記のコードをペーストして「実行」します。
CREATE DATABASE cloudfrontlogs;
コマンドが正常に実行できれば、データベース欄のプルダウンメニューに作成したデータベース「cloudfrontlogs」が表示されます。
5.テーブル作成
続いてテーブルを作成します。
テーブル作成用のコマンドはAWSドキュメントに記載のコマンドを参考にして実行します。
参考:AWSドキュメント
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudfront-logs.html
下から2行目、「LOCATION」部分の編集が必要です。CloudFront標準ログ用に作成したS3バケットを指定します。
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfrontlogs.cloudfront_logs (
`date` DATE,
time STRING,
location STRING,
bytes BIGINT,
request_ip STRING,
method STRING,
host STRING,
uri STRING,
status INT,
referrer STRING,
user_agent STRING,
query_string STRING,
cookie STRING,
result_type STRING,
request_id STRING,
host_header STRING,
request_protocol STRING,
request_bytes BIGINT,
time_taken FLOAT,
xforwarded_for STRING,
ssl_protocol STRING,
ssl_cipher STRING,
response_result_type STRING,
http_version STRING,
fle_status STRING,
fle_encrypted_fields INT,
c_port INT,
time_to_first_byte FLOAT,
x_edge_detailed_result_type STRING,
sc_content_type STRING,
sc_content_len BIGINT,
sc_range_start BIGINT,
sc_range_end BIGINT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://<CloudFront用に作成したバケット名を指定>'
TBLPROPERTIES ( 'skip.header.line.count'='2' )
コマンドが成功すると、左側画面のテーブル欄に「cloudfront_logs」テーブルが表示されるようになります。
これで準備は終了です。
ログを調査する
ログにたいしてクエリを実行できるようになりました。まずは、データが入っているか確認します。
クエリエディタ画面に下記のコマンドをペーストして「実行」します。
うまくいけば、10件のログが出力されます。
SELECT * FROM "cloudfront_logs" limit 10;
参考までにいくつか一般的なクエリを紹介します。
特定の期間のログをクエリする。
SELECT *
FROM cloudfront_logs
WHERE "date" BETWEEN DATE '2023-05-14' AND DATE '2023-05-15';
特定の期間においてステータスコードの集計をする。
SELECT status, COUNT(*) AS num
FROM cloudfront_logs
WHERE "date" BETWEEN DATE '2023-05-14' AND DATE '2023-05-15'
GROUP BY status;
このようにAthenaを使えば簡単にログの分析をすることができるようになります。
まとめ
CloudFrontの標準ログを有効にすることで、アクセスに関する情報を収集することができます。万が一ネットワーク攻撃を受けた際の分析、ネットワーク疎通に関する問題解析などに利用することができます。
ぜひ有効化したいものですね。