转换为 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读取模块源代码 以确定上游模块中的资源地址并构建 移动命令。
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
如果您选择的已发布模块具有不同的默认设置或配置与您的配置不同,则运行该命令后,您可能会在输出中看到突出显示的不同之处。
执行
我们建议您使用持续集成 (CI) 系统(例如 Cloud Build、Jenkins 或 GitHub Actions)来自动大规模运行 Terraform。如需了解详情,请访问 使用 Terraform、Cloud Build 和 GitOps 以代码形式管理基础架构。
如果您想引导创建触发器并简化身份验证, 可以选择使用 Cloud Build Workspace 蓝图。
结构
DM Convert 中的每个转换后的配置都是一个 单个根配置 映射到单个状态文件。我们不建议设置单个状态文件来保存大量资源。转换配置后, 我们建议您确保新配置遵循 根模块的最佳实践。