如何用Terraform在每个新建的AWS Organizations账号中创建S3存储桶
问题原因
你当前配置仅使用了默认AWS Provider,该Provider默认绑定你执行操作的AWS管理账号,因此所有aws_s3_bucket资源都会默认创建到该管理账号下,不会自动关联你新创建的组织子账号。
实现方案
你需要为每个新创建的子账号生成独立的AWS Provider实例,通过创建账号时指定的Administrator角色完成子账号的访问授权,再将S3桶资源关联到对应子账号的Provider即可。
完整配置示例
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } # 管理账号默认Provider,用于创建组织账号 provider "aws" { region = var.aws_region } # 为每个子账号生成独立Provider实例,通过AssumeRole访问子账号 provider "aws" { for_each = local.all_user_ids alias = each.value region = var.aws_region assume_role { role_arn = "arn:aws:iam::${aws_organizations_account.this[each.key].id}:role/${aws_organizations_account.this[each.key].role_name}" } } resource "aws_organizations_account" "this" { for_each = local.all_user_ids name = "Dev Sandbox ${each.value}" email = "${var.manager}+sbx_${each.value}@example.com" role_name = "Administrator" parent_id = var.sandbox_organizational_unit_id } # 为每个子账号单独创建S3桶 resource "aws_s3_bucket" "b" { for_each = local.all_user_ids # S3桶名全球唯一,必须加入唯一标识避免冲突 bucket = "my-tf-sandbox-bucket-${each.value}-${aws_organizations_account.this[each.key].id}" # 关联对应子账号的Provider provider = aws[each.key] } # 新版AWS Provider需单独配置桶ACL,不可直接写在aws_s3_bucket参数中 resource "aws_s3_bucket_acl" "b" { for_each = local.all_user_ids bucket = aws_s3_bucket.b[each.key].id acl = "private" provider = aws[each.key] }
注意事项
- 你的管理账号需要拥有Assume所有子账号
Administrator角色的权限 - 子账号创建后角色生效存在几秒延迟,首次apply如果出现AssumeRole报错,重新执行一次
terraform apply即可恢复 - S3桶名全球唯一,必须加入用户标识、子账号ID这类唯一字段,避免命名冲突
内容的提问来源于stack exchange,提问作者Pierre-Alexandre
相关产品推荐
相关产品推荐

