【Terraform】CloudFrontのログ用S3はACLを有効にしておく必要がある

エラー

 

TerraformでCloudFrontを構築したときに、アクセスログ用S3バケットを作成しました。

その過程でACL関係のエラーが出たため、記事に残しておきます。

 

ゴール

 

Terraformを使用して、CloudFrontのアクセスログをS3バケットに保存するようにしたい

 

現在のCloudFrontとS3の定義

 

アクセスログ周りの設定のみ抜粋しています

 

エラーの内容を確認

 

terraform applyしたところ、以下のエラーが出ました。

 

DeepLさんに翻訳してもらうと

InvalidArgument(無効な引数)です: CloudFrontのログに指定したS3バケットがACLアクセスを有効にしていない

ということらしい。

S3バケットのACLを有効にしないといけない??

 

もう少し深く調べてみる

 

標準ログ (アクセスログ) の設定および使用 - Amazon CloudFront
ログファイルを使用してオブジェクトに対するユーザーリクエストに関する情報を取得します。

こちらのAWS ドキュメントをみても、

2023 年 4 月以降、CloudFront 標準ログに使用される新しい S3 バケットの S3 アクセスコントロールリスト (ACL) を有効にする必要があります。

とありますね。

 

ACLの種類は下記を参照ください

アクセスコントロールリスト (ACL) の概要 - Amazon Simple Storage Service
Amazon S3 のアクセスコントロールリスト (ACL) では、バケットとオブジェクトへのアクセスを管理できます。各バケットとオブジェクトには、サブリソースとして ACL がアタッチされています。これにより、アクセスが許可される AWS アカウントまたはグループと、アクセスの種類が定義されます。リソースに対するリク...

 

外部のユーザーがアクセスログを見る機会は今回考えないので、
private のACLを設定していきます。

 

ソースコード修正

 

Terraformのドキュメント内にprivate ACLのサンプルコードがあったので、そのまま使います

Terraform Registry

 

ログ格納用S3バケットを下記のように定義します。

 

これで無事にterraform applyが通ったので、動作確認をしていきます。

 

動作確認

 

CloudFrontのドメインにアクセスし、ログ格納用のS3バケットを確認してみると。。。

 

こんな感じでアクセスログが保存されていると思います。

 

ちなみに、ファイルの中身はこんな感じ。

 

 

参考

 

CloudFrontのアクセスログ保存用S3バケットにはACL有効化が必要なので注意しよう | DevelopersIO
ACL無効化を設定したS3バケットは(2021/12/17時点では)CloudFrontのアクセスログ出力先として指定することができません。設定しようとするとエラーとなってしまいます。ACLが有効なS3バケットを指定しましょう。

 

コメント

タイトルとURLをコピーしました