Blog

TerraformでCloudFrontの標準ログv2を設定する

こんにちは。会員システムグループでエンジニアをしている山田です。

昨年末、CloudFrontの標準ログに待望のアップデートが入りました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-cloudfront-log-formats-destinations-access/

今までの標準ログはレガシーな仕様を抱えており、特にすべてのログが同じパスに出力されてしまうという点が問題になっていました。Athenaでの検索などのために、ログを日付別パーティションに移動させるLambdaを動かしている方も多かったのではないでしょうか。

今回のアップデートにより

  • S3の出力先パスに日付・時間を含めることが可能に
  • JSONなどのフォーマットをサポート、カラムの取捨選択も可能に
  • S3バケットポリシーに対応

など、今まで困っていた部分が解消されるようになります。さらにCloudWatch LogsやFirehoseへの出力もできるようになりました。

そして最近になってこの標準ログv2はTerraformでも設定できるようになりました。まだTerraformでの設定方法を解説した記事は少なそうですので、紹介したいと思います。

前提知識

まず大前提として、実はこの標準ログv2、CloudFrontに設定する機能ではありません

これは公式ドキュメントのAWS CLIでの設定方法を見るとわかるのですが、CloudWatch Logs Delivery(v2)という汎用的なCloudWatchのログ配信機能になっています。これにCloudFrontが対応したというのが実際のようです。

登場するリソースは以下の3つです。

  • DeliverySource
  • DeliveryDestination
  • Delivery

これらの関係性は以下のようになっています。

ログ出力元(DeliverySource)とログ出力先(DeliveryDestination)を作った後、これらをつなぐDeliveryを作成するとログが送られるようになります。DeliverySourceにCloudFront、DeliveryDestinationにS3を設定することで従来の標準ログを代替できます。

Terraformでもこれらのリソースを作成していくことになります。

Terraformでの実装例

従来と同様、S3へ送る設定を紹介します。

Terraform AWS Providerはv5.89.0以上が必要です。作成できるようになったのはv5.83.0ですが、apply後に状態不一致(tainted)となる複数のバグが修正されています。

S3の許可設定

S3の許可設定はバケットポリシーを設定します。もうACLを使う必要はありません。

delivery.logs.amazonaws.comをprincipalとし、S3オブジェクトに対する許可設定を行います。上記設定ではアカウント内の全てのDeliverySourceからの操作を許可していますが、厳密にはDeliverySourceを作成後、そのARNを指定するとよいでしょう。

Log Deliveryの作成

次に本命となるLog Deliveryです。AWSコンソール上で以下のように設定する値がどこに入るのかを見ていきます。

なおLog Delivery関連リソースはいずれもus-east-1で作る必要がある点に注意してください。送信先S3バケットは別リージョンでも問題ありません。

まずはDeliverySourceとDeliveryDestinationを作成し、CloudFrontとS3を指定します。

DeliveryDestinationではフォーマットや出力先パスを指定でき、日付別パスなどの設定ができます。後述しますが、destination_resource_arnにパス部分を書かない場合、Deliveryの設定に影響するので注意してください。

最後にDeliveryを作ることで完成です。

suffix_pathはDeliveryDestinationで設定したdestination_resource_arnの後に続くパスになります。ここの指定が厄介で、destination_resource_arnの値によって実際の設定値が変わります。

  • パスを指定した場合
    • 指定したsuffix_pathがそのまま使われる
  • パスを指定しなかった場合
    • 指定したsuffix_pathの先頭にAWSLogs/{account-id}/CloudFront/が追加される

このあたりの仕様はややこしいため、公式ドキュメントに載っているパスの設定例を参照することをおすすめします。

注意

標準ログ(legacy)について

標準ログv2は従来の標準ログ(legacy)とは独立した機能です。v2用の設定を追加しただけだと二重出力になってしまうため、無効化を忘れないようにしましょう。

AWSコンソール上から操作した場合

AWSコンソール上から標準ログv2を作成した場合、その裏で先述の3リソースが作成されます。このうちDeliverySourceはログを無効化しても消えず、残り続けます。1つのリソースに対してDeliverySourceは1つしか作成できないため、残っているとTerraformからの作成も失敗します。

AWSコンソール上からは削除する手段がないため、AWS CLIから削除してください。

まとめ

TerraformでのCloudFront 標準ログv2の設定方法をご紹介しました。

標準ログv2の登場により、CloudFrontのログ周りの辛さが一気に解消されるようになります。S3に送信する上では料金も変わらないため、積極的に移行をおすすめしたい機能です。

また実体となるCloudWatch Log Delivery(v2)はCloudFrontに限らない汎用的な仕組みになっており、他サービスへ展開していくことが期待されます。ALBのログなども対応すればより自由な設定が可能になるため、今後の展開に期待したいところです。

本記事が皆様の良きTerraformライフの一助になれば幸いです。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!