Cloud Storage 버킷에 Terraform 상태 저장


이 튜토리얼에서는 Cloud Storage 버킷에 Terraform 상태를 저장하는 방법을 알아봅니다.

기본적으로 Terraform은 상태terraform.tfstate라는 파일에 로컬로 저장합니다. 이러한 기본 구성으로 인해 여러 사용자가 동시에 Terraform을 실행하고 각 머신이 현재 인프라를 자체적으로 이해할 경우에는 팀의 Terraform 사용이 어려워질 수 있습니다.

이러한 문제를 방지하기 위해 이 페이지에서는 Cloud Storage 버킷을 가리키는 원격 상태를 구성하는 방법을 보여줍니다. 원격 상태는 Terraform 백엔드의 기능입니다.

목표

이 튜토리얼에서는 다음 작업을 처리하는 방법을 보여줍니다.

  • Terraform을 사용하여 Terraform 상태를 저장할 Cloud Storage 버킷을 프로비저닝합니다.
  • Terraform 구성 파일에 템플릿을 추가하여 로컬 백엔드에서 Cloud Storage 버킷으로 상태를 마이그레이션합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

Cloud Storage에서는 저장, 읽기 및 쓰기 작업, 네트워크 이그레스, 복제에 대한 비용이 발생합니다.

이 튜토리얼의 Cloud Storage 버킷에는 배포 기록을 유지하기 위한 객체 버전 관리가 사용 설정되어 있습니다. 객체 버전 관리를 사용 설정하면 스토리지 비용이 늘어납니다. 하지만 객체 수명 주기 관리를 구성하여 이전 상태 버전을 삭제하면 이 비용을 줄일 수 있습니다.

시작하기 전에

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Cloud Shell에는 Terraform이 사전 설치되어 있습니다.

  2. 로컬 셸을 사용하는 경우 다음 단계를 수행합니다.

  3. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  4. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  5. Cloud Storage API를 사용 설정합니다.

    gcloud services enable storage.googleapis.com
  6. Google 계정에 역할을 부여합니다. 다음 각 IAM 역할에 대해 다음 명령어를 한 번씩 실행합니다. roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • PROJECT_ID를 프로젝트 ID로 바꿉니다.
    • EMAIL_ADDRESS를 이메일 주소로 바꿉니다.
    • ROLE을 각 개별 역할로 바꿉니다.
  7. 또는 다음 권한이 포함된 커스텀 IAM 역할을 만들 수 있습니다.

    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    권장사항에 따라 여기에 저장된 버킷 및 상태 파일에 대한 액세스를 제어하는 것이 좋습니다. 기본 클라우드 관리자와 대체 또는 백업 관리자 역할을 수행하는 사람 등 소수의 사용자에게만 버킷 관리자 권한이 있어야 합니다. 다른 개발자는 버킷에서 객체 쓰기 및 읽기 권한만 가져야 합니다.

환경 준비

  1. Terraform 샘플이 포함된 GitHub 저장소를 클론합니다.

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. 작업 디렉터리로 변경합니다.

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Terraform 파일 검토

  1. main.tf 파일을 검토합니다.

    cat main.tf
    

    출력은 다음과 비슷합니다.

    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name     = "${random_id.default.hex}-terraform-remote-backend"
      location = "US"
    
      force_destroy               = false
      public_access_prevention    = "enforced"
      uniform_bucket_level_access = true
    
      versioning {
        enabled = true
      }
    }
    
    resource "local_file" "default" {
      file_permission = "0644"
      filename        = "${path.module}/backend.tf"
    
      # You can store the template in a file and use the templatefile function for
      # more modularity, if you prefer, instead of storing the template inline as
      # we do here.
      content = <<-EOT
      terraform {
        backend "gcs" {
          bucket = "${google_storage_bucket.default.name}"
        }
      }
      EOT
    }

    이 파일은 다음 리소스를 설명합니다.

    • erandom_id: Cloud Storage 버킷의 이름을 고유하게 만들기 위해 Cloud Storage 버킷 이름에 추가됩니다.
    • google_storage_bucket: 상태 파일을 저장할 Cloud Storage 버킷입니다. 이 버킷은 다음 속성을 갖도록 구성됩니다.
      • 객체가 있는 경우 버킷이 삭제되지 않도록 force_destroyfalse로 설정합니다. 그래야 버킷의 상태 정보가 실수로 삭제되지 않습니다.
      • 버킷 콘텐츠가 실수로 공개적으로 노출되지 않도록 public_access_preventionenforced로 설정합니다.
      • 액세스 제어 목록 대신 IAM 권한을 사용하여 버킷과 해당 콘텐츠에 대한 액세스를 제어할 수 있도록 uniform_bucket_level_accesstrue로 설정합니다.
      • 이전 버전의 상태가 버킷에 보존되도록 versioning이 사용 설정됩니다.
    • local_file: 로컬 파일입니다. 이 파일의 콘텐츠는 버킷이 생성된 후 Terraform이 Cloud Storage 버킷을 원격 백엔드로 사용하도록 지시합니다.

Cloud Storage 버킷 프로비저닝

  1. Terraform을 초기화합니다.

    terraform init
    

    terraform init를 처음 실행하면 main.tf 파일에 지정한 Cloud Storage 버킷이 아직 존재하지 않으므로 Terraform이 로컬 백엔드를 초기화하여 로컬 파일 시스템에 상태를 저장합니다.

  2. 구성을 적용하여 main.tf 파일에 설명된 리소스를 프로비저닝합니다.

    terraform apply
    

    메시지가 표시되면 yes를 입력합니다.

    terraform apply를 처음 실행하면 Terraform이 상태를 저장할 Cloud Storage 버킷을 프로비저닝합니다. 로컬 파일도 만듭니다. 이 파일의 콘텐츠는 Terraform에 Cloud Storage 버킷을 원격 백엔드로 사용하여 상태를 저장하도록 지시합니다.

Cloud Storage 버킷으로 상태 마이그레이션

  1. Terraform 상태를 원격 Cloud Storage 백엔드로 마이그레이션합니다.

    terraform init -migrate-state
    

    Terraform은 상태 파일이 이미 로컬에 있음을 감지하고 새 Cloud Storage 버킷에 상태를 마이그레이션하라는 메시지를 표시합니다. 메시지가 표시되면 yes를 입력합니다.

이 명령어를 실행한 후 Terraform 상태가 Cloud Storage 버킷에 저장됩니다. Terraform은 명령어를 실행하기 전 이 버킷에서 최신 상태를 가져오고 명령어를 실행한 후 버킷으로 최신 상태를 푸시합니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.

  1. main.tf 파일을 엽니다.

  2. google_storage_bucket.default 리소스에서 force_destroy 값을 true로 업데이트합니다.

  3. 업데이트된 구성을 적용합니다.

    terraform apply
    

    메시지가 표시되면 yes를 입력합니다.

  4. 상태 파일을 삭제합니다.

    rm backend.tf
    
  5. 백엔드를 로컬로 다시 구성합니다.

    terraform init -migrate-state
    

    메시지가 표시되면 yes를 입력합니다.

  6. 다음 명령어를 실행하여 Terraform 리소스를 삭제합니다.

    terraform destroy
    

    메시지가 표시되면 yes를 입력합니다.

다음 단계