비공개 보고서 저장소 매개변수화하기

AWSBeginner
지금 연습하기

소개

팀에는 서로 다른 내용을 담는 개발용 및 미리보기용 보고서 저장소가 필요합니다. 하나의 구성을 재사용하고, 버킷에서 객체로 이어지는 참조를 살펴보며, 독립적인 두 루트가 서로 다른 AWS 리소스를 관리함을 확인합니다.

첫 번째 AWS Terraform 실습과 기존의 변수 및 출력값 지식을 바탕으로 진행합니다. 도구, 접근 설정, 프로바이더 연결은 준비되어 있으며 이전 VM의 리소스를 재사용하지 않습니다.

관련 자격증 시험 항목

자격증 시험 과제 실습 내용
Cloud Practitioner (CLF-C02) Task 3.1 반복 가능한 인프라 정의와 운영 리소스 조회를 사용합니다.
Developer – Associate (DVA-C02) Task 3.3, Skill 3.3.4 인프라 정의를 배포하는 기초 실습입니다.
DevOps Engineer – Professional (DOP-C02) Task 2.1 IaC 정의를 통해 리소스를 관리하는 기초 실습입니다.

이 실습의 실제 리소스와 보존 범위를 나타낸 개념 개요입니다.

개발용 저장소 배포하기

이 단계에서는 입력 변수와 리소스 참조를 사용하여 하나의 구성으로 개발용 보고서 저장소를 생성합니다.

준비된 두 루트인 report-dev와 report-preview는 처음에 프로바이더 연결 파일만 있고 나머지는 비어 있습니다. 각 루트는 자체 로컬 상태를 유지합니다. 이는 단일 루트에서 입력값을 변경하는 것과 다릅니다. 단일 루트는 해당 루트의 상태에 이미 기록된 리소스를 계속 관리합니다.

개발용 루트로 이동하여 리소스 템플릿을 생성합니다. environment와 report 변수는 문자열 입력입니다. ${var.environment}는 버킷 이름에 환경 이름을 삽입합니다. 객체의 bucket 인수는 버킷 리소스의 ID를 참조하므로 Terraform은 의존성을 파악하고 버킷을 먼저 생성할 수 있습니다. content_type은 읽는 쪽에서 바이트를 어떻게 해석해야 하는지 알려 줍니다.

cd /home/labex/project/report-dev
cat > main.tf <<'EOF'
variable "environment" { type = string }
variable "report" { type = string }

resource "aws_s3_bucket" "reports" {
  bucket = "terraform-reports-${var.environment}"
  tags = {
    Project     = "TerraformReports"
    Environment = var.environment
  }
}

resource "aws_s3_object" "report" {
  bucket       = aws_s3_bucket.reports.id
  key          = "reports/current.csv"
  content      = var.report
  content_type = "text/csv"
}

output "bucket_name" { value = aws_s3_bucket.reports.id }
output "report_key" { value = aws_s3_object.report.key }
EOF

이 환경의 변수 파일을 생성합니다. \n 이스케이프는 보고서 문자열의 줄바꿈을 나타냅니다. 값을 분리해 두면 동일한 리소스 템플릿을 재사용할 수 있습니다.

cat > dev.tfvars <<'EOF'
environment = "dev"
report      = "orders,12\n"
EOF

이 루트를 초기화하고 유효성을 검사한 뒤 계획을 검토합니다. -var-file은 값이 담긴 파일을 선택하며, 다른 상태를 선택하지는 않습니다.

terraform init
terraform validate
terraform plan -var-file=dev.tfvars

버킷과 보고서 객체, 두 리소스가 추가되어야 합니다. 같은 입력값으로 적용하고 확인 요청이 나오면 yes를 입력합니다.

terraform apply -var-file=dev.tfvars

출력값은 버킷과 객체 키를 식별합니다. 명령 출력을 캡처하는 $(...)를 사용하여 값을 저장하고 표시하세요. -raw는 Terraform의 따옴표 없이 문자열 출력값을 표시합니다.

BUCKET=$(terraform output -raw bucket_name)
echo "$BUCKET"
KEY=$(terraform output -raw report_key)
echo "$KEY"

출력값이나 상태 항목을 데이터의 증거로 간주하지 말고 AWS를 통해 실제 저장된 보고서를 읽습니다. 응답에는 ContentType: text/csv가 포함되며 대상 파일에는 실제 바이트가 담깁니다.

aws s3api \
  get-object \
  --bucket "$BUCKET" \
  --key "$KEY" \
  dev-downloaded.csv
cat dev-downloaded.csv

orders,12가 표시되어야 합니다. AWS View에서도 terraform-reports-dev 안의 reports/current.csv를 펼쳐 볼 수 있습니다. 별도의 팀 참조 보고서는 변경하지 마세요. 배포 후 AWS View: 실제로 생성한 스토리지가 보존된 참조 보고서 옆에 표시됩니다.

별도의 상태로 템플릿 재사용하기

이 단계에서는 개발용 저장소를 유지하면서 동일한 템플릿을 미리보기용 입력값으로 배포합니다.

준비된 미리보기용 루트에는 리소스 템플릿만 복사하세요. 이 연습에서는 준비된 각 루트를 따로 초기화하므로 main.tf만 복사합니다. 다른 환경을 만들기 위해 terraform.tfstate나 초기화된 .terraform/ 디렉터리를 복제하지 마세요. 원래 리소스 또는 백엔드 매핑이 함께 전달될 수 있습니다. 의존성 잠금 파일인 .terraform.lock.hcl은 다릅니다. 이 파일은 프로바이더 버전과 체크섬을 기록하고, 구성과 함께 공유하거나 커밋할 수 있으며, 환경 리소스 매핑을 포함하지 않습니다. 미리보기용 루트에는 이미 자체 프로바이더 연결 파일이 있습니다.

cp /home/labex/project/report-dev/main.tf /home/labex/project/report-preview/main.tf
cd /home/labex/project/report-preview
cat > preview.tfvars <<'EOF'
environment = "preview"
report      = "orders,25\n"
EOF

이 루트를 초기화하고 미리보기용 계획을 검토합니다.

terraform init
terraform plan -var-file=preview.tfvars

이번에도 두 리소스가 추가되어야 하며 버킷 이름은 terraform-reports-preview여야 합니다. 예상치 못한 개발용 버킷 삭제가 나타나면 잘못된 상태를 재사용한 것입니다. 적용하고 yes를 입력합니다.

terraform apply -var-file=preview.tfvars

미리보기용 출력값과 보고서를 읽습니다. 환경 입력값은 이름과 태그를 바꾸고, 보고서 입력값은 실제 저장된 바이트를 바꿉니다.

BUCKET=$(terraform output -raw bucket_name)
echo "$BUCKET"
aws s3api \
  get-object \
  --bucket "$BUCKET" \
  --key reports/current.csv \
  preview-downloaded.csv
cat preview-downloaded.csv

orders,25가 표시되어야 합니다. 셸 디렉터리를 변경하지 않고 지정된 루트에서 명령을 실행하는 Terraform의 전역 -chdir 옵션을 사용하여 두 루트의 출력값과 상태 목록을 비교합니다.

terraform -chdir=/home/labex/project/report-dev output bucket_name
terraform -chdir=/home/labex/project/report-dev state list
terraform -chdir=/home/labex/project/report-preview output bucket_name
terraform -chdir=/home/labex/project/report-preview state list

두 루트 모두 aws_s3_bucket.reports 같은 주소를 갖지만, 각각 다른 AWS 버킷에 매핑됩니다. 개발용 데이터가 온전히 유지되었는지 확인합니다.

aws s3api \
  get-object \
  --bucket terraform-reports-dev \
  --key reports/current.csv \
  dev-retained.csv
cat dev-retained.csv

orders,12가 표시되어야 합니다. 이들은 서로 독립적인 로컬 상태이며, 워크스페이스나 공유 백엔드가 아닙니다. 변수 파일 선택에 대한 자세한 설명은 Terraform 입력 변수 문서를 참고하세요. AWS View에 독립적인 두 보고서 저장소가 보존된 팀 참조 보고서 옆에 표시됩니다.

직접 만든 두 저장소 정리하기

이 단계에서는 팀 참조 보고서를 삭제하지 않고 각 루트의 리소스를 삭제합니다.

삭제할 때도 각 루트에는 자체 입력값이 필요합니다. 개발용 삭제 계획을 검토한 다음 삭제하고 yes를 입력하세요. Terraform은 의존성을 알고 있으므로 버킷보다 먼저 객체를 삭제합니다.

terraform -chdir=/home/labex/project/report-dev plan -destroy -var-file=dev.tfvars
terraform -chdir=/home/labex/project/report-dev destroy -var-file=dev.tfvars

이제 미리보기용 루트의 리소스만 삭제하고 다시 yes로 확인합니다.

terraform -chdir=/home/labex/project/report-preview destroy -var-file=preview.tfvars

각 삭제 작업은 두 리소스가 삭제되었다고 표시합니다. 두 매핑이 모두 비어 있고 관련 없는 참조 보고서는 여전히 존재하는지 확인합니다.

terraform -chdir=/home/labex/project/report-dev state list
terraform -chdir=/home/labex/project/report-preview state list
aws s3api \
  list-buckets \
  --query 'Buckets[].Name'
aws s3api \
  head-object \
  --bucket team-reference-reports \
  --key keep.txt \
  --query ContentLength

참조 버킷만 남아 있습니다. 인증된 목록 조회가 성공해야 리소스가 없음을 입증할 수 있습니다. 접근 오류나 네트워크 오류로는 입증할 수 없습니다. 최종 검사가 끝날 때까지 준비된 자격 증명을 유지하세요.

요약

두 변수 파일로 버킷 및 객체 템플릿을 재사용하고, 실제 보고서 바이트와 Content-Type을 읽고, 각 루트의 상태를 독립적으로 유지한 뒤 자신의 두 환경만 정리했습니다.