TerraformでS3のオブジェクトACLを無効にする

2022.07.07

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、「TerraformでS3のオブジェクトACLを無効にする」方法をご紹介しようと思います。

3行でまとめる

  • local-execではないよ
  • aws_s3_bucket_ownership_controlsリソースだよ
  • どんどん活用していこう!

S3のオブジェクトACLとは

S3のオブジェクトACLとは、S3バケットに保存された「オブジェクトに対するアクセスポリシー」です。

「re:Invent 2021」のアップデートでACLの無効化を設定可能になり、「オブジェクトACLは無効化」が推奨されることになりました。

CloudFrontログ保管用バケットは、引き続きオブジェクトACL有効化が必要です。

やってみた

S3のオブジェクトACLの有効/無効の制御は、AWS Provider v3,v4関係なく「aws_s3_bucket_ownership_controls」リソースで行います。

ドキュメントベースですが、AWS Provider v3.69.0から値に「BucketOwnerEnforced」を設定可能でした。

data "aws_caller_identity" "self" {}

resource "aws_s3_bucket" "bucket" {
  bucket = "bucuket-${data.aws_caller_identity.self.account_id}"
}

resource "aws_s3_bucket_ownership_controls" "firelens" {
  bucket = aws_s3_bucket.bucket.bucket

  rule {
    object_ownership = "BucketOwnerEnforced"
  }
}

設定値は、「BucketOwnerEnforced」、「BucketOwnerPreferred」、「ObjectWriter」の三種類の中から選択します。

無効化の場合は「BucketOwnerEnforced」を選択します。違いについては、再掲にはなりますが次のブログをご覧ください。

ちなみにですが、デフォルト(aws_s3_bucket_ownership_controlsリソースを作成しない場合)の「オブジェクト所有者」設定はオブジェクトライター(ObjectWriter)でした。

vs aws_s3_bucket_acl

最後に「aws_s3_bucket_acl」との競合について調べてみました。

「オブジェクト所有者」設定を「バケット所有者の強制(BucketOwnerEnforced)」に設定する場合は、バケット所有者以外のバケット ACLが削除されている必要がありました。

バケット ACLの削除忘れエラー例

aws_s3_bucket_ownership_controls.bucket: Creating...
╷
│ Error: error creating S3 Bucket (buckets-622809842341) Ownership Controls: InvalidBucketAclWithObjectOwnership: Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting
│       status code: 400, request id: XXXXXXXXXXXXXXXX, host id: XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
│ 
│   with aws_s3_bucket_ownership_controls.bucket,
│   on aws_s3.tf line 40, in resource "aws_s3_bucket_ownership_controls" "bucket":
│   40: resource "aws_s3_bucket_ownership_controls" "bucket" {

マネジメントコンソールでも同様のエラーが確認できます。

最後に

以上、TerraformでS3のオブジェクトACLを無効にするでした。

オブジェクトACLの無効化できるとは今日まで知らず、是非ブログにしたいと思い書いてみました。

このブログがどなたかの参考になれば幸いです。以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!