我下载了terraform 0.9并尝试按照migration guide从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。
您可以在此处找到升级指南:
我也不得不放弃变量插值,因为不再允许这样做。这是否意味着一个S3 Bucket用于多个环境?我在这里错过了什么?
答案 0 :(得分:6)
在terraform init
之后的每个升级指南(https://www.terraform.io/docs/backends/legacy-0-8.html),您还必须运行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
at" application_name /"或" application_name / env"我们添加了一个backend.config文件,如下所示:
bucket = "BUCKET_NAME"
region = "region_name"
lock = true
lock_table = "lock_table_name"
encrypt = true
我们的包装器shell脚本需要运行参数application-name
,environment
,component
和实际的terraform 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
答案 1 :(得分:0)
你对使用远程状态的terraform远程命令感到困惑。您不必更改tf文件中的任何远程状态。
不是使用terraform remote命令配置远程状态,而是使用迁移链接中提到的后端配置文件。
请参阅此链接中的第二个github评论。它有一个很好的一步一步的程序,他做了什么迁移。 https://github.com/hashicorp/terraform/issues/12792