使用 DM Convert 的最佳做法

轉換為 Terraform 的最佳做法

狀態

狀態檔案會儲存 Terraform 管理的資源相關資訊。根據預設,Terraform 會將狀態儲存在本機磁碟。如果遠端儲存狀態,就能進行分散式協作、保護機密資訊,並在持續整合 (CI) 中執行 Terraform。

將 Deployment Manager 範本轉換為 Terraform,並視需要匯入資源後,建議您按照步驟在 Cloud Storage 中遠端儲存狀態

模組

如要降低複雜度、確保一致性,並提升設定的重複使用率,可以使用 Terraform 模組封裝資源集合。

如要使用模組,請執行下列任一操作:

在大多數情況下,建議您使用已發布的模組

建立自訂模組

  1. 轉換設定後,請找出要移至模組的資源。

  2. 將這些資源的設定移至模組目錄,並將必要變數轉換為參數。

    以下範例說明如何將 google_bigquery_datasetgoogle_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
    }
    
  3. 在匯出的 main.tf 檔案中,將原始設定替換為您建立的模組。

    以下範例顯示如何使用上一步驟範例中建立的模組進行這項替換作業。

    # main.tf
    module "bq" {
      source = "./bq-module"
    
      project_id = "PROJECT_ID"
      dataset_id = "bigquerydataset"
      table_id   = "bigquerytable"
    }
    
  4. 如要初始化本機模組,請執行下列指令:

    terraform init
    
  5. 移動與資源相關聯的 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).
    
  6. 執行下列指令,確認沒有任何資源變更:

    terraform plan
    

    以下是執行指令後收到的輸出內容範例:

    No changes. Your infrastructure matches the configuration.
    

使用已發布的模組

  1. 轉換設定後,找出已發布的模組,以及要移至該模組的資源。

  2. 請參閱模組的 說明文件,找出模組的設定選項。

  3. 建立已設定為目前資源設定的模組執行個體。

    舉例來說,如果您想將 google_bigquery_datasetgoogle_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"
          },
        }
      ]
    }
    
  4. 如要初始化本機模組,請執行下列指令:

    terraform init
    
  5. 請閱讀模組原始碼,找出上游模組中的資源位址,並建構 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"]'
    
  6. 如要查看設定的任何變更,請執行下列指令:

    terraform plan
    

如果您選取的已發布模組預設設定不同,或設定方式與您的設定不同,執行指令後可能會看到差異處。

Actuation

建議您使用持續整合 (CI) 系統 (例如 Cloud Build、Jenkins 或 GitHub Actions),自動執行大規模 Terraform 作業。詳情請參閱「使用 Terraform、Cloud Build 和 GitOps 管理基礎架構式程式碼」。

如要啟動觸發條件的建立作業並簡化驗證程序,可以選擇使用 Cloud Build Workspace 藍圖。

結構

從 DM Convert 轉換的每個設定都是單一根設定,會對應至單一狀態檔案。我們不建議設定單一狀態檔案來保存大量資源。轉換設定後,建議您確保新設定遵循根模組最佳做法