AWS/Terraform

【Terraform】S3のACLを無効化してみた【AWS推奨設定】

今回は、AWS re:Invent 2021 の期間中に発表された「S3バケットのACL無効化」がTerraformに対応していたので、早速設定してみました。
S3のACLはIAMが登場する前から存在していたアクセス制御ですが、現在はバケットポリシーの設定で十分であり、ACLの無効化が推奨されています。

S3のACL無効化の概要について参考にした情報は以下です。
Amazon S3 Object Ownership で、S3 内のデータのアクセス管理をシンプル化するためのアクセスコントロールリストの無効化が可能に
【アップデート】S3でACLを無効化できるようになりました

設定の期待値

AWSマネジメントコンソールから、該当のS3バケットの「アクセス許可タブ>オブジェクト所有者」にて、「ACL無効(推奨)」が選択されていることが期待値です。

Terraformのバージョン

筆者が使用したTerraformのバージョン情報は以下です。

Terraformのバージョン 1.1.0
AWSプロバイダのバージョン 3.69.0

設定手順

今回は、既にTerraformで管理しているS3をACL無効化の設定対象とします。
※新規作成するバケットに対しても設定方法は同じです。
手順は以下①~⑥です。

①S3バケットを管理しているファイルに、以下のとおり追記します。
※Terraformの設定ファイル(バージョンやバックエンド設定)は割愛します。

############################################################################
# S3バケット
############################################################################
# S3バケット
resource "aws_s3_bucket" "<Terraformで管理するバケット名>" {
  bucket        = "<AWS上のバケット名>"
  acl           = "private"
  force_destroy = false
}

# S3バケットのオブジェクト所有者(ACL設定)
resource "aws_s3_bucket_ownership_controls" "<Terraformで管理するオブジェクト所有者設定名>" {
  bucket = aws_s3_bucket.<Terraformで管理するバケット名>.id
  rule { object_ownership = "BucketOwnerEnforced" }
}

 

注意
S3のオブジェクト所有者設定は、aws_s3_bucketとは別のリソースブロックaws_s3_bucket_ownership_controlsで定義します。
Terraformの場合、以下画像のようにS3の設定項目が別リソースとして分散しています。

筆者は、不要な設定のリソースブロックを記述しても可読性が落ちるだけと考えています。

②プロバイダをバージョンアップしていない場合は、プロバイダバージョンが3.68以上となるようTerraformの設定ファイルを書き換えます。

③コマンドterraform init -upgradeを実行します。

④ロックファイル「.terraform.lock.hcl」を開いて、固定バージョンが書き換わっていることを確認します。

⑤コマンドterraform planを実行して、オブジェクト所有者の設定更新が検出されることを確認します。

⑥コマンドterraform applyを実行後、AWSマネジメントコンソールにて、該当のS3バケットの「アクセス許可タブ>オブジェクト所有者」が「ACL無効(推奨)」になっていることを確認します。

Terraformで「オブジェクト所有者」を「バケット所有者の強制」を指定することで、ACLを無効化しています。
(ACL無効化の実体は、「バケット所有者の強制」という設定値です)

ハマったところ

筆者が(初歩的な箇所ですが)ハマったところをご紹介します。

プロバイダーのバージョンアップ忘れ

設定済みのAWSプロバイダのバージョンが設定に対応していない古い状態でTerraformを実行すると、BucketOwnerEnforcedは無い設定として以下のエラーが出力されます。

AWSの新機能にTerraformが対応した場合、その新機能をコード化するためにはAWSプロバイダのバージョンアップが基本必要です。
筆者は今回の設定にあたり、プロバイダのバージョンアップを失念していました。

terraform init の引数抜け

Terraformには「.terraform.lock.hcl」というプロバイダのバージョンを固定するロックファイルが存在します。
参考https://www.terraform.io/docs/language/dependency-lock.html
この「.terraform.lock.hcl」に記述されているバージョン以外のプロバイダのバージョンを設定ファイルに記述して、初期化コマンドterraform initでバージョンアップしようとすると、エラーが出力されます。

ロックファイルで固定されているバージョンより上にバージョンアップしたい場合は、terraform init -upgradeを実行します。

まとめ

今回は、TerraformでS3のACLを無効化する方法をご紹介しました。
既にTerraformで管理しているS3でも、aws_s3_bucket_ownership_controlsのリソースブロック変更もしくは追記でACLを無効化できますので、S3のACL無効化運動を推進する場合は、ぜひTerraformでお試しください。(バケット数が多いほど、手動より楽です)
この記事をとおして、少しでもTerraform利用のお役に立てれば幸いです。