πŸ’Ύ Lab 4: Managing Terraform State (원격 μ €μž₯μ†Œ)

λͺ©ν‘œ: 둜컬(terraform.tfstate) 파일이 μ•„λ‹Œ, GCS 버킷을 λ°±μ—”λ“œ(Backend)둜 μ‚¬μš©ν•˜μ—¬ μƒνƒœ 파일의 μ•ˆμ „μ„±, 잠금(Locking), ν˜‘μ—… κΈ°λŠ₯을 ν™•λ³΄ν•©λ‹ˆλ‹€.

1. 사전 μ€€λΉ„: GCS 버킷 생성

Terraform이 μƒνƒœλ₯Ό μ €μž₯ν•  버킷은 Terraform으둜 λ§Œλ“€κΈ°λ³΄λ‹€, 미리 λ§Œλ“€μ–΄λ‘λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€. (Chicken-and-Egg 문제 λ°©μ§€)

# μœ λ‹ˆν¬ν•œ 버킷 이름 생성 (예: tf-state-내이름-2026)
gsutil mb -l us-central1 gs://[YOUR_UNIQUE_BUCKET_NAME]
# 예: gsutil mb -l us-central1 gs://tf-state-a1234-lab

2. backend.tf μž‘μ„±

μž‘μ—… 디렉토리: terraform-labs/lab4/

terraform {
  backend "gcs" {
    bucket  = "[YOUR_UNIQUE_BUCKET_NAME]" # μœ„μ—μ„œ λ§Œλ“  버킷 이름
    prefix  = "terraform/state"
  }
}
 
provider "google" {
  region = "us-central1"
}
 
resource "google_compute_instance" "vm_state_demo" {
  name         = "vm-state-demo"
  machine_type = "e2-micro"
  zone         = "us-central1-a"
 
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
 
  network_interface {
    network = "default"
  }
}

3. μ‹€μŠ΅ κ°€μ΄λ“œ (Migration)

  1. terraform init:
    • Terraform이 β€œλ°±μ—”λ“œλ₯Ό GCS둜 μ„€μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?”라고 λ¬»μŠ΅λ‹ˆλ‹€. yes μž…λ ₯.
    • μ΄μ œλΆ€ν„° terraform applyλ₯Ό ν•˜λ©΄ μƒνƒœ 정보가 λ‚΄ 컴퓨터가 μ•„λ‹Œ GCS 버킷에 μ €μž₯λ©λ‹ˆλ‹€.
  2. terraform plan:
    • 생성될 λ¦¬μ†ŒμŠ€μ™€ λ³€κ²½ 사항을 미리 ν™•μΈν•©λ‹ˆλ‹€.
    • Stateκ°€ λΉ„μ–΄μžˆλ‹€λ©΄ + createκ°€ 뜰 것이고, κΈ°μ‘΄ Stateλ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν–ˆλ‹€λ©΄ No changesκ°€ 뜰 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. terraform apply: λ¦¬μ†ŒμŠ€ 생성.
  4. 확인: GCP μ½˜μ†” > Cloud Storage > 버킷 > terraform/state/default.tfstate 파일이 μƒκ²ΌλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

4. 심화 μ‹€μŠ΅: Terraform Import (κΈ°μ‘΄ λ¦¬μ†ŒμŠ€ κ°€μ Έμ˜€κΈ°)

이미 λ§Œλ“€μ–΄μ§„ λ¦¬μ†ŒμŠ€λ₯Ό Terraform κ΄€λ¦¬ν•˜λ‘œ κ°€μ Έμ˜€λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

  1. μˆ˜λ™ 생성: GCP μ½˜μ†”μ—μ„œ VM(manual-vm)을 ν•˜λ‚˜ λ§Œλ“­λ‹ˆλ‹€. (e2-micro)
  2. μ½”λ“œ μž‘μ„±: main.tf에 ν•΄λ‹Ή VM의 껍데기 μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
    resource "google_compute_instance" "manual_vm" {
      # λ‚΄μš©μ€ λΉ„μ›Œλ‘κ±°λ‚˜ ν•„μˆ˜κ°’λ§Œ 채움
      name = "manual-vm"
      machine_type = "e2-micro"
      zone = "us-central1-a"
      boot_disk {}
      network_interface {}
    }
  3. κ°€μ Έμ˜€κΈ° (Import):
    # terraform import [RESOURCE_ADDRESS] [RESOURCE_ID]
    terraform import google_compute_instance.manual_vm projects/[PROJECT_ID]/zones/us-central1-a/instances/manual-vm
  4. 동기화: terraform plan을 μ‹€ν–‰ν•˜λ©΄, Terraform이 μƒνƒœ 파일과 μ‹€μ œ λ¦¬μ†ŒμŠ€μ˜ 차이λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€. μ½”λ“œλ₯Ό μ‹€μ œ 섀정에 맞게 μˆ˜μ •ν•˜μ—¬ No changesκ°€ 뜨게 λ§Œλ“­λ‹ˆλ‹€.

5. μ‹€μŠ΅ μ’…λ£Œ

  1. terraform destroy: λ¦¬μ†ŒμŠ€ μ‚­μ œ.
    • μ‚­μ œ 후에도 GCS λ²„ν‚·μ˜ tfstate νŒŒμΌμ€ λ‚¨μ•„μžˆμ–΄ 이λ ₯을 λ³΄μ‘΄ν•©λ‹ˆλ‹€.

4. πŸ€– Gemini Prompt Tip (정석 μš”μ²­λ²•)

λ°±μ—”λ“œ 섀정도 사양 λͺ©λ‘μœΌλ‘œ μš”μ²­ν•˜λ©΄ μ‹€μˆ˜λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

Prompt:

Generate Terraform backend configuration based on the following specifications:
 
*   Backend Type: gcs
*   Bucket Name: [YOUR_UNIQUE_BUCKET_NAME]
*   Prefix: terraform/state
*   Action: Configure this backend in the terraform block.

Geminiκ°€ μ •ν™•ν•œ backend "gcs" 블둝을 μƒμ„±ν•΄μ€λ‹ˆλ‹€.


Supported by gemini-3.0-pro preview