Terraform 能否为local本地变量设置类型约束无需定义对应variable
Terraform本地变量(local)类型约束实现方案
结论
你示例中给出的原生声明写法不被Terraform支持,但可以通过内置类型转换函数实现无需定义variable即可给local施加类型约束的需求。
原因说明
Terraform的locals块本身没有内置的独立类型声明语法,默认会根据赋值内容自动推导类型,你示例中重复赋值同一key、声明foo = string的写法属于非法语法,执行时会直接报错。
实现方案
通过Terraform内置的类型转换函数即可实现强制类型校验,类型不符合要求时会在规划阶段直接抛出错误,和variable的类型约束效果完全一致:
1. 基础集合类型约束
如果是map、list、set这类基础集合类型,直接用对应的类型转换函数即可:
# 约束为map(string)类型,所有值必须为字符串 locals { a = tomap({ foo = "foo" bar = "bar" }) }
如果上面的示例中把bar = "bar"改成bar = 123,执行terraform plan时会直接报错:Cannot convert number to string,达到类型约束效果。
2. 复杂自定义类型约束
如果是对象这类复杂类型,可以用convert()函数配合type()实现自定义结构约束:
# 约束为指定结构的对象类型 locals { user = convert( { name = "张三" age = 25 }, # 这里定义你需要的类型结构 type(object({ name = string age = number })) ) }
如果赋值的对象缺少属性、多出额外属性或者属性类型不匹配,都会在规划阶段直接抛出校验错误。
内容的提问来源于stack exchange,提问作者Niko
相关产品推荐
相关产品推荐

