您已在 Google Cloud中部署資源,現在需要使用 Terraform 管理基礎架構即程式碼 (IaC)。Google 提供工具,可為專案、資料夾或機構中的資源產生 Terraform 程式碼。
角色
如要取得將資產匯出至 Terraform 所需的權限,請要求管理員在機構、資料夾或專案中授予下列 IAM 角色:
-
服務用量消費者 (
roles/serviceusage.serviceUsageConsumer
) -
如果將寫入狀態設為現有 bucket (
--storage-path=BUCKET
):-
Storage 物件建立者 (
roles/storage.objectCreator
) -
Storage 物件檢視者 (
roles/storage.objectViewer
)
-
Storage 物件建立者 (
-
如果將寫入狀態至新值區:
Storage 物件檢視者 (
roles/storage.objectViewer
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
事前準備
準備 Cloud Shell。
啟動 Cloud Shell,並設定要為已部署資源產生 Terraform 程式碼的預設 Google Cloud 專案。
每個專案只需要執行一次這個指令,而且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確值,環境變數就會遭到覆寫。
在 Cloud Shell 中,安裝 Config Connector 的指令列介面 (CLI)。
gcloud components install config-connector
您可以使用 Config Connector 的 Terraform 大量匯出工具。 Google Cloud
如果看到
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 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
將輸出內容寫入目錄結構
如果尚未建立目錄,請建立要輸出專案設定的目錄:
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 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
旗標會指定要輸出的資源類型。
匯出多個資源類型
以 HCL 程式碼格式匯出 VM 執行個體和防火牆規則:
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
執行
gcloud beta resource-config bulk-export
指令並加上--resource-types-file
旗標:gcloud beta resource-config bulk-export \ --resource-types-file=types.txt \ --path=tf-output \ --project=PROJECT_ID \ --resource-format=terraform
如果專案不含特定資源類型,指令會成功執行,但不會輸出該資源類型。
疑難排解
如果看到下列錯誤訊息:
「匯出時權限遭拒。請確認已啟用 Cloud Asset Inventory API。」
請確認您已按照「事前準備」一節中的指示操作。