【Terraform】Amazon S3のACLアクセスをTerraformコードで有効化する方法
こんにちは。カナダオフィスの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 が問題なく通り、該当のバケットにもログが収容されるようになった。
で、同じことを 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 の関連記事はコチラ。
読んで頂きありがとうございました。