`check` 블록 참조
check 블록 참조 (check block reference)
check 블록을 사용하면 일반적인 리소스 수명 주기 밖에서 인프라를 검증할 수 있어요. Terraform은 plan 또는 apply 작업의 마지막 단계로, 인프라를 계획하거나 프로비저닝한 후에 check 블록을 실행해요. 이 페이지에서는 check 블록의 구성 모델, 지원 인자, 그리고 실제 사용 예시를 다룰게요.
출처: 문서
본문
check 블록을 사용하면 일반적인 리소스 수명 주기 밖에서 인프라를 검증할 수 있어요.
Terraform은 인프라를 계획하거나 프로비저닝한 후, plan 또는 apply 작업의 마지막 단계로 check 블록을 실행해요. check 블록의 어설션(assertion)이 실패하면 Terraform은 경고를 보고하고 현재 작업을 계속 실행해요.
배경 (Background)
Terraform은 구성을 계획하거나 적용할 때마다 check 블록을 로컬에서 평가해요. HCP Terraform에서는 워크스페이스에서 헬스 체크를 활성화해 해당 워크스페이스 구성에 정의된 체크를 자동으로 그리고 지속적으로 실행할 수 있어요. 자세한 내용은 지속적 검증을 참고해요.
check 블록은 구성을 검증할 수 있는 방법 중 하나예요. 체크에는 해당 체크 중에 Terraform이 검증하는 조건을 지정하는 어설션이 포함돼요. 다른 검증은 Terraform 작업의 다른 단계에서 실행되며, 실패하면 작업을 차단할 수 있어요. check 블록은 작업을 차단하지 않는 유일한 검증이에요. check 블록의 어설션이 실패하면 Terraform은 경고를 보고하고 현재 작업을 계속 실행해요.
Terraform에서 구성을 검증하는 모든 방법에 대한 정보는 구성 검증을 참고해요.
구성 모델 (Configuration model)
check 블록은 다음 인자를 지원해요:
check "<LABEL>"블록assert블록 (필수)condition식error_message문자열
data "<TYPE>" "<LABEL>"블록PROVIDER_ARGUMENTS블록 | 프로바이더 문서 참조depends_on참조 리스트provider참조
완전한 구성 (Complete configuration)
사용 가능한 모든 인자는 다음 check 블록에 정의돼 있어요. check 블록에는 상호 배타적인 인자가 없어요.
check "<LABEL>" {
data "<TYPE>" "<LABEL>" {
}
assert {
condition = <CONDITION>
error_message = "<MESSAGE>"
}
}
check 블록은 여러 어설션을 포함할 수 있어요.
사양 (Specification)
check 블록은 다음 구성을 지원해요.
check "<LABEL>"
check 블록을 선언할 때는 Terraform의 리소스 명명 규칙을 따라요.
check 블록에 다음 블록들을 정의할 수 있어요.
| 인자 | 설명 | 타입 | 필수 |
|---|---|---|---|
assert |
평가할 검증 조건이에요. check 블록은 하나 이상의 어설션을 포함해요. |
블록 | 필수 |
data |
검증에 사용할 데이터 소스를 지정해요. 이 데이터 소스는 부모 check 블록 안에서만 참조할 수 있어요. |
블록 | 선택 |
assert
check 블록은 적어도 하나의 assert 블록을 포함해야 해요. 각 assert 블록은 plan과 apply 작업 후에 Terraform이 평가하는 조건을 지정해요.
check "unique_name" {
assert {
condition = <CONDITION>
error_message = "The error message Terraform displays if the assert expression is false."
}
}
체크가 통과하려면 각 assert 블록의 condition이 true로 평가되어야 해요. assert 블록 안의 condition 인자는 부모 check 블록 안의 중첩 데이터 소스와 현재 모듈 안의 모든 변수, 리소스, 데이터 소스, 모듈 출력을 참조할 수 있어요.
assert 블록은 다음 인자를 지원해요:
| 인자 | 설명 | 타입 | 필수 |
|---|---|---|---|
condition |
Terraform이 평가하는 식이에요. 식이 true로 평가되면 assert 블록은 통과해요. |
식 | 필수 |
error_message |
조건이 false로 평가될 때 표시할 메시지예요. |
문자열 | 필수 |
check 블록 안에서 어설션을 정의하는 방법에 대해 더 알아보려면 예시를 참고해요.
요약 (Summary)
- 데이터 타입: 블록.
- 기본값: 없음.
- 필수: 예, 각
check블록은 적어도 하나의assert블록을 포함해야 해요. - 예시: 여러 어설션 선언.
data "<TYPE>" "<LABEL>"
data 블록은 assert 블록의 condition 인자에서 식에 참조할 수 있는 정보를 가져와요.
check "unique_name" {
data "TYPE" "<LABEL>" {
}
assert { #... }
}
check 블록에 data 블록을 정의하는 것은 선택 사항이에요. 중첩 데이터 소스는 부모 check 블록 안에서만 참조할 수 있어요. 중첩 데이터 소스의 프로바이더가 오류를 발생시키면 경고로 가려지며 Terraform 작업을 계속 진행하는 것을 막지 않아요.
다른 데이터 소스와 달리 Terraform은 plan 또는 apply 작업의 마지막 단계로 중첩 데이터 소스의 정보를 가져와요. 중첩 데이터 소스를 사용해 Terraform이 구성의 나머지를 적용한 후 인프라에 대한 정보를 가져올 수 있어요. 예를 들어 중첩 data 블록을 사용해 웹사이트의 API를 핑해서 Terraform이 웹사이트 인프라를 성공적으로 적용하고 구축했는지 확인할 수 있어요.
중첩 data 블록은 타입과 레이블을 요구해요:
data 블록 안의 인자는 프로바이더에 특정해요. 자세한 내용은 지정한 프로바이더의 레지스트리 문서를 참고해요.
depends_on
depends_on 인자는 data 블록이 의존하는 업스트림 리소스를 지정해요. Terraform은 data 블록에서 정보를 가져오기 전에 업스트림 리소스에 대한 모든 작업을 완료해야 해요.
check "unique_name" {
data "aws_ami" "web" {
depends_on = [<RESOURCE>]
}
assert { #... }
}
depends_on은 메타-인자예요. 메타-인자는 Terraform 언어에 내장되어 리소스를 어떻게 생성할지 제어해요. 이 인자가 어떻게 동작하는지에 대한 자세한 내용은 depends_on 참조를 참고해요.
provider
provider 인자는 중첩 데이터 소스를 프로비저닝하는 데 대체 프로바이더 구성을 사용하도록 Terraform에 지시해요.
check "unique_name" {
data "aws_ami" "web" {
provider = <NAME>
}
assert { #... }
}
provider는 메타-인자예요. 메타-인자는 Terraform 언어에 내장되어 리소스를 어떻게 생성할지 제어해요. 이 인자가 어떻게 동작하는지에 대한 자세한 내용은 provider 참조를 참고해요.
예시 (Examples)
다음 예시는 check 블록의 일반적인 사용 사례를 보여줘요.
엔드포인트 헬스 검증 (Validate endpoint health)
다음 예시에서 data 블록은 API 엔드포인트를 호출해 엔드포인트가 정상 상태 코드를 반환하는지 검증해요. 엔드포인트가 200 코드를 반환하지 않으면 Terraform은 assert 블록에 지정된 오류 메시지를 출력해요:
check "health_check" {
data "http" "endpoint" {
url = "https://api.example.com/health"
}
assert {
condition = data.http.endpoint.status_code == 200
error_message = "Health check failed: ${data.http.endpoint.url} returned ${data.http.endpoint.status_code}"
}
}
여러 어설션 (Multiple assertions)
다음 예시에서 data 블록은 aws_lb 리소스를 쿼리해요. check 블록은 로드 밸런서에 보안 그룹이 하나 이상 연결되어야 하고 삭제 보호가 활성화되어야 한다고 어설션해요:
check "service_validation" {
data "aws_lb" "app" {
name = "application-lb"
}
assert {
condition = data.aws_lb.app.enable_deletion_protection
error_message = "Load balancer must have deletion protection enabled"
}
assert {
condition = length(data.aws_lb.app.security_groups) > 0
error_message = "Load balancer must have at least one security group"
}
}
리소스 의존성 (Resource dependency)
다음 예시에서 Terraform은 aws_db_instance.main 데이터베이스를 생성할 때까지 체크 실행을 기다려요. Terraform은 데이터베이스 생성을 마칠 때까지 잘못된 경고를 출력하는 대신 known after apply를 출력해요:
check "database_connection" {
data "postgresql_database" "app_db" {
name = "application"
depends_on = [aws_db_instance.main]
}
assert {
condition = data.postgresql_database.app_db.allow_connections
error_message = "Database is not accepting connections"
}
}