소개
구성의 형식과 구조가 유효해도 보고서 환경의 레이블은 잘못될 수 있습니다. 팀에서는 전달 계획을 신뢰하기 전에 작은 스토리지 모듈의 입력값, 출력값, 계획된 태그를 확인하는 실행 가능한 검사가 필요합니다.
모듈 계약을 작성하고, 지원되는 두 환경과 지원되지 않는 입력 하나를 테스트하며, 실제 비즈니스 요구 사항의 결함으로 작업을 중단하게 합니다. 모듈 변수와 출력값, 이전 실습의 형식 및 유효성 검사 관문을 이해하고 있어야 합니다. 기존 참조 스토리지는 변경되지 않아야 합니다.
관련 자격증 시험 항목
| 자격증 | 시험 과제 | 실습 내용 |
|---|---|---|
| DevOps Engineer – Professional (DOP-C02) | Task 1.2 | 실행 가능한 모듈 어설션을 자동 품질 관문에 통합하는 기초 실습입니다. |

입력 계약 정의하기
이 단계에서는 스토리지 모듈이 허용할 환경 입력값을 정의합니다. 입력 유효성 검사는 리소스 계획을 만들기 전에 지원되지 않는 요청을 거부합니다.
제공된 모듈로 이동하여 준비된 도구 환경을 불러옵니다.
cd /home/labex/project/report-module
source environment.sh
인터페이스와 리소스 구현을 읽습니다.
cat variables.tf main.tf outputs.tf pipeline.json
environment는 preview 또는 review를 선택하며, bucket_prefix는 호출 측의 스토리지 이름을 구별합니다. 버킷 이름은 두 입력값을 결합하고, Environment 태그와 출력값은 요청한 환경을 식별해야 합니다. 제공된 main.tf, outputs.tf, provider.tf, run-job.py는 보존 대상이므로 최종 내용이 변경되지 않아야 합니다. 여러분의 작업 대상은 variables.tf, tests/, pipeline.json입니다.
environment에 validation 블록을 추가합니다. contains는 지원 목록에 포함되는지 확인합니다. condition이 거짓이면 제공된 오류 메시지가 나옵니다. 따옴표를 사용한 here-document는 HCL을 그대로 씁니다.
cat > variables.tf <<'EOF'
variable "environment" {
type = string
default = "preview"
validation {
condition = contains(["preview", "review"], var.environment)
error_message = "Choose preview or review."
}
}
variable "bucket_prefix" {
type = string
default = "delivery-contract"
}
EOF
변경 내용의 형식을 정리합니다.
terraform fmt
지원되지 않는 요청을 시도합니다. -var는 이번 호출의 값을 제공합니다. 이 명령은 의도적으로 Terraform 명령 자체의 종료 코드 1을 반환합니다. production 버킷을 제안하는 대신 Choose preview or review.를 표시해야 합니다.
terraform plan -input=false -var=environment=production
유효성 검사는 허용되는 인터페이스를 정의합니다. 다음 단계에서는 테스트로 허용되는 두 값과 이 예상된 거부를 모두 확인합니다.
어설션 작성 및 실제 실패 관찰하기
이 단계에서는 Terraform 자체의 terraform test로 모듈의 계획된 동작을 검사합니다. 형식 검사와 유효성 검사는 하드 코딩된 잘못된 출력값도 허용할 수 있지만, 어설션은 계산된 결과를 요청한 입력값과 비교합니다.
Terraform은 tests/ 아래의 .tftest.hcl 파일을 읽습니다. 각 run은 독립적인 테스트 시나리오입니다. 명시적인 command = plan은 적용하지 않고 계획을 평가합니다. 테스트 파일은 tests/ 아래에 .tftest.hcl 형식으로 유지하세요. 이 실습에서는 모든 실행이 계획 모드와 제공된 프로바이더 및 모듈을 사용해야 합니다. 대체 모듈, 프로바이더 모의 객체, 오버라이드는 과제 범위 밖입니다. bucket_prefix는 테스트 모음 입력값에서 상속받도록 유지하세요. 호출 측에서 다른 유효한 접두사를 선택할 수 있도록 파일 수준 또는 실행 수준 테스트 변수에서 이 값을 할당하지 마세요. 이 테스트는 알려진 계획 값을 확인하며 실제 생성, 실행 시점 권한, 배포된 애플리케이션을 확인하지 않습니다.
테스트 디렉터리를 생성합니다. mkdir -p는 필요하면 디렉터리를 만들며 이미 존재해도 사용할 수 있습니다.
mkdir -p tests
기본 환경과 다른 환경에 대한 어설션을 작성합니다. var는 해당 실행의 입력값을 가리키고, 리소스 참조는 계획된 값을 확인하며, output은 모듈 출력값을 가리킵니다. expect_failures는 지정된 변수 유효성 검사가 실패하도록 요구합니다. 임의의 프로바이더 오류나 네트워크 오류를 테스트 성공으로 바꾸지는 않습니다.
cat > tests/contract.tftest.hcl <<'EOF'
run "preview_contract" {
command = plan
assert {
condition = output.environment == var.environment
error_message = "The output must identify the requested environment."
}
assert {
condition = aws_s3_bucket.reports.bucket == "${var.bucket_prefix}-${var.environment}"
error_message = "The bucket name must use the requested prefix and environment."
}
assert {
condition = aws_s3_bucket.reports.tags.Environment == var.environment
error_message = "The planned tag must identify the requested environment."
}
}
run "review_contract" {
command = plan
variables { environment = "review" }
assert {
condition = output.environment == var.environment
error_message = "The alternate environment must not use the default label."
}
assert {
condition = aws_s3_bucket.reports.bucket == "${var.bucket_prefix}-${var.environment}"
error_message = "The alternate bucket must use its requested inputs."
}
assert {
condition = aws_s3_bucket.reports.tags.Environment == var.environment
error_message = "The alternate environment tag must match its input."
}
}
run "unsupported_environment" {
command = plan
variables { environment = "production" }
expect_failures = [var.environment]
}
EOF
테스트와 모듈 파일의 형식을 재귀적으로 정리합니다.
terraform fmt -recursive
테스트 모음을 실행합니다.
terraform test
세 실행이 모두 통과하고 성공 요약이 표시되어야 합니다. 테스트 버킷은 배포되지 않습니다. 입력값과 출력값은 구성된 프로바이더를 사용하는 실제 Terraform 계획에서 나옵니다.
어설션이 현실적인 결함을 찾아내는지 확인합니다. 환경 출력값만 임시로 고정된 기본 레이블로 교체하고 버킷 이름 출력값은 유지하세요.
cat > outputs.tf <<'EOF'
output "environment" {
value = "preview"
}
output "bucket_name" {
value = aws_s3_bucket.reports.bucket
}
EOF
테스트 모음을 다시 실행합니다. 이 명령은 의도적으로 Terraform 명령 자체의 종료 코드 1을 반환합니다. 다른 환경에 대한 어설션이 실패하여 유효한 HCL도 모듈 계약을 위반할 수 있음을 보여 주어야 합니다.
terraform test
Git에서 제공된 출력 구현을 복구합니다. 작성한 유효성 검사와 테스트는 유지하면서 임시 결함을 제거합니다.
git restore -- outputs.tf
수정된 구현을 같은 어설션으로 실행합니다.
terraform test
모든 실행이 다시 통과해야 합니다. 테스트는 하나의 기본 출력값만 알아보는 것이 아니라 올바른 입력값을 허용해야 합니다.
테스트로 전달 작업 중단시키기
이 단계에서는 정적 검사 관문과 계획 사이에 모듈 테스트를 배치합니다. 제공된 실행기는 준비된 요소입니다. run-job.py를 변경하지 말고 단계 구성을 편집하세요.
fmt/validate 뒤, plan 앞에 test를 추가합니다.
cat > pipeline.json <<'EOF'
{"stages":["fmt","validate","test","plan"]}
EOF
전체 작업을 실행합니다.
python3 run-job.py
네 단계가 모두 통과해야 합니다. 이 모듈이 아직 적용되지 않았으므로 최종 계획의 Terraform 명령 자체가 종료 코드 2를 반환할 수 있습니다. 실행기는 이를 성공적인 미리보기로 처리합니다. 반면 테스트가 실패하면 계획 단계 전에 작업이 중단되어야 합니다. 적용 단계는 없습니다.
다른 유효한 버킷 접두사로 테스트 모음을 실행합니다. 이 -var는 모듈이나 테스트를 편집하지 않고 테스트 모음의 입력값을 변경합니다.
terraform test -var=bucket_prefix=audit-contract
동일한 세 실행이 통과해야 합니다. 이 연습에서는 모든 실행에서 bucket_prefix를 호출 측에서 상속받도록 유지하세요. 테스트 파일 또는 실행 수준의 variables 블록에서 값을 할당하지 마세요. 그렇게 할당하면 CLI 테스트 입력값을 덮어써 이 명령이 요청한 접두사를 테스트하지 못하게 됩니다. 지원되는 두 환경을 모두 테스트하려면 환경 오버라이드는 여전히 필요합니다. 요청된 입력값으로 만든 어설션은 호출 측에서 다른 유효한 이름을 선택해도 계속 작동합니다.
기존 참조 보고서를 스토리지에서 직접 읽습니다. 준비된 이 버킷들은 다른 환경의 소유이므로 삭제하거나 변경하지 마세요.
aws s3 cp s3://delivery-reference-reports/report.txt -
여전히 reference report v1이라고 표시되어야 합니다. 인접 데이터도 확인합니다.
aws s3 cp s3://delivery-reference-neighbor/keep.txt -
preserve contract neighbor가 표시되어야 합니다. 테스트는 스토리지 리소스를 생성하지 않았으므로 삭제할 테스트 스택이 없습니다. 최종 검사를 위해 입력 계약, 테스트, 파이프라인 구성을 유지하세요. 임시 출력 결함은 이미 제거되었습니다.
요약
지원되는 입력 계약을 정의하고, Terraform 자체의 계획 모드 테스트로 계획된 출력값과 태그를 입력값과 비교하며, 실제 어설션 실패를 관찰했습니다. 그런 다음 기존 데이터와 업무 상태를 보존하면서 테스트를 전달 품질 관문에 포함했습니다.
계획 모드 테스트는 배포된 동작을 입증하지 않습니다. 이후 전달 단계에서는 이 검사들을 검토된 구체적인 계획 및 실제로 통제된 적용과 결합합니다. 여기서 연습한 방식은 공식 Terraform test 참조와 테스트 구성 문서를 참고하세요.



