Terraform:使用aws_organizations_organization数据源时排除指定账户ID
Terraform 排除指定账户分配SSO权限的解决方案
核心问题修正
你之前的代码错误地直接遍历了aws_organizations_organization数据源本身,正确的账户列表存储在该数据源的accounts属性中,每个账户对象包含id字段。以下是实现排除指定账户的完整代码:
# 定义要排除的账户ID(可替换为实际值,或改用变量管理) locals { excluded_account_id = "123456789012" } # 获取组织内所有账户信息 data "aws_organizations_organization" "example" {} # 获取SSO实例ARN(确保已正确配置该数据源) data "aws_ssoadmin_instances" "sso_instance" {} # 为过滤后的账户分配SSO权限 resource "aws_ssoadmin_account_assignment" "example" { instance_arn = tolist(data.aws_ssoadmin_instances.sso_instance.arns)[0] permission_set_arn = "permission_set_arn" # 替换为实际权限集ARN principal_id = "groupid" # 替换为实际用户组ID principal_type = "GROUP" # 过滤排除指定账户,生成唯一账户ID集合 for_each = toset([ for account in data.aws_organizations_organization.example.accounts : account.id if account.id != local.excluded_account_id ]) target_id = each.value target_type = "AWS_ACCOUNT" }
关键逻辑说明
- 正确引用账户列表:通过
data.aws_organizations_organization.example.accounts遍历组织内所有账户,提取每个账户的id - 过滤规则实现:使用列表推导式的
if条件,跳过与local.excluded_account_id匹配的账户ID - for_each 类型适配:用
toset将过滤后的ID列表转为集合,确保for_each使用唯一、稳定的键,避免Terraform执行不必要的资源重建
简化写法(无需局部变量)
如果不需要复用排除ID,可直接硬编码过滤条件:
for_each = toset([ for account in data.aws_organizations_organization.example.accounts : account.id if account.id != "123456789012" ])
内容的提问来源于stack exchange,提问作者officiallyy
相关产品推荐
相关产品推荐

