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

Mah*_*oni 6 amazon-s3 terraform devops

我下载terraform 0.9,并试图跟随迁移指南从移动remote-statebackend

但它似乎没有用.我换了:

data "terraform_remote_state" "state" {
  backend = "s3"
  config {
    bucket = "terraform-state-${var.environment}"
    key = "network/terraform.tfstate"
    region = "${var.aws_region}"
  }
}
Run Code Online (Sandbox Code Playgroud)

terraform {
  backend "s3" {
    bucket = "terraform-backend"
    key = "network/terraform.tfstate"
    region = "us-west-2"
  }
}
Run Code Online (Sandbox Code Playgroud)

但当我在我的terraform一个环境文件夹中运行init 时,我得到:

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

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

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

我也不得不放弃变量插值,因为这是不允许的.这是否意味着一个S3 Bucket用于多个环境?我错过了什么?

gev*_*gev 6

在您还必须运行以完成迁移之后,每个升级指南(https://www.terraform.io/docs/backends/legacy-0-8.html)将在s3更新远程状态文件.terraform initterraform plan

至于配置多个环境,我们最终使用包装器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
Run Code Online (Sandbox Code Playgroud)

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

terraform {
    backend "s3" {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

?       ??? prod
?       ?   ??? vpc
?       ?   ?   ??? backend.tf
?       ?   ?   ??? main.tf
?       ?   ?   ??? outputs.tf
?       ?   ?   ??? variables.tf
Run Code Online (Sandbox Code Playgroud)

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

bucket     = "BUCKET_NAME"
region     = "region_name"
lock       = true
lock_table = "lock_table_name"
encrypt    = true
Run Code Online (Sandbox Code Playgroud)

我们的包装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 Code Online (Sandbox Code Playgroud)

以下是典型的run-tf.sh调用的方式:

$ run-tf.sh application_name dev vpc plan

$ run-tf.sh application_name prod bastion apply
Run Code Online (Sandbox Code Playgroud)