我下载了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"
}
}
然而,当我在我的一个环境文件夹中运行terraform
init 时,我得到:
弃用警告:此环境配置为使用旧版 远程状态。远程状态在 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-name
、environment
、component
和实际的地形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