잡다한 IT 지식

Terraform - check 블록을 활용한 외부 상태 검증 본문

Terraform

Terraform - check 블록을 활용한 외부 상태 검증

가나무마 2025. 7. 6. 23:08

Terraform 1.5부터 도입된 check 블록은 인프라를 구성하기 전에 외부 리소스나 시스템 상태를 검증할 수 있도록 지원하는 기능입니다.
이 기능은 terraform plan, terraform apply 시점에서 동작하며, 리소스의 상태, 연결성, 응답 값 등을 검증하는 데 유용합니다.


check 블록 기본 개념

Terraform의 check 블록은 주로 다음과 같은 경우에 사용됩니다.

  • 배포 전 API 또는 외부 서비스가 정상 동작 중인지 확인하고 싶을 때
  • RDS, S3, DNS 등 리소스의 상태를 별도 조건으로 확인하고 싶을 때
  • 특정 변수나 입력값이 유효한지 사전에 검증하고 싶을 때

기본 문법 예제

check "health_check" {
  data "http" "terraform_io" {
    url = "https://www.terraform.io"
  }

  assert {
    condition     = data.http.terraform_io.status_code == 200
    error_message = "${data.http.terraform_io.url} returned an unhealthy status code"
  }
}

 


check 블록 실전 예제

1. 외부 API 응답 확인

check "api_check" {
  data "http" "example_api" {
    url = "https://api.example.com/health"
  }

  assert {
    condition     = data.http.example_api.status_code == 200
    error_message = "API Health Check Failed"
  }
}

2. RDS 인스턴스 상태 확인

check "rds_check" {
  data "aws_db_instance" "mydb" {
    db_instance_identifier = "my-db-instance"
  }

  assert {
    condition     = data.aws_db_instance.mydb.status == "available"
    error_message = "RDS instance is not available"
  }
}

3. Route53 DNS 레코드 존재 여부 확인

check "dns_check" {
  data "aws_route53_record" "example_com" {
    zone_id = "Z123456ABC"
    name    = "example.com"
    type    = "A"
  }

  assert {
    condition     = data.aws_route53_record.example_com.records[0] != ""
    error_message = "DNS Record is missing for example.com"
  }
}

check vs precondition vs postcondition

구분 설명 사용 사례
check 외부 리소스 또는 데이터 소스 기반 조건 검증 HTTP 응답 상태, DNS 확인, RDS 상태 검사 등
precondition 리소스 생성 전에 입력값이나 참조 값 검증 VPC CIDR 범위 검증
postcondition 리소스 생성 후 생성 결과를 조건으로 검증 S3 버킷 암호화 적용 여부 확인

check 블록 사용 시 유의사항

1. 실행 시간이 길어질 수 있음

HTTP 요청 등 외부 통신이 포함되므로 응답 시간이 느리면 terraform plan/apply 속도에 영향을 줄 수 있습니다.
불필요한 요청을 방지하기 위해 depends_on을 사용해 조건적으로 실행을 제한할 수 있습니다.

2. 상태(state)에 저장되지 않음

check 블록의 실행 결과는 .tfstate 파일에 기록되지 않으며, 매번 새로 평가됩니다.

3. 실패 시 전체 실행이 중단될 수 있음

검증 실패 시 terraform apply 자체가 중단됩니다.
예: 외부 API가 일시적으로 다운된 경우에도 전체 배포가 실패할 수 있음.


주요 활용 예 요약

목적 설명 예시
HTTP 상태 체크 외부 API 가용성 검증 REST API의 /health 응답 확인
DNS 레코드 확인 DNS 레코드 존재 여부 검증 Route53의 A 레코드 검증
DB 상태 체크 AWS 리소스 상태 확인 RDS 인스턴스가 available 상태인지 확인
변수 검증 사용자 입력 값의 유효성 확인 환경 이름이 비어 있는지 검증

 


참고 문서