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

时间:2017-03-19 11:49:57

标签: amazon-s3 devops terraform

我下载了terraform 0.9并尝试按照migration guideremote-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 Bucket用于多个环境?我在这里错过了什么?

2 个答案:

答案 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-nameenvironmentcomponent和实际的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