Terraform对可以为null的变量的自定义验证

Terraform对可以为null的变量的自定义验证,terraform,Terraform,我正在尝试使用Terraform 0.13来确保该值为null或介于指定范围之间。我已经尝试了我能想到的每一种组合(使用can,try,等等),但无法让它适用于每一种情况 以下是完整的非工作示例: variable "target_group_stickiness_duration" { default = null type = number validation { condition = ( var.target_group_

我正在尝试使用Terraform 0.13来确保该值为
null
或介于指定范围之间。我已经尝试了我能想到的每一种组合(使用
can
try
,等等),但无法让它适用于每一种情况

以下是完整的非工作示例:

variable "target_group_stickiness_duration" {
  default = null
  type    = number
 
  validation {
    condition = ( 
      var.target_group_stickiness_duration == null ||
      ( var.target_group_stickiness_duration >= 1 && var.target_group_stickiness_duration <= 604800 )
    )   
 
    error_message = "Target group stickiness duration must be >= 1 and <= 604800."
  }
}
变量“目标群体粘性持续时间”{
默认值=空
类型=数量
验证{
条件=(
var.target\u group\u粘性\u持续时间==null||

(var.target\u group\u stickness\u duration>=1&&var.target\u group\u stickness\u duration看起来这里发生了两件不同的事情

第一个是巡更条件表达式包含以下子表达式:

var.target_group_stickiness_duration == null
这似乎允许值为null

但是,如果我们将其纠正为相反的情况,则会暴露第二个问题:

    condition = ( 
      var.target_group_stickiness_duration != null &&
      ( var.target_group_stickiness_duration >= 1 && var.target_group_stickiness_duration <= 604800 )
    )   

这本质上是一些其他语言在其逻辑运算符中提供的自动短路行为的显式实现。Terraform,至少在其当前设计中,要求您显式写出
=
,看起来这里发生了两件不同的事情

第一个是巡更条件表达式包含以下子表达式:

var.target_group_stickiness_duration == null
这似乎允许值为null

但是,如果我们将其纠正为相反的情况,则会暴露第二个问题:

    condition = ( 
      var.target_group_stickiness_duration != null &&
      ( var.target_group_stickiness_duration >= 1 && var.target_group_stickiness_duration <= 604800 )
    )   

这本质上是一些其他语言在其逻辑运算符中提供的自动短路行为的显式实现。Terraform,至少在其当前设计中,要求您显式写出
=
当您的
目标组粘滞度
为空时,它会失败
,即

(var.target_group_stickiness_duration >= 1 && var.target_group_stickiness_duration <= 604800
)

(var.target\u group\u stickness\u duration>=1&&var.target\u group\u stickness\u duration=1&&coalesce(var.target\u group\u stickness\u duration,604801)当您的
target\u group\u stickness\u duration
null
时,会出现故障

(var.target_group_stickiness_duration >= 1 && var.target_group_stickiness_duration <= 604800
)

(var.target\u group\u stickness\u duration>=1&&var.target\u group\u stickness\u duration=1&&coalesce(var.target\u group\u stickness\u duration,604801)这是有道理的,我也尝试了这个版本,但是失败了,错误与上面相同。第二个条件表达式总是使用
null
值进行计算。啊,是的,今天我用新的眼光看到这里发生了两件事,我只关注了第一件事。我将更新我的答案为more完成,虽然我看到你已经接受了另一个答案,所以我这样做只是为了不留下不完整的答案。一个小改动:三元数的第一部分应该是
true
,但这是一个非常干净的解决方案。非常感谢你指出条件/三元运算符支持短路,这将未来的elp!这是有意义的,我也尝试了这个版本,但失败了,错误与上面相同。第二个条件表达式总是使用
null
值进行计算。啊,是的,今天我用新的眼光看到这里发生了两件不同的事情,我只关注了第一件。我将更新我的答案要更完整,虽然我看到你已经接受了另一个答案,所以我这样做只是为了不留下不完整的答案。一个小改动:三元运算符的第一部分应该是
true
,但这是一个非常干净的解决方案。非常感谢你指出条件/三元运算符支持短循环uiting,以后会有帮助的!尝试了10种不同的方法,但没有想到使用凝聚。非常感谢!@richid没问题。很高兴它成功了。尝试了10种不同的方法,但没有想到使用凝聚。非常感谢!@richid没问题。很高兴它成功了。