terraform 中不同环境的多个后端

Multiple backends for different environments in terraform

我曾经使用多个 运行 不同 "terraform remote config" 命令的 .sh 文件在不同 Google 云项目的不同环境(开发、测试和产品).

对于 0.9.0 版,我了解到这现在进入了一个 .tf 文件:

terraform {
  backend "gcs" {
    bucket = "terraform-state-test"
    path   = "terraform.tfstate"
    project = "cloud-test"
  }
}

在版本 0.9.0 中现在还有状态环境 ("terraform env"):

resource "google_container_cluster" "container_cluster" {
  initial_node_count = "${terraform.env == "prod" ? 5 : 1}"
}

但是我现在应该如何使用新的后端配置在同一目录结构中管理多个环境?

在撰写本文时,并非 Terraform 中的所有远程后端都已更新为支持状态环境。对于那些有的,每个后端都有自己的约定来表示如何在数据存储中表示现在的多个状态。

从版本 0.9.2 开始,"consul"、"s3" 和 "local" 后端已更新。 "gcs" 后端还没有,但是一旦有了这里描述的过程也将适用于它。

最初有一个 "default" 环境,但如果您从未 运行 terraform apply 选择此环境,那么您可以忽略它并随意命名您的环境。

要创建一个名为 "production" 的新环境并切换到它:

terraform env new production

这将在后端建立一个完全独立的状态,因此 terraform plan 应该表明所有资源都需要重新创建。

您可以像这样在现有环境之间切换:

terraform env select production

在 0.9 之前,许多团队(包括您的团队)都编写了包装器脚本来模拟这种行为。很可能这些脚本在存储后端中没有完全遵循相同的命名约定,因此需要一些手动工作才能迁移。

进行该迁移的一种方法是使用 "local" 后端开始,它将状态存储在名为 terraform.state.d 的本地目录中。在本地工作时,您可以创建所需的环境,然后使用先前脚本解决方案中的现有状态文件小心地覆盖本地目录中的空状态文件。一旦所有本地环境都具有适当的状态,您就可以将配置中的 backend 块更改为适当的远程后端和 运行 terraform init 以触发所有本地环境的迁移环境到新后端。

此后,terraform env select 命令将开始在 远程 环境而不是本地环境之间切换。

如果您选择的远程后端尚不支持环境,最好暂时继续使用脚本解决方案。这意味着使用 the partial configuration pattern 替换现有包装器脚本中的 terraform remote config 以将特定于环境的配置传递到 terraform init.