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

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

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

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

수동으로 리소스 가져오기

Terraform은 terraform import 하위 명령어를 사용하여 리소스 가져오기를 지원합니다. 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를 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 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.
    

일괄 내보내기를 사용하여 만든 리소스 가져오기

Google은 Terraform에서 배포를 관리할 수 있도록 Google Cloud 리소스를 Terraform 구성으로 내보내고 해당 리소스의 Terraform 상태를 가져오는 데 사용할 수 있는 도구를 제공합니다.

시작하기 전에

  • 구성 커넥터에 gcloud CLI를 설치합니다.

    gcloud components install config-connector
    

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

  • Cloud Asset API를 사용 설정합니다.

    gcloud services enable cloudasset.googleapis.com
    
  • Cloud Asset 서비스 에이전트 gcp-sa-cloudasset.iam.gserviceaccount.comroles/servicenetworking.serviceAgent 역할이 있는지 확인합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
      --role=roles/servicenetworking.serviceAgent
    

리소스에 대한 Terraform 코드 생성

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

gcloud beta resource-config bulk-export \
  --path=entire-tf-output \
  --project=PROJECT_ID \
  --resource-format=terraform

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

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

gcloud beta resource-config terraform generate-import entire-tf-output

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

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

    provider "google" {
    project = "PROJECT_ID"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeFirewall" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeFirewall"
    }
    
    module "entire-tf-output-projects-PROJECT_ID-ComputeBackendService-global" {
    source = "./entire-tf-output/projects/PROJECT_ID/ComputeBackendService/global"
    }
    
    ...and so on
    
  • terraform_import_20220331-19-12-33.sh와 같은 실행 가능한 셸 스크립트. 셸 스크립트에는 terraform import 명령어 목록이 포함됩니다.

    #!/bin/sh
    # Terraform Import Script generated by gcloud cli
    
    terraform import module.entire-tf-output-projects-PROJECT_ID-ComputeFirewall.google_compute_firewall.allow_ssh projects/PROJECT_ID/global/firewalls/allow-ssh
    
    ...and so on
    

    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.
    

다음 단계