Terraform은 기존 인프라를 가져올 수 있습니다. 이렇게 하면 다른 방법으로 만든 리소스를 Terraform 관리 아래로 가져올 수 있습니다.
모든 Google Cloud 리소스의 상태를 가져올 수 있습니다.
Terraform은 다음과 같이 여러 가지 방법으로 리소스를 가져올 수 있습니다.
terraform import
하위 명령어를 사용하여 한 번에 하나씩 가져오기- 구성에
import
블록을 포함하여 일괄 가져오기(Terraform 버전 1.5 이상 필요) - 일괄 내보내기를 수행한 후 리소스를 가져올 수 있는 Google Cloud 기능을 사용하여 일괄 가져오기
리소스 한 번에 하나씩 가져오기
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 형식입니다.
다음은 가상 프라이빗 클라우드(VPC) 네트워크의 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 코드 생성
아직 프로젝트의 구성을 출력할 디렉터리를 만들지 않았다면 지금 만듭니다.
mkdir OUTPUT_DIRECTORY
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 상태로 가져오기
초기화합니다.
terraform init
스크립트를 실행합니다.
./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.