您已经在 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
将输出写入目录结构
创建一个目录以将项目配置输出到该目录(如果尚未创建该目录):
mkdir OUTPUT_DIRECTORY
将项目的整个配置导出到该目录:
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
使用文件指定要导出的资源类型
创建名为
tf-output
的目录。cd && mkdir tf-output && cd tf-output
创建一个名为
types.txt
的文件,并添加资源类型列表。例如:ComputeBackendBucket ComputeBackendService ComputeForwardingRule
运行带有
--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。”
确保您已按照准备工作部分中的说明操作。