【问题标题】:Terraform workspace states in different s3 buckets?不同 s3 存储桶中的 Terraform 工作区状态?
【发布时间】:2019-04-29 11:51:54
【问题描述】:

我使用 terraform 在开发和生产环境中配置资源。这些环境存在于两个不同的 aws 帐户上。我在本地有我的状态,但我现在想将它推送到 s3。问题是 terraform 将 def 和 prod 环境的状态存储在同一个 s3 存储桶中是否可以将它们分开?如果不是,有哪些替代解决方案而不拆分我的 terraform 代码库?

【问题讨论】:

  • Terraform 将在您设置的任何位置存储状态。你是如何配置你的状态的?
  • 我目前只是硬编码存储桶名称。理想情况下,我想为此目的使用某种变量,如 local.env,但我找不到一个好的方法......
  • 您不能在后端配置中使用插值,因为后端需要在该部分代码库运行之前进行配置。如果你需要可变状态配置(你需要),那么你应该考虑使用包装脚本或类似 Terragrunt 的东西。
  • @ydaetskcoR 这是有道理的。如果我只需要在后端配置之前将一个简单的变量(aws 帐户名称)传递给 terraform,那么最好的方法是什么?
  • 这对我帮助很大! github.com/hashicorp/terraform/pull/…

标签: terraform terraform-provider-aws


【解决方案1】:

我有一个围绕 terraform 的 bash 包装器,并为每个帐户创建一个状态文件以分离关注点。我还将自动化分解为许多组件以保持状态较小,以便性能不会受到影响并将状态下载和上传到存储桶:

function set_backend () {
    local STATE_PATH=$1
    if [[ $BACKEND == "s3" ]]; then
        cat << EOF > ./backend.tf
terraform {
  backend "s3" {
    bucket = "${TF_VAR_state_bucket}"
    dynamodb_table = "${DYNAMODB_STATE_TABLE}"
    key    = "terraform/$STATE_PATH/terraform.tfstate"
    region = "$REGION"
    encrypt = "true"
  }
}
provider "aws" {
  region  = "$REGION"
  version = "1.51.0"
}
provider "aws" {
  region  = "$DR_REGION"
  version = "1.51.0"
  alias = "dr"
}
provider "archive" { version = "1.1.0" }
provider "external" { version = "1.0.0" }
provider "local" { version = "1.1.0" }
provider "null" { version = "1.0.0" }
provider "random" { version = "2.0.0" }
provider "template" { version = "1.0.0" }
provider "tls" { version = "1.2.0" }
EOF
    fi
}

【讨论】:

    【解决方案2】:

    Terragrunt 是一个很好的工具,用于管理不同环境的 terraform 状态文件,并将状态文件存储在不同的存储桶中,而不是使用 terraform 工作区。

    有用的链接, https://transcend.io/blog/why-we-use-terragrunt

    https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2017-01-05
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多