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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:42