Terraform 每个项目的不同后端

Terraform different backend for each project

我是 Terraform 的新手,仍在阅读文档,但尚未找到一种方法来适应我需要为特定解决方案实现的设置,希望一些好心人也许能给我一个正确方向的推动。

我正在尝试管理一组参数化模板,这些模板部署了支持我们在 GCP 中开发的新应用程序所需的一切。我想要实现的是能够将这些模板部署到三个不同的环境中,每个环境本身都在一个不同的 GCP 项目中。

计划是,根据建议,运行 terraform 并传入

a) 具体的 .tfvars 文件取决于 environment/project 部署到 (dev/test/prod)。

b) 使用 -chdir 参数告诉 Terraform 从 'infra-common' 文件夹中选取所有模板。

棘手的部分是我们希望每个环境(gcp 项目)在 gcs/storage 中托管它自己的状态文件。

我一直在查看工作区,但工作区似乎只会在单个后端上创建状态子文件夹。

问题:这个可以做吗?有更好的方法吗?

谢谢!

您可以为此使用 --backend-config。以下是实现所需行为的方法:

  • 为每个环境(dev.configtest.configprod.config)创建一个 .config 文件,其中包含相应环境的 gcs 存储桶的名称(必须已经存在)
  • 在单个 remote_state.tf 文件中指定通用后端

这是它的样子:

config/dev.config:

bucket  = "tf-state-dev"

config/test.config:

bucket  = "tf-state-test"

config/prod.config:

bucket = "tf-state-prod"

remote_state.tf:

terraform {
  backend "gcs" {
    prefix  = "terraform/state"
  }
}

然后,您可以运行初始化。因此,例如,对于开发人员来说,这看起来像:

$ terraform init --backend-config=config/dev.config

然后,您可以为环境创建一个工作区:

$ terraform workspace new dev

通过这种方法,您可以使用一组模板(实际上您可以根据当前工作区配置动态变量)。

您可以做的(我们有一个与不同云提供商具有类似设置的项目)是:

  • infra-common用作模块
  • 不是在每个环境中使用 .tfvar 个文件,而是在每个环境中使用一个单独的根模块,它调用 infra-common 作为 sub-module。

您的文件夹结构可能如下所示:

project
|-- dev
|   `-- main.tf
|-- modules
|   `-- infra-common
|       |-- main.tf
|       `-- variables.tf
|-- test
|   `-- main.tf
`-- prod
    `-- main.tf

dev/main.tf

terraform {
  backend "gcs" {
    bucket  = "tf-state-dev"
    prefix  = "terraform/state"
  }
}

module "stage" {
  source = "../modules/infra-common"

  env      = "dev"
  some_var = "value"
}

prod/main.tf

terraform {
  backend "gcs" {
    bucket  = "tf-state-prod"
    prefix  = "terraform/state"
  }
}

module "stage" {
  source = "../modules/infra-common"

  env      = "prod"
  some_var = "value"
}