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

Terraform中如何按变量条件动态添加source_policy_documents

解决方案

你的问题根源是三元表达式两边的类型不匹配,或者提供了无效的JSON字符串(空字符串)。要实现动态添加策略文档,最简洁的方式是用concat函数结合条件判断,确保始终返回类型一致的字符串数组:

data "aws_iam_policy_document" "newpolicydoc" {
  source_policy_documents = concat(
    # 固定包含的基础策略
    [data.aws_iam_policy_document.commonpolicy.json],
    # 条件性添加的策略:非staging环境则加入,否则返回空数组
    var.env != "staging" ? [data.aws_iam_policy_document.policydoc.json] : []
  )
}

为什么之前的写法报错?

  • 第一种写法中,true分支返回的是字符串(json属性是序列化后的JSON字符串),但false分支返回的是{}(空对象),Terraform要求三元表达式两边类型必须一致,因此报错。
  • 第二种写法中,false分支返回空字符串,虽然类型是字符串,但空字符串不是有效的IAM策略JSON,导致AWS插件解析时panic。

这种concat+条件数组的方式扩展性很强,后续新增更多需要动态控制的策略时,只需要在concat里追加新的条件判断即可,比如:

source_policy_documents = concat(
  [data.aws_iam_policy_document.commonpolicy.json],
  var.env != "staging" ? [data.aws_iam_policy_document.policydoc.json] : [],
  var.env == "production" ? [data.aws_iam_policy_document.prod_policy.json] : []
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:22:08