У меня есть большая устаревшая настройка 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
длякаждый стек, но не могу указать имя ключа динамически.