Cloud Storage 버킷에 Terraform 상태 저장

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

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

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

비용

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

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

시작하기 전에

  1. 사용자 계정에 필요한 Cloud Storage 권한이 있는지 확인합니다.
    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    IAM 페이지로 이동

    역할과 권한에 대해 자세히 알아보기

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

  2. Cloud Shell 시작

    Cloud Shell은 Compute Engine 가상 머신입니다. 이 가상 머신과 연결된 서비스 사용자 인증 정보는 자동으로 수행되므로 서비스 계정 키를 설정하거나 다운로드할 필요가 없습니다.

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

    gcloud services enable storage.googleapis.com
    

Cloud Storage 버킷에 상태를 저장하도록 Terraform 구성

다음 단계에서는 Cloud Storage 버킷을 만들고 백엔드 구성을 새 버킷 및 Google Cloud 프로젝트로 변경합니다.

버킷 만들기

  1. main.tf와 같은 Terraform 구성 파일에 다음 google_storage_bucket Terraform 리소스를 추가합니다.

    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name          = "${random_id.bucket_prefix.hex}-bucket-tfstate"
      force_destroy = false
      location      = "US"
      storage_class = "STANDARD"
      versioning {
        enabled = true
      }
    }

    코드 스니펫에서 location 필드는 US에 하드 코딩됩니다. 즉 미국에서 멀티 리전 버킷이 생성됩니다. 이 필드를 원하는 위치로 변경합니다.

  2. terraform apply를 실행하여 스토리지 버킷을 만듭니다.

적용이 실패하면 버킷 이름이 전역적으로 고유하지 않기 때문일 수 있습니다. 다음 섹션에서는 이 문제를 해결하는 방법을 보여줍니다.

고유한 버킷 이름 만들기

버킷 이름을 전역적으로 고유하게 만들려면 임의 ID를 만들기 위한 Terraform 플러그인을 포함할 수 있습니다.

// Terraform plugin for creating random IDs
resource "random_id" "instance_id" {
  byte_length = 8
}

그런 후 버킷 name 속성에서 임의 ID를 사용합니다.

resource "google_storage_bucket" "default" {
  name = "bucket-tfstate-${random_id.instance_id.hex}"
  ...
}

terraform apply 명령어를 재실행합니다.

백엔드 구성 변경

  1. 다음 텍스트를 backend.tf라는 새 Terraform 구성 파일에 추가합니다.

    terraform {
     backend "gcs" {
       bucket  = "BUCKET_NAME"
       prefix  = "terraform/state"
     }
    }
    

    새 Cloud Storage 버킷 이름과 일치하도록 BUCKET_NAME을 업데이트합니다.

  2. terraform init를 실행하여 Terraform 백엔드를 구성합니다.

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

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

다음 단계