将多个.tfstate和.tfvars文件迁移到s3后端

时间:2019-10-23 17:28:26

标签: migration terraform

我有一个大型的传统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-prodeu-stagingus-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,但是无法动态指定键名。

1 个答案:

答案 0 :(得分:0)

我认为Terraform workspaces是可以用于所呈现用例的东西。

您可以拥有一个后端提供程序s3,并使用命令us-staging切换到terraform applyterraform plan之前的terraform workplace select us-staging工作场所。

您还可以使用工作区选择存储状态的s3键。 不太确定这种方法是否真的有效,但是您可以尝试一下。

backend "s3" {
    bucket = "mybucket"
    # using the us-staging / us-production / etc workspace 
    key    = "${terraform.workspace}"
    region = "us-east-1"
  }