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
相关产品推荐
相关产品推荐

