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."
}
}
'개발하자' 카테고리의 다른 글
파이썬 3.4에서 f-스트링이 작동해야 하나요? (1) | 2023.10.26 |
---|---|
깃허브 액션으로 플러터웹 사용시 비밀접속하는 방법 (1) | 2023.10.26 |
특정 리소스에 대해서만 테라폼을 실행하려고 합니다 (0) | 2023.10.24 |
파일 선택기를 사용하여 플랫폼 파일을 파일로 만들기 (0) | 2023.10.24 |
Jupyter/iPython에서 동적으로 플롯을 업데이트하는 현재 올바른 방법은 무엇입니까? (1) | 2023.10.23 |