Terraform如何从AWS组织提取合规包指定排除账号的ID
实现方案
1. 加载YAML配置为Terraform本地变量
假设你的YAML配置文件名为aws_config.yaml,首先用Terraform内置函数解析加载配置,同时提前预处理组织账号数据提升查询效率:
locals { # 解析YAML配置文件 aws_config = yamldecode(file("${path.module}/aws_config.yaml")) # 提取所有合规包模板配置 conformance_pack_templates = local.aws_config.AWSConfig.conformance_pack_templates # 按账号名称分组,同名称的账号ID统一归集为列表,适配重名账号场景 accounts_by_name = { for account in data.aws_organizations_organization.org.accounts : account.name => account.id... } }
2. 组装目标格式的结果
通过Terraform for表达式遍历模板配置,匹配对应排除账号ID:
locals { final_excluded_accounts = [ for pack in local.conformance_pack_templates : { # 提取合规包模板名称 template = keys(pack)[0] # 匹配所有需要排除的账号ID excluded_accounts = flatten([ for exclude_name in pack[keys(pack)[0]][0].excluded_accounts : lookup(local.accounts_by_name, exclude_name, []) ]) } ] }
3. 输出验证
如果需要查看最终结果,可添加如下输出块:
output "template_excluded_account_ids" { value = local.final_excluded_accounts }
逻辑说明
- 提前将全量账号按名称分组,避免每次查询都遍历全量账号列表,提升效率
- 匹配账号名称时用
lookup函数处理不存在的名称,无匹配时返回空列表不会报错 - 自动归集所有重名账号的ID,符合示例中多个同名
closed账号都被纳入排除列表的需求
内容的提问来源于stack exchange,提问作者Dani Wol.
相关产品推荐
相关产品推荐

