在 Terraform 0.9 中从远程状态迁移到后端



我下载了terraform 0.9,并尝试按照迁移指南从remote-state移动到backend

但它似乎不起作用。我替换了:

data "terraform_remote_state" "state" {
backend = "s3"
config {
bucket = "terraform-state-${var.environment}"
key = "network/terraform.tfstate"
region = "${var.aws_region}"
}
}

terraform {
backend "s3" {
bucket = "terraform-backend"
key = "network/terraform.tfstate"
region = "us-west-2"
}
}

然而,当我在我的一个环境文件夹中运行terraforminit 时,我得到:

弃用警告:此环境配置为使用旧版 远程状态。远程状态在 Terraform 0.9 中发生了重大变化。 请更新您的远程状态配置以使用新的"后端" 设置。目前,Terraform将继续使用您现有的 设置。旧版远程状态支持将在 Terraform 中删除 0.11.

您可以在此处找到升级指南:

https://www.terraform.io/docs/backends/legacy-0-8.html

我还必须放弃变量插值,因为不再允许这样做。这是否意味着一个 S3 存储桶用于多个环境?我在这里错过了什么?

根据升级指南 (https://www.terraform.io/docs/backends/legacy-0-8.html)terraform init后,您还必须运行terraform plan来完成迁移,这将更新 s3 上的远程状态文件。

至于为多个环境进行配置,我们最终使用了一个包装 shell 脚本,其中包含传入${application_name}/${env}/${project}参数,并使用部分配置。

对于这样的项目结构:

├── projects
│   └── application-name
│       ├── dev
│       │   ├── bastion
│       │   ├── db
│       │   ├── vpc
│       │   └── web-cluster
│       ├── prod
│       │   ├── bastion
│       │   ├── db
│       │   ├── vpc
│       │   └── web-cluster
│       └── backend.config
└── run-tf.sh

对于每个 application_name/env/component = 文件夹(即 dev/vpc),我们添加了一个占位符后端配置文件,如下所示:backend.tf

terraform {
backend "s3" {
}
}

其中,每个组件的文件夹内容如下所示:

│       ├── prod
│       │   ├── vpc
│       │   │   ├── backend.tf
│       │   │   ├── main.tf
│       │   │   ├── outputs.tf
│       │   │   └── variables.tf

在"application_name/"或"application_name/env"级别,我们添加了一个backend.config文件,如下所示:

bucket     = "BUCKET_NAME"
region     = "region_name"
lock       = true
lock_table = "lock_table_name"
encrypt    = true

我们的包装外壳脚本需要参数application-nameenvironmentcomponent和实际的地形cmd运行。

run-tf.sh 脚本的内容(简体):

#!/bin/bash
application=$1
envir=$2
component=$3
cmd=$4
tf_backend_config="root_path/$application/$envir/$component/backend.config"
terraform init -backend=true -backend-config="$tf_backend_config" -backend-config="key=tfstate/${application}/${envir}/${component}.json" 
terraform get
terraform $cmd

下面是典型的 run-tf.sh 调用的样子:

$ run-tf.sh application_name dev vpc plan
$ run-tf.sh application_name prod bastion apply

你把 terraform 远程命令和远程状态混淆了。您不必更改 tf 文件中的任何远程状态内容。

而不是使用 terraform 远程命令配置远程状态,而是使用迁移链接中提到的后端配置文件。

请参阅此链接中的第二个 github 评论。它有很好的一步一步的过程,关于他做了什么来迁移。 https://github.com/hashicorp/terraform/issues/12792

最新更新