【问题标题】:Migrating from remote-state to backend in Terraform 0.9在 Terraform 0.9 中从远程状态迁移到后端
【发布时间】:2017-08-10 16:58:08
【问题描述】:

我下载了 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 用于多个环境?我在这里错过了什么?

【问题讨论】:

    标签: amazon-s3 devops terraform


    【解决方案1】:

    根据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
    

    在“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
    

    【讨论】:

      【解决方案2】:

      您对带有远程状态的 terraform 远程命令感到困惑。您不必更改 tf 文件中的任何远程状态内容。

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

      请参阅此链接中的第二个 github 评论。它对他迁移所做的事情有很好的分步程序。 https://github.com/hashicorp/terraform/issues/12792

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 2016-11-24
        • 2021-09-10
        • 2021-07-02
        • 2016-12-22
        • 2019-11-04
        • 2020-03-21
        相关资源
        最近更新 更多