使用 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
    

如果您选择的已发布模块的默认设置不同,或者配置与您的配置不同,您可能会在运行该命令的输出中看到突出显示的差异。

执行

我们建议您使用持续集成 (CI) 系统(例如 Cloud Build、Jenkins 或 GitHub Actions)来自动大规模运行 Terraform。如需了解详情,请访问 使用 Terraform、Cloud Build 和 GitOps 以代码形式管理基础架构

如果您想启动触发器的创建并简化身份验证,可以选择使用 Cloud Build Workspace 蓝图。

结构

DM Convert 转换的每个配置都是映射到单个状态文件的单个根配置。我们不建议设置单个状态文件来存储大量资源。转换完配置后 我们建议您确保新配置遵循 根模块的最佳实践