我有一个大型的传统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-prod
和us-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
,但是无法动态指定键名。
答案 0 :(得分:0)
我认为Terraform workspaces是可以用于所呈现用例的东西。
您可以拥有一个后端提供程序s3
,并使用命令us-staging
切换到terraform apply
或terraform 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"
}