【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【Terraform】Amazon S3のACLアクセスをTerraformコードで有効化する方法

Terraform x AWS

こんにちは。カナダオフィスのTKです。今年のカナダは暖冬で、クリスマスに雨が降るという僕のカナダ生活史上初の経験を迎えました(いつもは雪)。

さて、今回は僕が Terraform で AWS のサーバー構築をしていたなかで、解決に苦労したエラーと、その解決方法について簡単にまとめたいと思います。

なお、本記事はすでに Terraform を使っている人向けの内容になるので、ツールの紹介など前提は省かせてもらいます。

課題

CloudFront およびそのログを収容する S3 の設定をしていたところ、plan時にはエラーは出ないものの、apply時に以下のようなエラーが発生した。


│ Error: creating CloudFront Distribution: InvalidArgument: The S3 bucket that you specified for CloudFront logs does not enable ACL access: XXX-log-bucket.s3.amazonaws.com
│ status code: 400, request id: XXXXXXXXXXXXXX
│
│ with XXXXX.aws_cloudfront_distribution.cf_distribution,
│ on XXX/cloudfront.tf line XX, in resource "aws_cloudfront_distribution" "cf_distribution":
│ ........

CloudFront からS3バケットへのログの書き込みに対する、ACLアクセスが有効になっていないとのこと。
これは2023年4月から、Amazon S3 の新しいデフォルトセキュリティ設定として、S3 パブリックアクセスブロックが有効(ACL無効)になっていることが原因。
◎ 参照:https://zenn.dev/devcamp/articles/39ce7fd0272926

ということで、試しにAWSのコンソール上で、直接対象のS3バケットにて ACL を有効にしてみたら、たしかに apply が問題なく通り、該当のバケットにもログが収容されるようになった。

aws_acl

で、同じことを Terraform のコードで実施したいのだけど、調べても Terraform での表記方法が出てこず、ChatGPT先生に聞いてみても、要領を得ない答えしか返ってこなかったため途方に暮れていた。

解決方法

色々調べて試していく中で、先ほどのリンクにある「ObjectOwnership が BucketOwnerEnforced に」という部分に該当する Terraform の記述を調べたところ、それに該当っぽいするものが見つかった。
◎ 参照:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_ownership_controls

さっそくこれを S3 の設定ファイルに追記してみる。

// ログ用バケット オブジェクト所有者設定 ACL有効化
resource "aws_s3_bucket_ownership_controls" "log_ownership_controls" {
  bucket = aws_s3_bucket.log.id

  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

内容としては、rule の object_ownership が指定しない限り「BucketOwnerEnforced(ACL無効)」なので、これを「BucketOwnerPreferred」と明示的に指定している。

すると apply が問題なく通り、対象のS3バケットの ACL が有効になり、該当のバケットにもログが収容されるようになった。


以上、Terraform で AWS のACLアクセスを有効化する方法でした。

やることとしてはかなり単純ですが、正しい情報に辿り着くまでに時間がかかったので、もし同じ状況で悩んでる人がいたらこの記事が助けになると幸いです。

当ブログの Terraform の関連記事はコチラ

読んで頂きありがとうございました。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
6
読み込み中...
6 票, 平均: 1.00 / 16
1,236
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

TK

システムソリューション部所属、カナダオフィス勤務のエンジニア。
明太子が恋しいカナダ6年目。