将 Google Cloud 资源导出为 Terraform 格式

您已经在 Google Cloud 中部署了资源,现在需要使用 Terraform 来管理基础架构即代码 (IaC)。Google 提供了一个工具,可用于为项目、文件夹或组织中的资源生成 Terraform 代码。

准备工作

  • 准备 Cloud Shell。

    启动 Cloud Shell,并设置一个默认 Google Cloud 项目,您将在该项目中为已部署的资源生成 Terraform 代码。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

  • 在 Cloud Shell 中,安装 Config Connector 的命令行界面 (CLI)。

    gcloud components install config-connector
    

    借助 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
    
  • 创建用于此导出操作的服务账号:

    gcloud beta services identity create --service=cloudasset.googleapis.com
    
  • 确保 Cloud Asset Service Agent (gcp-sa-cloudasset.iam.gserviceaccount.com) 具有 roles/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
    
  • 确保 Cloud Asset Service Agent (gcp-sa-cloudasset.iam.gserviceaccount.com) 具有 roles/storage.objectAdmin 角色:

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

限制

系统不支持某些资源类型导出为 Terraform 格式,即使它们受 Terraform Google 提供商支持也是如此。如需查看支持导出为 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 虚拟机的资源类型如下所示:

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 标志指定要输出的资源类型。

导出多个资源类型

以 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 Asset Inventory API。”

确保您已按照准备工作部分中的说明操作。

后续步骤