如何通过Terraform将AWS Transit Gateway共享至整个组织?
Terraform共享Transit Gateway至AWS整个组织的解决方案
问题根源
aws_ram_principal_association资源不支持直接传入组织ID(如o-nb1000a1),该字段默认仅识别12位AWS账号ID,因此直接传入组织ID会触发格式错误。- 仅指定父账号ID只能将TGW共享至该单个账号,无法覆盖整个组织架构。
正确实现方案
1. 先确保RAM与AWS Organizations集成
需要将RAM设为组织的委托管理员(若未配置),确保管理账号有权限将资源共享至整个组织:
resource "aws_organizations_delegated_administrator" "ram" { account_id = var.management_account_id # 替换为你的组织管理账号ID service_principal = "ram.amazonaws.com" }
2. 修改Terraform代码实现组织级共享
核心是使用组织ARN作为RAM共享的主体,而非纯组织ID,调整后的代码如下:
# 获取当前AWS组织的信息 data "aws_organizations_organization" "default" { count = var.ram_resource_share_enabled && !local.ram_principals_provided ? 1 : 0 } # 本地变量:自动生成组织ARN作为共享主体,或使用用户指定的主体 locals { ram_principals_provided = length(var.provided_ram_principals) > 0 ram_principals = var.ram_resource_share_enabled && !local.ram_principals_provided ? [data.aws_organizations_organization.default[0].arn] : var.provided_ram_principals } # 创建RAM资源共享 resource "aws_ram_resource_share" "default" { count = var.ram_resource_share_enabled ? 1 : 0 name = var.resource_share_name allow_external_principals = false # 组织内共享无需允许外部主体 # 绑定TGW的全访问权限 permission_arns = ["arn:aws:ram::aws:permission/AWSTransitGatewayFullAccess"] } # 将TGW关联到RAM共享 resource "aws_ram_resource_association" "default" { count = var.ram_resource_share_enabled ? 1 : 0 resource_arn = aws_ec2_transit_gateway.tgw.arn resource_share_arn = aws_ram_resource_share.default[0].id } # 将组织ARN关联到RAM共享,实现全组织共享 resource "aws_ram_principal_association" "default" { for_each = toset(local.ram_principals) principal = each.value resource_share_arn = aws_ram_resource_share.default[0].id }
关键说明
- 组织ARN格式:AWS RAM接受格式为
arn:aws:organizations::<管理账号ID>:organization/o-xxxxxx的ARN作为共享主体,这样就能把TGW共享给整个组织内的所有账号。 - 权限配置:添加
AWSTransitGatewayFullAccess权限ARN,确保组织内账号能正常使用共享的TGW资源。 - 参数校验:
allow_external_principals需设为false,因为组织内共享属于AWS内部主体共享,无需开放外部访问。
排查要点
- 执行Terraform的账号必须是组织管理账号,或已被配置为RAM的委托管理员。
- 确认组织已启用所有必要的RAM集成功能(可在AWS控制台RAM页面查看)。
内容的提问来源于stack exchange,提问作者e-on
相关产品推荐
相关产品推荐

