계획 전에 유효하지 않은 인프라 구성 거부하기

ShellBeginner
지금 연습하기

소개

팀에는 이미 Terraform으로 관리하는 보고서 스토리지가 있습니다. 자동 배포를 추가하기 전에, 형식이 잘못되었거나 구조적으로 유효하지 않은 구성이 계획 단계에 도달하기 전에 거부하는 작업이 필요합니다.

두 가지 정적 검사 관문을 구성하고, 각 관문이 실제 작업을 중단하는 것을 확인한 뒤 구성을 수정합니다. Terraform 구성, 계획과 상태, 기본적인 Git 사용법, 셸 종료 상태를 이미 이해하고 있어야 합니다. 준비된 환경에서는 개인 AWS 계정이 필요하지 않습니다.

관련 자격증 시험 항목

자격증 시험 과제 실습 내용
DevOps Engineer – Professional (DOP-C02) Task 1.2 후속 전달 단계 앞에 자동 정적 검사를 배치하고 실패를 나타내는 종료 상태에서 중단하는 기초 실습입니다.

품질 관문 개요: 구성은 plan 전에 fmt와 validate를 통과하며, 실패하면 후속 단계가 중단되고 기존 스토리지와 상태는 변경되지 않습니다.

계획 전에 검사 추가하기

이 단계에서는 제공된 순차 실행 작업에 정적 검사를 연결합니다. 기존 버킷과 보고서는 배경 인프라입니다. 이 실습에서는 해당 데이터와 Terraform 상태를 변경하지 않아야 합니다.

Terminal 인터페이스를 사용하세요. 제공된 Git 저장소로 이동하여 도구 환경을 불러옵니다. source는 준비된 변수를 현재 셸에 적용하며 인프라를 배포하지 않습니다.

cd /home/labex/project/report-delivery
source environment.sh

리소스 구성과 현재 작업 단계를 살펴봅니다. cat은 각 파일을 출력하므로 작업이 무엇을 관리하고 무엇을 실행하는지 확인할 수 있습니다.

cat main.tf pipeline.json

버킷에는 Purpose 태그가 있습니다. 현재 작업에는 plan 단계만 있습니다. 계획이 성공했다는 사실만으로 형식 검사와 구조 검사가 먼저 실행되었다고 입증할 수는 없습니다.

terraform fmt -check는 파일을 다시 쓰지 않고 Terraform의 표준 형식을 검사합니다. terraform validate는 지원되는 리소스 속성을 포함하여 초기화된 구성의 내부 일관성을 검사합니다. 어느 쪽도 구성이 비즈니스 요구 사항을 충족함을 입증하지는 않습니다. 모듈 어설션은 다음 실습에서 다룹니다.

제공된 실행기는 단계 이름을 고정된 Terraform 명령에 매핑하고 첫 번째 오류에서 중단합니다. run-job.py는 변경하지 마세요. 여러분의 과제는 제공된 실행기를 다시 작성하는 것이 아니라 pipeline.json을 구성하는 것입니다. 검사는 실행 동작을 평가하기 전에 사용 중인 진입점이 제공된 원본과 일치하는지 확인합니다. 두 검사를 모두 계획 단계 앞에 추가하세요. here-document는 구분자 사이의 JSON을 pipeline.json에 씁니다. EOF를 따옴표로 감싸면 내용이 그대로 보존됩니다.

cat > pipeline.json <<'EOF'
{"stages":["fmt","validate","plan"]}
EOF

Python 표준 인터프리터로 작업을 실행합니다. 이는 학습용 로컬 실행기이며, 각 단계는 표준 Terraform 명령을 실행합니다.

python3 run-job.py

[fmt] native exit 0, [validate] native exit 0, [plan] native exit 0이 표시되어야 합니다. 제공된 인프라가 이미 구성과 일치하므로 계획에는 변경 사항이 없다고 표시됩니다. 오류가 발생하면 후속 단계가 중단됩니다. 변경 사항이 있는 계획에서는 Terraform 명령 자체가 종료 코드 2를 반환합니다. 실행기는 이를 성공적인 미리보기로 처리하며, 적용해도 된다는 허가로 간주하지 않습니다.

Git으로 변경 사항을 확인합니다. --는 경로를 명령 옵션과 구분합니다.

git diff -- pipeline.json

diff에는 두 새 관문이 모두 plan 앞에 표시되어야 합니다. 이 작업에는 적용 단계가 없습니다.

형식 오류에서 중단하기

이 단계에서는 유효한 HCL 표현식에 표준 형식과 다른 공백을 넣은 뒤, 형식 검사 관문이 계획 전에 작업을 중단하는지 확인합니다.

작은 출력 블록을 추가합니다. >>는 기존 파일 끝에 내용을 덧붙입니다. 공백을 줄인 형식은 의도한 것이며, 이 출력은 새 리소스를 관리하지 않습니다.

cat >> main.tf <<'EOF'

output "format_probe" {value="spacing"}
EOF

작업을 다시 실행합니다. 이 명령은 실패해야 하며, 그 실패가 확인하려는 결과입니다.

python3 run-job.py

첫 번째 단계에는 Terraform 명령 자체가 반환한 종료 코드 3이 표시되고 main.tf가 나열됩니다. 작업은 Job stopped; later stages did not run.을 출력합니다. [validate]나 [plan] 줄은 없어야 합니다. 형식은 AWS에 접속하지 않고 수정할 수 있습니다.

제안된 정확한 형식 변경 사항을 확인합니다. -diff는 변경 사항을 표시하고 -check는 파일을 변경하지 않습니다.

terraform fmt -check -diff

이 명령도 의도적으로 0이 아닌 종료 상태를 반환합니다. 이 단계의 검사를 위해 형식 오류를 그대로 두세요. 다음 단계에서 수정합니다.

형식과 유효성 구분하기

이 단계에서는 형식을 수정한 뒤, 구조적 유효성 검사만 찾아낼 수 있는 다른 오류를 추가합니다.

먼저 Terraform이 파일의 공백을 직접 수정하도록 합니다. -check 없이 fmt를 실행하면 형식이 변경됩니다.

terraform fmt

출력에 main.tf가 나열됩니다. 수정한 구성이 작업을 통과하는지 확인합니다.

python3 run-job.py

모든 단계가 실행되어야 합니다. 추가된 출력으로 인해 계획 단계의 Terraform 명령 자체가 종료 코드 2를 반환할 수 있습니다. 이는 출력 변경을 제안할 뿐 적용하지는 않습니다.

이제 S3 버킷 리소스가 제공하지 않는 속성에 대한 참조를 추가합니다. 이 블록은 표준 형식을 사용하므로 첫 번째 관문을 통과할 수 있습니다.

cat >> main.tf <<'EOF'

output "missing" {
  value = aws_s3_bucket.reports.missing_attribute
}
EOF

먼저 형식만 검사합니다.

terraform fmt -check

아무것도 출력하지 않고 0을 반환합니다. 그런 다음 전체 작업을 실행합니다.

python3 run-job.py

형식 검사 관문은 통과하고, 이어서 validate 단계에는 Terraform 명령 자체가 반환한 종료 코드 1과 Unsupported attribute 진단이 표시되어야 합니다. 계획 단계의 줄은 없어야 합니다. 표현식의 형식은 올바르지만 지원하지 않는 속성을 참조하고 있습니다. 단계 검사를 위해 이 오류를 그대로 두세요.

구성 복구 및 환경 보존하기

이 단계에서는 유효한 것으로 확인된 리소스 구성을 복구하고, 검사 관문이 포함된 작업을 다시 실행한 뒤 보고서 스토리지가 변경되지 않았는지 확인합니다.

git restore -- main.tf는 이 파일만 저장소의 시작 커밋 상태로 복구합니다. 두 실험용 출력을 모두 제거하며 별도로 변경한 pipeline.json은 유지합니다.

git restore -- main.tf

전체 작업을 다시 실행합니다.

python3 run-job.py

세 단계 모두에서 Terraform 명령 자체가 종료 코드 0을 반환해야 합니다. 계획에는 변경 사항이 없다고 표시되어야 합니다. 정적 검사를 통과하면 계획을 실행할 수 있지만, 배포를 승인하거나 적용하는 것은 아닙니다.

스토리지에서 보고서를 직접 읽습니다. -는 내용을 다른 로컬 복사본으로 저장하는 대신 표준 출력으로 보냅니다.

aws s3   cp s3://delivery-gates-reports/report.csv -

예상 내용:

quarter,total
Q1,320

이 실습에서 보존해야 하는 인접 보고서를 확인합니다.

aws s3   cp s3://delivery-gates-neighbor/keep.txt -

여전히 preserve neighboring report라고 표시되어야 합니다. 최종 Git diff를 검토하여 계속 유지되는 변경 사항이 파이프라인 구성인지 확인하세요.

git diff -- main.tf pipeline.json

준비된 두 버킷 모두 삭제하지 마세요. 이들은 팀 소유의 기존 인프라입니다. 작업에는 배포 단계나 계획 저장 단계가 없으므로 정리할 새 클라우드 리소스나 계획 아티팩트가 남지 않습니다. 임시 출력 실험은 main.tf를 복구하면서 제거되었습니다. 최종 검사를 위해 품질 관문을 유지하세요.

요약

계획 전에 형식 검사와 구조적 유효성 검사를 수행하는 순차 실행 Terraform 작업을 만들었습니다. 형식 오류와 별개의 미지원 속성 오류가 후속 단계를 중단하는 것을 확인한 뒤, 구성을 수정하고 보고서 데이터와 상태를 보존했습니다.

정적 유효성은 품질을 확인하는 한 가지 계층입니다. 다음 실습에서는 실행 가능한 모듈 어설션으로 유효한 구성이 의도한 동작을 만드는지 검사합니다. 여기서 사용한 검사는 공식 fmt 참조와 validate 참조를 참고하세요.