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

Terraform数据模块:如何为aws_iam_policy_document信任策略添加仅针对特定模块生效的条件块

解决Terraform信任策略中仅特定模块生效Condition块的问题

你遇到的错误是因为**count参数只能用于Terraform的顶级资源或数据块**,不能直接用在statement或condition这类嵌套块内部。要实现仅当var.git为true时才添加指定Condition块的需求,正确的做法是使用Terraform的dynamic块来动态生成这些嵌套的Condition。

修正后的代码示例

data "aws_iam_policy_document" "trust-policy" {
  statement {
    actions = [var.action]
    principals {
      type        = var.type
      identifiers = concat(var.trusted_arns)
    }

    # 动态生成Condition块,仅在var.git为true时生效
    dynamic "condition" {
      # 当var.git为true时,遍历包含两个Condition定义的列表;否则遍历空列表(不生成任何块)
      for_each = var.git ? [
        {
          test     = "StringEquals"
          variable = "abc"
          values   = ["sts.amazonaws.com"]
        },
        {
          test     = "StringLike"
          variable = "dcf"
          # 注意这里需要用插值语法引用变量,否则会被当作字符串字面量
          values   = ["repo:${var.org_name}/${var.repo_name}:ref:refs/heads/${var.branch_name}"]
        }
      ] : []

      # 动态块的内容模板,对应每个Condition的定义
      content {
        test     = condition.value.test
        variable = condition.value.variable
        values   = condition.value.values
      }
    }
  }
}

代码说明

  1. dynamic块的作用:dynamic是Terraform专门用于动态生成嵌套块的语法,它允许你根据变量值来控制是否生成、生成多少个指定的嵌套块。
  2. for_each控制生成逻辑:这里通过三元表达式判断var.git的值:
    • 当var.git = true时,for_each遍历包含两个Condition配置的列表,生成对应的两个condition嵌套块;
    • 当var.git = false时,for_each使用空列表,不会生成任何condition块。
  3. 变量插值修正:你原来的代码中values里的变量引用(比如var.org_name)没有使用插值语法,会被当作字符串的一部分,所以需要加上${}来正确引用变量值。

替代方案(拆分Statement)

如果你希望把带Condition的逻辑拆成独立的Statement,也可以通过在顶级statement块上使用count来实现:

data "aws_iam_policy_document" "trust-policy" {
  # 基础的信任策略Statement,始终生效
  statement {
    actions = [var.action]
    principals {
      type        = var.type
      identifiers = concat(var.trusted_arns)
    }
  }

  # 仅当var.git为true时生效的Statement,包含Condition块
  statement {
    count = var.git ? 1 : 0

    actions = [var.action]
    principals {
      type        = var.type
      identifiers = concat(var.trusted_arns)
    }

    condition {
      test     = "StringEquals"
      variable = "abc"
      values   = ["sts.amazonaws.com"]
    }
    condition {
      test     = "StringLike"
      variable = "dcf"
      values   = ["repo:${var.org_name}/${var.repo_name}:ref:refs/heads/${var.branch_name}"]
    }
  }
}

不过这种方案会生成两个独立的Statement(当var.git=true时),而第一种方案是在同一个Statement中动态添加Condition,具体选择哪种取决于你的策略结构需求。

内容的提问来源于stack exchange,提问作者user312307

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:37:38