转换为 Terraform 的最佳实践
州
状态文件用于存储有关 Terraform 管理的资源的信息。默认情况下,Terraform 会将状态存储在本地磁盘上。如果您远程存储状态,则可以实现分布式协作、保护敏感信息,并在持续集成 (CI) 中运行 Terraform。
将 Deployment Manager 模板转换为 Terraform 并根据需要导入资源后,我们建议您按照相应步骤在 Cloud Storage 中远程存储状态。
模块
如果您想降低复杂性、强制执行一致性并提高配置的可重用性,可以使用 Terraform 模块封装资源集合。
如需使用模块,您可以执行以下任一操作:
使用 DM Convert 导出的资源创建自定义模块。这样可以最大限度地提高灵活性。
使用 Google Cloud的官方模块集合或 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 转换的每个配置都是映射到单个状态文件的单个根配置。我们不建议设置单个状态文件来存储大量资源。转换配置后,我们建议您确保新配置符合根模块最佳实践。