Terraform 형식을 사용하여 Google Cloud 리소스 내보내기

Google Cloud에 리소스를 배포했으므로 이제 Terraform으로 코드형 인프라(IaC)를 관리해야 합니다. Google에서는 프로젝트, 폴더 또는 조직의 리소스에 대해 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
    
  • Cloud 애셋 서비스 에이전트(gcp-sa-cloudasset.)에 roles/servicenetworking.serviceAgent 역할이 있는지 확인합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset. \
      --role=roles/servicenetworking.serviceAgent
    
  • Cloud 애셋 서비스 에이전트(gcp-sa-cloudasset.)에 roles/storage.objectAdmin 역할이 있는지 확인합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset. \
      --role=roles/storage.objectAdmin
    

제한사항

Terraform Google 제공업체에서 지원되더라도 일부 리소스 유형은 Terraform 형식으로 내보내기가 지원되지 않습니다. Terraform 형식으로 내보내기에 지원되는 리소스 유형 목록을 보려면 gcloud beta resource-config list-resource-types 명령어를 실행합니다.

Terraform HCL 코드로 전체 프로젝트 구성 내보내기

gcloud beta resource-config bulk-export --resource-format=terraform 명령어는 프로젝트, 폴더 또는 조직에 구성된 리소스를 내보내고 HCL 코드 형식으로 화면에 출력합니다.

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

디렉터리 구조에 출력 쓰기

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

    mkdir OUTPUT_DIRECTORY
    
  2. 프로젝트 전체 구성을 디렉터리로 내보냅니다.

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

    --path 플래그는 HCL 코드를 출력할 위치를 지정합니다.

명령어를 실행하면 각 리소스의 HCL 코드가 다음 디렉터리 구조의 별도 .tf 파일로 출력됩니다.

OUTPUT_DIRECTORY/projects/PROJECT_ID/RESOURCE_TYPE

단일 파일에 출력 쓰기

출력을 화면에 출력하거나 별도의 .tf 파일을 만들지 않으려면 다음 예시와 같이 모든 출력을 단일 파일에 작성합니다.

gcloud beta resource-config bulk-export \
  --resource-format=terraform \
  --project=PROJECT_ID \
  >> gcp_resources.tf

출력 필터링

리소스 유형을 지정하여 일괄 내보내기 명령어의 출력을 필터링합니다.

필터링할 지원되는 리소스 유형 나열

Terraform 형식으로 내보내기에 지원되는 리소스 유형 목록을 보려면 gcloud beta resource-config list-resource-types 명령어를 실행합니다.

gcloud beta resource-config list-resource-types

원하는 경우, 파일에 출력을 작성합니다.

gcloud beta resource-config list-resource-types >> strings.txt

출력에서 Compute Engine VM의 리소스 유형은 다음과 같이 나열됩니다.

KRM KIND: ComputeInstance

KRM KIND: 프리픽스는 무시해도 됩니다.

단일 리소스 유형 내보내기

ComputeInstance와 같은 문자열을 사용하여 프로젝트의 특정 리소스 유형을 HCL 코드 형식으로 내보냅니다.

gcloud beta resource-config bulk-export \
  --resource-types=RESOURCE_TYPE \
  --project=PROJECT_ID \
  --resource-format=terraform

--resource-types 플래그는 출력할 리소스 유형을 지정합니다.

여러 리소스 유형 내보내기

VM 인스턴스 및 방화벽 규칙을 HCL 코드 형식으로 내보냅니다.

gcloud beta resource-config bulk-export \
  --resource-types=ComputeFirewall,ComputeInstance \
  --project=PROJECT_ID \
  --resource-format=terraform

파일을 사용하여 내보낼 리소스 유형 지정

  1. tf-output 디렉터리를 만듭니다.

    cd && mkdir tf-output && cd tf-output
    
  2. types.txt라는 파일을 만들고 리소스 유형 목록을 추가합니다. 예를 들면 다음과 같습니다.

    ComputeBackendBucket
    ComputeBackendService
    ComputeForwardingRule
    
  3. --resource-types-file 플래그와 함께 gcloud beta resource-config bulk-export 명령어를 실행합니다.

    gcloud beta resource-config bulk-export \
     --resource-types-file=types.txt \
     --path=tf-output \
     --project=PROJECT_ID \
     --resource-format=terraform
    

프로젝트에 특정 리소스 유형이 없으면 명령어는 성공하지만 아무 리소스 유형도 출력되지 않습니다.

문제 해결

다음 오류가 표시되는 경우:

'내보내기 중에 권한이 거부되었습니다. Cloud 애셋 인벤토리 API가 사용 설정되어 있는지 확인하세요.'

시작하기 전에 섹션의 안내를 따랐는지 확인합니다.

다음 단계