首页 > 解决方案 > 将多个“.tfstate”和“.tfvars”文件迁移到“s3”后端

问题描述

我有一个大型遗留 terraform 设置,它使用多个本地.tfvars来表示多个堆栈。这些堆栈又具有一个.tfstate来表示它们。terraform 项目的结构如下所示

.
└── master
    └── apps
        ├── environments
        │   ├── eu
        │   │   ├── eu-prod
        │   │   │   ├── eu-prod.tfstate
        │   │   │   ├── eu-prod.tfstate.backup
        │   │   │   └── eu-prod.tfvars
        │   │   └── eu-staging
        │   │       ├── eu-staging.tfstate
        │   │       ├── eu-staging.tfstate.backup
        │   │       └── eu-staging.tfvars
        │   └── us
        │       ├── us-prod
        │       │   ├── us-prod.tfstate
        │       │   ├── us-prod.tfstate.backup
        │       │   └── us-prod.tfvars
        │       └── us-staging
        │           ├── us-staging.tfstate
        │           ├── us-staging.tfstate.backup
        │           └── us-staging.tfvars
        ├── main.tf
        ├── outputs.tf
        ├── other_resources.tf
        ├── variables.tf
        └── versions.tf

在这种情况下,您可以看到我们有 4 个主要的“环境”(或堆栈)。eu-prod, eu-staging,us-produs-staging. 但是,基本.tf文件位于master/apps. 这是用于创建每个堆栈的实际 HCL。堆栈之间唯一不同的是大小、名称和其他变量。我们使用 cli 参数来指定使用哪个集合.tfvars以及.tfstate写入哪个集合。一个例子看起来像这样(运行从master/apps

terraform apply -var-file=./environments/eu/eu-prod/eu-prod.tfvars -state=./environments/eu/eu-prod/eu-prod.tfstate

将其迁移到像后端这样的远程后端的最佳方法是什么s3?我已经能够通过这样做来设置s3后端main.tf

terraform {
  backend "s3" {
    bucket               = "foobar-terraform-state"
    key                  = "foobar/terraform.tfstate"
    region               = "us-west-1"
    dynamodb_table       = "foobar-terraform-state-lock"
    encrypt              = true
  }
}

但是我不知道如何区分不同的堆栈。我可以.tfvars为每个堆栈设置,但无法动态指定键名。

标签: migrationterraform

解决方案


推荐阅读