轉換為 Terraform 的最佳做法
狀態
狀態檔案會儲存 Terraform 管理的資源相關資訊。根據預設,Terraform 會將狀態儲存在本機磁碟。如果遠端儲存狀態,就能進行分散式協作、保護機密資訊,並在持續整合 (CI) 中執行 Terraform。
將 Deployment Manager 範本轉換為 Terraform,並視需要匯入資源後,建議您按照步驟在 Cloud Storage 中遠端儲存狀態。
模組
如要降低複雜度、確保一致性,並提升設定的重複使用率,可以使用 Terraform 模組封裝資源集合。
如要使用模組,請執行下列任一操作:
從 DM Convert 匯出的資源建立自訂模組。這樣您就能享有最大彈性。
使用 Google Cloud's 官方模組集合或 Terraform 登錄檔中的已發布模組。
在大多數情況下,建議您使用已發布的模組。
建立自訂模組
轉換設定後,請找出要移至模組的資源。
將這些資源的設定移至模組目錄,並將必要變數轉換為參數。
以下範例說明如何將
google_bigquery_dataset
和google_bigquery_table
移至模組:# bq-module/main.tf resource "google_bigquery_dataset" "bigquerydataset" { provider = google-beta default_table_expiration_ms = 36000000 location = "us-west1" dataset_id = var.dataset_id project = var.project_id } resource "google_bigquery_table" "bigquerytable" { provider = google-beta labels = { data-source = "external" schema-type = "auto-junk" } dataset_id = var.dataset_id project = var.project_id table_id = var.table_id depends_on = [ google_bigquery_dataset.bigquerydataset ] }
# bq-module/variables.tf variable "project_id" { description = "Project ID" type = string } variable "dataset_id" { description = "Dataset ID" type = string } variable "table_id" { description = "Table ID" type = string }
在匯出的
main.tf
檔案中,將原始設定替換為您建立的模組。以下範例顯示如何使用上一步驟範例中建立的模組進行這項替換作業。
# main.tf module "bq" { source = "./bq-module" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" table_id = "bigquerytable" }
如要初始化本機模組,請執行下列指令:
terraform init
移動與資源相關聯的 Terraform 狀態至模組執行個體。
如要從上一個步驟的範例中移動模組,請執行下列指令:
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.bigquerydataset terraform state mv google_bigquery_table.bigquerytable module.bq.google_bigquery_table.bigquerytable
在本例中,移動作業的輸出內容如下:
Move "google_bigquery_dataset.bigquerydataset" to "module.bq.google_bigquery_dataset.bigquerydataset" Successfully moved 1 object(s). Move "google_bigquery_table.bigquerytable" to "module.bq.google_bigquery_table.bigquerytable" Successfully moved 1 object(s).
執行下列指令,確認沒有任何資源變更:
terraform plan
以下是執行指令後收到的輸出內容範例:
No changes. Your infrastructure matches the configuration.
使用已發布的模組
請參閱模組的 說明文件,找出模組的設定選項。
建立已設定為目前資源設定的模組執行個體。
舉例來說,如果您想將
google_bigquery_dataset
和google_bigquery_table
移至官方 BigQuery 模組,以下範例會顯示模組的可能樣貌:module "bq" { source = "terraform-google-modules/bigquery/google" version = "~> 5.0" project_id = "PROJECT_ID" dataset_id = "bigquerydataset" location = "us-west1" deletion_protection = true tables = [ { table_id = "bigquerytable", friendly_name = "bigquerytable" time_partitioning = null, range_partitioning = null, expiration_time = null, clustering = [], schema = null, labels = { data-source = "external" schema-type = "auto-junk" }, } ] }
如要初始化本機模組,請執行下列指令:
terraform init
請閱讀模組原始碼,找出上游模組中的資源位址,並建構 move 指令。
terraform state mv google_bigquery_dataset.bigquerydataset module.bq.google_bigquery_dataset.main terraform state mv google_bigquery_table.bigquerytable 'module.bq.google_bigquery_table.main["bigquerytable"]'
如要查看設定的任何變更,請執行下列指令:
terraform plan
如果您選取的已發布模組預設設定不同,或設定方式與您的設定不同,執行指令後可能會看到差異處。
Actuation
建議您使用持續整合 (CI) 系統 (例如 Cloud Build、Jenkins 或 GitHub Actions),自動執行大規模 Terraform 作業。詳情請參閱「使用 Terraform、Cloud Build 和 GitOps 管理基礎架構式程式碼」。
如要啟動觸發條件的建立作業並簡化驗證程序,可以選擇使用 Cloud Build Workspace 藍圖。
結構
從 DM Convert 轉換的每個設定都是單一根設定,會對應至單一狀態檔案。我們不建議設定單一狀態檔案來保存大量資源。轉換設定後,建議您確保新設定遵循根模組最佳做法。