在AWS成员账户中通过Terraform获取组织OU ID的解决方案
问题背景
在AWS组织根账户中,可通过Terraform的aws_organizations_organization和aws_organizations_organizational_units数据源正常获取OU层级信息,但切换到成员账户执行相同代码时,data.aws_organizations_organization.org.roots字段返回null,导致无法索引根OU ID,进而无法查询子OU。成员账户仅能获取组织基本信息(如ARN、主账户ID等),无法读取OU结构。
可行解决方案
方案1:给成员账户授予组织访问权限
AWS默认限制成员账户读取组织OU结构,需在根账户中创建IAM策略,授权成员账户的IAM实体读取组织OU信息,再将策略附加到成员账户的对应IAM实体上。
示例IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "organizations:ListOrganizationalUnitsForParent", "organizations:DescribeOrganization" ], "Resource": "*" } ] }
注:如需最小权限原则,可将Resource指定为组织ARN或特定OU的ARN,避免过度授权。
方案2:通过SSM参数传递OU ID
在根账户中将所需OU ID存储到AWS Systems Manager Parameter Store,再给成员账户授权读取该参数的权限,成员账户Terraform直接读取参数即可获取OU ID。
步骤:
- 根账户创建SSM参数:
aws ssm put-parameter --name "/org/ou/root-id" --type "String" --value "r-xxxx" aws ssm put-parameter --name "/org/ou/sub-ou1-id" --type "String" --value "ou-xxxx-xxxx"
- 给成员账户添加读取权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:GetParameter", "Resource": "arn:aws:ssm:区域ID:根账户ID:parameter/org/ou/*" } ] }
- 成员账户Terraform读取参数:
data "aws_ssm_parameter" "root_ou_id" { name = "/org/ou/root-id" } data "aws_ssm_parameter" "sub_ou1_id" { name = "/org/ou/sub-ou1-id" } output "root_ou_id" { value = data.aws_ssm_parameter.root_ou_id.value }
方案3:结合外部数据源调用AWS API
若已获取根账户授权的组织访问权限,可在成员账户中使用Terraform的external数据源调用AWS CLI查询组织信息。
示例代码:
data "external" "org_root_id" { program = ["aws", "organizations", "describe-organization", "--query", "Roots[0].Id", "--output", "text"] } data "aws_organizations_organizational_units" "sub_ous" { parent_id = data.external.org_root_id.result["0"] } output "sub_ous" { value = data.aws_organizations_organizational_units.sub_ous }
注:需确保成员账户环境已配置AWS CLI,且IAM实体拥有organizations:DescribeOrganization和organizations:ListOrganizationalUnitsForParent权限。
关键说明
所有方案的核心是根账户必须给成员账户授予对应组织资源的访问权限,因为AWS组织层级信息默认仅对根账户开放。若无法修改根账户权限,方案2(SSM参数传递)是最便捷的选择,只需根账户一次性配置参数和读取权限,后续成员账户无需额外操作。
内容的提问来源于stack exchange,提问作者hlesnt395

