You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:45:03