こんにちは、今日もブログを書きます。今日はCloudfront のログを分析したいなーと思ったのですが、そういえばログの出力してなかったことを思い出したので、今回その設定をしてみます。
環境について
今回の構成図です。

あんまり構成図という構成図ではないですが、一般的なCloudFront + S3 でサイトを配信しています。
そして、S3 ログにCloudfront のログを出力して、そのログをAthena で分析するといった形になります。
背景
最初はS3 select のサービスがあったと思っていたので、それを使って分析をしようと思ったところ、いつの間にかS3 select が使えなくなっていました。
それでもS3 + Cloudfront を使っているとEC2 みたいにログを保管するといったことが難しいので、S3 を別で作成して、それを分析してみようということになりました。WAF などが前段にあったら、意図せぬ攻撃などを検知するためにもこの分析は大事だったりします。
ということで、代わりにAthena を使って分析してみましょうということになりました。
まずは、Cloudfront のログの出力設定をしていきましょう。
Cloudfront のログ出力設定をしてみよう
ログ出力の設定をしていきましょう
Cloudfront logging 個所を見つける

まずは、対象のディストリビューションを押下して、Logging を探しましょう!
標準ログ送信先

この後の設定でここに対象のバケットが表示されるようになります。
ログフィールド設定
S3 バケットを選択すると、ログとして出力するフィールドも必要なので、精査していきます。これが恐らくデフォルトの設定です。

あまり多すぎても不要なフィールドが出てくるので、後でもう一度精査する必要はありますが、とりあえずこれくらいをいれておけば、少しはApache などのログ出力に似てきます。

ログの詳しい内容はほかのブログで記載できればと思いますので、ここは一旦省きます。
S3 ログ設定完了

これで、このバケットにログが出力されるようになるはずです。もしかすると出力されるまでに少し時間がかかるかもしれませんが、少し気長にお待ちください。
ここまできたら、ようやくAthena の出番です。
athena の設定をしていこう
まずは、Athena の画面を開くと、エディタ画面が出てきます

その上の方に、設定とあるので、ここでクエリ出力の結果を保存するバケットの設定をしてあげます。
クエリ結果保存バケット設定
ここに対象のバケットとprefix があれば、指定してください。

DB 作成
MySQL などと同様データを格納するための、DB が必要なので、適当な名称で作成していきます。
create database cloudfront_access_logs;
そうするとdatabase が作成したものが指定されます。

この流れ的に次はTable ですね。
table 作成
とてもtable を作成するのが面倒だったので、gemini に作成してもらいました。
CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_access_logs (
date STRING,
time STRING,
c_ip STRING,
sc_bytes BIGINT,
cs_method STRING,
cs_Host STRING,
cs_Referer STRING,
cs_User_Agent STRING,
cs_uri_query STRING,
cs_bytes BIGINT,
time_taken DOUBLE,
x_forwarded_for STRING,
sc_content_len BIGINT,
time_to_first_byte DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://<your-bucket-name>' -- ここにCloudFrontログが保存されているS3のパスを指定してください
TBLPROPERTIES ('skip.header.line.count'='0', 'compression.type'='gzip');

これでtable も作成できました。これで、table が作成できたので、S3 からのデータは入ってるはずなので、SQL で取得してみましょう。
SQL を実行してみる
とりあえず全件取得してみましょう。あまり賢いやり方ではないです。
select * from cloudfront_access_logs;
これで出力されたログが表示されていればオッケーです。IP などがばれてしまう関係上ここでの記載は割愛しますが、ログが出力されていなければ、バケットにログがない場合があるので、確認してみてください。
実行時間は??
実行時間などは、最近のクエリで保存してあるので、どんなクエリを実行したのか、どれくらいかかったのかを確かめることができます。

あとは、SQL を変えていくことによって、データでどんな操作をしたいかによって、色んな情報を得ることができます。
まとめ
インフラエンジニアだからといって、SQL が全く勉強したことないとかであれば、少し慣れるまでに時間がかかるかもしれませんが、これを機にSQL でどんな操作ができるのかも勉強するきっかけになりそうですね。
Cloudfront でアクセスを受けた場合のアクセスログ集計などはサーバーには出ない可能性もあるので、ログを出力して、Athena で分析することによって、色んなデータがわかりそうですね。Athena は読み込んだデータ量によって、料金が発生することになるので、その場合は気を付けて実行してみてください。
料金かかるのが怖いということであれば、ローカルに落として、php やシェルスクリプトを使って集計してみるのもありかもしれませんね。ということで、皆さんもAthena を使って、ほしいデータを出力してみてください!!!
コメント