S3を利用する際、他のAWSアカウントからもアクセスできるようにしたいという要件が出ることがあります。その際のterraformの実装についてメモ書きします。
他アカウントと共有のS3を作成するAWSアカウントで下記コードをapplyすることで、コード上のbucket_policyに設定したアカウントからも今回作成したS3にアクセスできるようになります。
下記コードに次の変更を加えることでコードをapplyできます。
・変数のaws_account_id
アクセスさせたいAWSアカウント(12桁の数字)を設定する
・bucket名のshared-bucket-20250204
を検索し、任意の名前で全て置換する
# バケット作成
resource "aws_s3_bucket" "this" {
bucket = "shared-bucket-20250204"
}
# S3のパブリックアクセスをブロックする設定
resource "aws_s3_bucket_public_access_block" "this" {
bucket = aws_s3_bucket.this.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
# S3 バケットのバージョン管理を制御するためのリソース
resource "aws_s3_bucket_versioning" "this" {
bucket = aws_s3_bucket.this.id
versioning_configuration {
status = "Disabled" # S3のバージョニングを無効にする
}
}
# bucket policyの設定(他環境からのアクセスを許可する設定)
resource "aws_s3_bucket_policy" "this" {
bucket = aws_s3_bucket.this.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Sid" : "shared bucket",
"Effect" : "Allow",
"Principal" : {
"AWS" : "arn:aws:iam::${var.aws_account_id}:root"
},
"Action" : [
"s3:GetLifecycleConfiguration",
"s3:ListBucket",
"s3:*Object"
],
"Resource" : [
"arn:aws:s3:::shared-bucket-20250204",
"arn:aws:s3:::shared-bucket-20250204/*"
]
}
]
}
)
}
メモ:"s3:*Object"
はResourceに"バケット名/*"
を設定しないと設定できない