각 환경에 자체 상태 할당하기

AWSBeginner
지금 연습하기

소개

두 환경과 각 환경의 유효한 상태 객체가 이미 존재하지만, preview 작업 루트는 잘못된 환경의 상태를 선택하고 있습니다. 루트와 키의 올바른 관계를 설정하고 dev에 영향을 주지 않으면서 preview만 변경하세요.

이전 단원에서 다룬 로컬 모듈, 원격 S3 상태, Terraform 자체 잠금 개념을 알고 있어야 합니다. 이 독립적인 새 환경에는 두 보고서 저장소와 두 상태가 모두 포함되어 있습니다. 이전 VM이나 개인 AWS 계정은 필요하지 않습니다.

관련 자격증 시험 항목

자격증 시험 과제 실습 내용
CloudOps Engineer – Associate (SOA-C03) Task 3.1, Skill 3.1.6 사용 중인 리소스를 보존하면서 검토된 구성 및 상태 변경으로 인프라를 유지관리하는 Terraform 기초 실습입니다.

실습 개요

개념도: 유지관리 작업은 구성, 상태, 기존 보고서 스토리지 사이의 관계를 보존합니다.

변경 전에 각 환경 식별하기

이 단계에서는 두 환경과 하나의 환경에 대한 두 복사본을 구분합니다. 아래의 각 루트는 자체 변수와 기존 보고서 버킷을 갖습니다. 유효한 두 원격 상태는 버전 관리되는 environment-team-state 백엔드에 이미 존재합니다.

cd /home/labex/project/environment-states
cat dev/terraform.tfvars
cat preview/terraform.tfvars

입력값은 isolated-dev-reports와 isolated-preview-reports를 지정합니다. 루트 디렉터리나 변수 파일이 상태를 자동으로 격리해 주지는 않습니다. 백엔드 버킷과 키가 Terraform에서 사용할 매핑을 선택합니다.

preview 루트가 선택한 리소스를 확인합니다.

terraform -chdir=preview state show aws_s3_bucket.reports

preview 입력값은 다른 버킷을 설명하지만 현재 dev 버킷 ID가 표시됩니다. 현재 백엔드 선택을 확인합니다.

cat preview/environment.s3.tfbackend

캐시된 백엔드와 파일은 environments/dev.tfstate를 선택합니다. 의도한 키들은 이미 별도로 존재합니다.

aws s3api \
  list-objects-v2 \
  --bucket environment-team-state \
  --prefix environments/

environments/dev.tfstate와 environments/preview.tfstate가 모두 있는지 확인하세요. AWS View에도 두 보고서 저장소가 모두 표시됩니다. 각 report.txt 객체를 펼쳐 서로 다른 원래 데이터를 확인하세요.

안전하지 않은 preview 계획을 적용하지 않고 살펴봅니다.

terraform -chdir=preview plan

이 계획은 preview 입력값을 dev의 매핑에 맞추려고 하므로 잘못된 버킷을 교체하자고 제안할 수 있습니다. 적용하지 마세요. 변수값이 다르다고 해서 다른 환경의 상태에 대한 소유권을 가져오라는 뜻은 아닙니다.

상태를 복사하지 않고 기존 preview 상태 선택하기

이 단계에서는 preview 루트를 이미 유효한 자체 상태에 다시 연결합니다. 마이그레이션은 현재 매핑을 다른 백엔드로 복사합니다. 재구성은 캐시된 백엔드 선택을 버리고 이전 매핑을 복사하지 않은 채 요청한 기존 백엔드를 초기화합니다.

dev 파일은 변경하지 마세요. preview의 버킷과 키 선택을 수정합니다.

cat > preview/environment.s3.tfbackend <<'HCL'
bucket       = "environment-team-state"
key          = "environments/preview.tfstate"
region       = "us-east-1"
use_lockfile = true
HCL

-reconfigure로 해당 기존 키를 초기화합니다. 제공된 연결 파일은 환경 선택과 별도로 유지됩니다.

terraform -chdir=preview init \
  -reconfigure \
  -backend-config=backend-connection.hcl \
  -backend-config=environment.s3.tfbackend

여기서는 -migrate-state나 -force-copy를 사용하지 마세요. 선택된 dev 상태를 preview의 유효한 키에 복사하면 preview의 관리 기록을 선택하는 것이 아니라 덮어쓰게 됩니다.

terraform -chdir=preview state show aws_s3_bucket.reports
terraform -chdir=preview plan

ID isolated-preview-reports와 No changes가 표시되어야 합니다. dev를 독립적으로 확인합니다.

terraform -chdir=dev state show aws_s3_bucket.reports
terraform -chdir=dev plan

dev는 여전히 isolated-dev-reports를 선택하고 No changes가 표시됩니다. 두 유효한 키와 두 원래 보고서를 모두 온전히 유지해야 합니다. 이는 환경 선택이며 손상된 상태 복구가 아닙니다.

preview 변경이 preview에만 적용됨을 확인하기

이 단계에서는 올바른 연결을 설정한 뒤 preview 리비전만 변경합니다. terraform.tfvars는 해당 루트에 선언된 변수의 값을 제공합니다. 소스 구성과 리소스 주소는 환경 간에 동일하게 유지할 수 있습니다.

cat > preview/terraform.tfvars <<'HCL'
bucket_name = "isolated-preview-reports"
environment = "preview"
revision = "two"
HCL

preview 계획을 검토합니다.

terraform -chdir=preview plan -out=preview.tfplan

0 to add, 1 to change, 0 to destroy가 표시되어야 하며, preview 리비전 태그에만 영향을 주어야 합니다. 같은 루트에서 저장된 계획을 적용합니다.

terraform -chdir=preview apply preview.tfplan

각 환경의 현재 태그를 확인합니다.

aws s3api \
  get-bucket-tagging \
  --bucket isolated-preview-reports

preview에는 Environment=preview와 Revision=two가 있어야 합니다.

aws s3api \
  get-bucket-tagging \
  --bucket isolated-dev-reports

dev에는 여전히 Environment=dev와 Revision=one이 있어야 합니다. 두 원래 보고서를 읽습니다.

aws s3 \
  cp s3://isolated-preview-reports/report.txt -
aws s3 \
  cp s3://isolated-dev-reports/report.txt -

preview daily report와 dev daily report가 표시되어야 합니다. 백그라운드 검사는 dev의 원래 상태 바이트, 두 객체 버전, 두 백엔드 키에 있는 리소스 매핑도 비교합니다.

terraform -chdir=preview plan
terraform -chdir=dev plan

두 루트 모두 No changes를 보고해야 합니다. 두 보고서 저장소와 백엔드는 소유자를 위해 유지하세요. 디렉터리 이름, for_each 키, Terraform 변수는 명시적인 상태 격리를 대신하지 못합니다. dev의 다른 작업 복사본은 의도적으로 같은 dev 키를 선택해야 하지만 preview는 자체 키를 선택해야 합니다.

요약

작업 복사본과 환경을 구분하고, 백엔드 재구성으로 기존 상태를 선택하며, preview만 업데이트했을 때 dev 리소스, 데이터, 상태가 변경되지 않았음을 확인했습니다.