Terraform 상태로 Google Cloud 리소스 가져오기

Terraform은 기존 인프라를 가져올 수 있습니다. 이렇게 하면 다른 방법으로 만든 리소스를 Terraform 관리 아래로 가져올 수 있습니다.

모든 Google Cloud 리소스의 상태를 가져올 수 있습니다.

Terraform에서는 리소스를 가져오는 여러 가지 방법을 지원합니다.

한 번에 하나씩 리소스 가져오기

import 명령어는 리소스 주소와 ID 등 두 가지 인수를 사용합니다. 리소스 주소는 구성 내의 리소스 인스턴스를 가리키는 식별자입니다. ID는 가져오려는 Google Cloud의 리소스를 식별하는 식별자입니다. ID 형식은 리소스 유형에 따라 다르며, 공급업체에서 지원하는 각 리소스에 대해 문서화됩니다. 지원되는 경우 프로젝트 ID를 포함하는 전체 식별자를 사용하는 것이 좋습니다.

  • 가져올 리소스 주소를 식별합니다.

    resource "google_storage_bucket" "sample" {
     name          = "my-bucket"
     project       = "sample-project"
     location      = "US"
     force_destroy = true
    }
    

    앞에서 정의한 Cloud Storage 버킷과 같은 샘플 리소스의 경우 google_storage_bucket.sample입니다.

  • 리소스 ID 형식을 확인하려면 google_storage_bucket 리소스에 대한 제공업체 가져오기 문서를 참조하세요. 이 경우 project/name 형식이므로 이전 샘플의 리소스 ID는 sample-project/my-bucket입니다.

  • 다음과 같이 리소스 주소와 ID를 사용하여 import 문을 구성합니다.

    terraform import google_storage_bucket.sample sample-project/my-bucket
    

    출력:

    terraform import google_storage_bucket.sample sample-project/my-bucket
    google_storage_bucket.sample: Importing from ID "sample-project/my-bucket"...
    google_storage_bucket.sample: Import prepared!
    Prepared google_storage_bucket for import
    google_storage_bucket.sample: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

모듈 내 리소스 가져오기

모듈은 Terraform 구성 내에서 하나 이상의 리소스를 캡슐화합니다. 가져오기를 수행하려면 리소스 주소가 필요하기 때문에 모듈 내의 각 리소스를 개별적으로 가져와야 합니다.

  • 가져올 모듈 내의 리소스를 식별합니다.

    module "gcs_bucket" {
     source  = "terraform-google-modules/cloud-storage/google//modules/simple_bucket"
     version = "~> 3.4"
    
     name       = "my-bucket"
     project_id = "sample-project"
     location   = "us-east1"
    }
    

    리소스 주소를 식별하려면 모듈 콘텐츠를 조사하면 됩니다. 또는 구성을 적용하고 제공업체가 보고한 오류를 사용합니다. 예를 들면 다음과 같습니다.

    terraform apply
    module.gcs_bucket.google_storage_bucket.bucket: Creating...
    ╷
    │ Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict
    │
    │   with module.gcs_bucket.google_storage_bucket.bucket,
    

    이전 로그를 사용하여 module.gcs_bucket.google_storage_bucket.bucket으로 가져와야 하는 리소스 주소를 식별할 수 있습니다.

  • 리소스 ID 형식을 확인하려면 google_storage_bucket 리소스에 대한 제공업체 가져오기 문서를 참조하세요. 이 경우 project/name 형식입니다. 계획 출력에서 이름을 식별할 수 있습니다.

    출력:

    module.gcs_bucket.google_storage_bucket.bucket will be created
    + resource "google_storage_bucket" "bucket" {
        + name                        = "my-bucket"
        + project                     = "sample-project"
        ...
      }
    

    앞의 샘플에서 리소스 ID는 sample-project/my-bucket입니다.

  • 다음과 같이 리소스 주소와 ID를 사용하여 import 문을 구성합니다.

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    

    출력:

    terraform import module.gcs_bucket.google_storage_bucket.bucket sample-project/my-bucket
    module.gcs_bucket.google_storage_bucket.bucket: Importing from ID "sample-project/my-bucket"...
    module.gcs_bucket.google_storage_bucket.bucket: Import prepared!
    Prepared google_storage_bucket for import
    module.gcs_bucket.google_storage_bucket.bucket: Refreshing state... [id=sample-project/my-bucket]
    Import successful!
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

구성 기반 import 블록으로 리소스 일괄 가져오기

Terraform 버전 1.5를 사용하면 Terraform 구성에 import 블록을 추가할 수 있습니다. 이렇게 하면 가져오기 작업을 plan 작업 중에 미리 보고 apply 작업을 사용하여 실행할 수 있습니다.

코드를 수동으로 작성하는 대신 가져온 리소스에 대해 자동 코드 생성을 수행할 수도 있습니다.

import 블록에는 두 매개변수가 사용됩니다.

  • id: 가져올 클라우드 리소스의 공급업체 정의 리소스 ID입니다.

    허용된 제공업체 정의 리소스 ID는 Hashicorp Google 공급업체 문서의 리소스에 대한 가져오기 섹션을 참조하세요. 예를 들어 projects/{project}/global/networks/{name}google_compute_network 참조 페이지에 표시된 대로 VPC 네트워크의 리소스 ID입니다.

  • to: 만들려는 Terraform 리소스 주소입니다. 일반적으로 RESOURCE TYPE.NAME 형식입니다.

다음은 Virtual Private Cloud 네트워크의 import 블록 예시입니다.

import {
  # Provider-defined resource ID of the cloud resource to be imported
  id = "projects/PROJECT_ID/global/networks/my-network"

  # Terraform resource address to be created
  to = google_compute_network.my_network
}

리소스 블록을 수동으로 만든 경우 terraform plan을 실행하여 가져오기 작업을 미리 봅니다.

Terraform에서 리소스 블록을 생성하도록 하려면 -generate-config-out 플래그를 사용하여 구성을 생성할 파일을 지정합니다.

예를 들면 다음과 같습니다.

 terraform plan -generate-config-out=generated_resources.tf

생성된 코드를 검토한 후 terraform apply 작업을 실행하여 구성을 Terraform 상태로 가져옵니다.

일괄 내보내기 수행 후 생성된 리소스 가져오기

일괄 내보내기를 사용하면 Google Cloud 리소스를 Terraform 구성으로 내보내고 이러한 리소스의 Terraform 상태를 가져와 Terraform에서 배포를 관리할 수 있습니다.

시작하기 전에

  • Cloud Shell을 준비합니다.

    Cloud Shell을 실행하고 배포된 리소스의 Terraform 코드를 생성할 기본 Google Cloud 프로젝트를 설정합니다.

    이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서나 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

  • Cloud Shell에서 구성 커넥터의 명령줄 인터페이스(CLI)를 설치합니다.

    gcloud components install config-connector
    

    구성 커넥터를 사용하면 Google Cloud의 Terraform 일괄 내보내기 도구를 사용할 수 있습니다.

    ERROR: (gcloud.components.install) You cannot perform this action because the Google Cloud CLI component manager is disabled for this installation이 표시되면 대신 다음 명령어를 실행합니다.

    sudo apt-get install google-cloud-sdk-config-connector
    
  • Cloud Asset API를 사용 설정합니다.

    gcloud services enable cloudasset.googleapis.com
    

리소스에 대한 Terraform 코드 생성

  1. 아직 만들지 않았다면 프로젝트 구성을 출력할 디렉터리를 만듭니다.

    mkdir OUTPUT_DIRECTORY
    
  2. gcloud beta resource-config bulk-export 명령어를 실행하여 프로젝트의 전체 구성을 OUTPUT_DIRECTORY 경로로 출력합니다.

    gcloud beta resource-config bulk-export \
       --path=OUTPUT_DIRECTORY \
       --project=PROJECT_ID \
       --resource-format=terraform
    

생성된 코드에서 Terraform 모듈 만들기

gcloud beta resource-config terraform generate-import 명령어를 실행하여 출력 디렉터리의 콘텐츠를 가리킵니다.

gcloud beta resource-config terraform generate-import OUTPUT_DIRECTORY

이 명령어는 Terraform 모듈 및 가져오기 스크립트를 생성합니다.

  • gcloud-export-modules.tf 파일 이 파일은 하위 리소스의 모든 모듈을 가리킵니다. 이 파일의 콘텐츠는 다음과 같습니다.

    provider "google" {
     project = "PROJECT_ID"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeBackendService-global" {
     source = "./OUTPUT_DIRECTORY/projects/PROJECT_ID/ComputeBackendService/global"
    }
    

    그 밖에도 많은 사례가 있습니다.

  • terraform_import_20220331-19-12-33.sh와 같은 실행 가능한 셸 스크립트. 셸 스크립트에는 terraform import 명령어 목록이 포함되어 있습니다.

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.OUTPUT_DIRECTORY-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    

    그 밖에도 많은 사례가 있습니다.

    terraform import 명령어는 generate-import 명령어로 생성된 모듈을 Terraform 상태로 가져오기 위한 명령어입니다.

모듈을 Terraform 상태로 가져오기

  1. 초기화합니다.

    terraform init
    
  2. 스크립트를 실행합니다.

    ./terraform_import_20220331-19-12-33.sh
    

    출력:

    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Importing from ID
    "projects/PROJECT_ID/zones/us-central1-a/instances/instance-1"...
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Import prepared!
     Prepared google_compute_instance for import
    module.examples-projects-PROJECT_ID-ComputeInstance-us-central1-a.google_compute_instance.instance_1:
    Refreshing state...
    [id=projects/PROJECT_ID/zones/us-central1-a/instances/instance-1]
    
    Import successful!
    
    The resources that were imported are shown above. These resources are now in
    your Terraform state and will henceforth be managed by Terraform.
    

다음 단계