はじめに
Terraformを使ってAWS S3バケットを作成する際に、仕様変更によりエラーや警告が発生することがあります。
本記事では、その中でも aws_s3_bucket
の acl
属性が非推奨になった警告の詳細と、修正方法について解説します。
書こうと思ったきっかけ
Terraformのバージョンアップに伴い、S3バケットの acl
属性が非推奨となり、新しいリソース aws_s3_bucket_acl
を使用する必要が出てきました。
この変更に気づかずに既存のコードを適用すると警告が表示されるため、同じ問題に直面する人のために記事を書こうと思いました。
警告の内容
TerraformでAWS S3バケットを作成する際に、以下のような警告が発生することがあります。
│ Warning: Argument is deprecated
│
│ with aws_s3_bucket.example,
│ on main.tf line 7, in resource "aws_s3_bucket" "example":
│ 7: acl = "private"
│
│ Use the aws_s3_bucket_acl resource instead
│
│ (and one more similar warning elsewhere)
この警告は、Terraformのバージョンアップにより aws_s3_bucket
リソース内の acl
属性が非推奨になったことによるものです。代わりに aws_s3_bucket_acl
リソースを使用する必要があります。
修正方法
修正前のコード
resource "aws_s3_bucket" "example" {
bucket = "my-example-bucket"
}
resource "aws_s3_bucket_acl" "example_acl" {
bucket = aws_s3_bucket.example.id
acl = "private"
}
修正後のコード
resource "aws_s3_bucket" "example" {
bucket = "my-example-bucket"
force_destroy = true
}
resource "aws_s3_bucket_ownership_controls" "example" {
bucket = aws_s3_bucket.example.id
rule {
object_ownership = "BucketOwnerEnforced"
}
}
修正のポイント
-
aws_s3_bucket_acl
リソースを削除し、新しいaws_s3_bucket_ownership_controls
リソースを使用。 -
object_ownership = "BucketOwnerEnforced"
を設定して、ACL を不要にする。 -
force_destroy = true
を追加し、削除時の管理を簡単に。
修正後の適用手順
修正後のTerraformコードを適用するには、以下のコマンドを実行します。
terraform init
terraform plan
terraform apply
terraform apply
実行時に yes
を入力すると、修正後の設定が適用されます。
実際のターミナル画面
まとめ
Terraformの新しい仕様に対応するため、S3バケットのACL設定を削除し、aws_s3_bucket_ownership_controls
を使用することで、最新のTerraformのベストプラクティスに準拠した構成が可能になります。