今回は、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利用のお役に立てれば幸いです。