转换为 Terraform 的最佳实践
州
状态文件 存储有关 Terraform 所管理资源的信息。 默认情况下,Terraform 会将状态存储在本地磁盘上。如果远程存储状态,则可以实现分布式协作, 保护敏感信息,并在持续集成 (CI) 环境中运行 Terraform。
将 Deployment Manager 模板转换为 Terraform 并根据需要导入资源后,我们建议您按照相应步骤在 Cloud Storage 中远程存储状态。
模块
如果您想降低复杂性、强制执行一致性和促进可重用性 配置的一部分 您可以使用 Terraform 模块 来封装资源集合
如需使用模块,您可以执行以下任一操作:
使用 Google Cloud 的官方模块集合或 Terraform Registry 中的已发布模块。
对于大多数用例,我们建议您使用已发布的模块。
创建自定义模块
转换配置后 确定您要移到模块中的资源。
将这些资源的配置移至模块目录,并将必需的变量转换为参数。
以下示例展示了如何将
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
如果您选择的已发布模块的默认设置不同,或者配置与您的配置不同,您可能会在运行该命令的输出中看到突出显示的差异。
执行
我们建议您使用持续集成 (CI) 系统(例如 Cloud Build、Jenkins 或 GitHub Actions)来自动大规模运行 Terraform。如需了解详情,请访问 使用 Terraform、Cloud Build 和 GitOps 以代码形式管理基础架构。
如果您想启动触发器的创建并简化身份验证,可以选择使用 Cloud Build Workspace 蓝图。
结构
DM Convert 转换的每个配置都是映射到单个状态文件的单个根配置。我们不建议设置单个状态文件来存储大量资源。转换完配置后 我们建议您确保新配置遵循 根模块的最佳实践。