如何实现Terraform AWS Provider的条件化assume_role块配置
Terraform AWS Provider 条件配置assume_role的问题解答
问题1:将assume_role块内的role_arn设为null,是否等价于移除整个块?
不等价,完全无法达到块失效的效果。
assume_role是AWS Provider定义的嵌套配置块,不是支持空值省略的普通属性:只要Terraform解析到该块的存在,就会将其纳入配置校验流程。- 即使块内的
role_arn被设置为null,Terraform依然会识别到用户显式声明了角色假设逻辑,后续流程中会因为缺少合法的角色ARN触发配置校验报错,和“不写这个块”的运行效果有本质区别。
问题2:如何在islocal为true时完全移除assume_role块?
可以通过dynamic条件块实现和手写删除块完全一致的效果,Terraform从0.12版本开始,在Provider块内同样支持dynamic嵌套块语法,具体配置结构如下:
provider "aws" { region = var.region1 # 本地环境使用default profile认证,非本地走默认凭证链 profile = var.islocal == true ? "default" : null # 动态生成assume_role块 dynamic "assume_role" { # 本地环境时传入空列表,不产出任何配置块;非本地传入角色ARN列表,生成对应块 for_each = var.islocal == true ? [] : [var.terraform_execution_role] content { role_arn = for_each.value } } }
配置运行逻辑:
- 当
var.islocal为true时,dynamic块的for_each值为空列表,不会生成任何assume_role嵌套块,和手动删除该块的效果完全一致; - 当
var.islocal为false时,dynamic块会生成1个携带合法role_arn的assume_role块,和普通手写配置的运行效果无差异。
注意:dynamic块的
for_each参数不能传入null值,必须传入空集合/数组表示“不生成块”,传null会触发Terraform语法校验错误。
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

