Перенос нескольких файлов `.tfstate` &` .tfvars` в бэкэнд `s3` - PullRequest
0 голосов
/ 23 октября 2019

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

1 Ответ

0 голосов
/ 02 ноября 2019

Я думаю, Рабочие пространства Terraform - это то, что вы можете использовать для представленного варианта использования.

У вас может быть один бэкэнд-провайдер 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"
  }
...