본문 바로가기

개발하자

null일 수 있는 변수에 대한 테라폼 사용자 지정 유효성 검사

반응형

null일 수 있는 변수에 대한 테라폼 사용자 지정 유효성 검사

Terraform 0.13's를 사용하여 값이 지정된 범위 중 하나 또는 범위 사이인지 확인하려고 합니다. 생각할 수 있는 모든 조합을 시도해 보았지만(사용, 등) 모든 경우에 대해 작동할 수는 없습니다.

작동하지 않는 전체 예시는 다음과 같습니다:

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."
  }
}

값이 다음 오류와 함께 있으면 실패합니다:

작업 중 오류가 발생했습니다. 인수는 null이 아니어야 합니다.

이것은 조건부 표현에 대한 열정적인 평가 때문이라고 생각한다. 제가 뭔가 명백한 걸 놓치고 있는 건가요? 아니면 이것에 대한 현명한 해결책은 없나요?




여기에는 두 가지 다른 일들이 벌어지고 있는 것처럼 보인다.

첫 번째는 상태 표현식에 다음과 같은 하위 표현식이 포함된다는 것입니다:

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 )
    )   

테라폼의 논리 연산자들은 첫 번째 피연산자의 결과가 두 번째 피연산자를 평가하려는 시도를 막을 수 있는 일부 다른 언어에서는 "단락" 동작을 갖지 않는다. 따라서 의 두 피연산자가 모두 유효해야 하며 또는 를 성공적으로 반환해야 합니다.

값이 null일 경우 두 번째 피연산자(숫자의 범위를 중첩 테스트)는 null 숫자에 대해 정의되지 않으므로 성공할 수 없습니다.

이 작업을 수행하려면 연산자를 null 숫자에 적용하지 않는 다른 전략을 사용해야 합니다. 이 질문에 대한 허용된 답변을 포함하여 몇 가지 다양한 방법이 있습니다.

또 다른 대안적인 전략은 선택되지 않은 결과 피연산자를 실패하게 하는 조건부 연산자를 사용하여 다음과 같은 상황에 대한 보호자로 사용할 수 있도록 하는 것이다:

  condition = (
    var.target_group_stickiness_duration == null ? false : (
      var.target_group_stickiness_duration >= 1 && 
      var.target_group_stickiness_duration <= 604800
    )
  )

이것은 본질적으로 일부 다른 언어가 논리 연산자에서 제공하는 자동 단락 동작의 명시적인 구현이다. 테라폼은 적어도 현재 설계에서는 과 연산이 null이 아닌 숫자에 대해서만 바람직하다는 것을 명시적으로 적어야 한다.




실패하는 이유는 당신이, 당신이

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

유효하지 않습니다.

를 사용하여 다음을 시도해 볼 수 있습니다:

variable "target_group_stickiness_duration" {
  default = null
  type    = number
 
  validation {
    condition = ( 
      var.target_group_stickiness_duration == null ||      
     (coalesce(var.target_group_stickiness_duration, 0) >= 1 && coalesce(var.target_group_stickiness_duration, 604801) <= 604800))
 
    error_message = "Target group stickiness duration must be >= 1 and <= 604800."
  }
  
}

반응형