Использование удаленного состояния terraform в s3 с несколькими папками

В настоящее время я использую рабочее пространство по умолчанию, и моя структура папок такая:

dev
        ├── app
        │   └── main.tf
        ├── mysql
        │   └── main.tf
        └── vpc
            └── main.tf

У меня есть бэкэнд s3, и он отлично работает для одной папки

terraform {
  backend "s3" {
    bucket         = "mybucket"
    key            = "global/s3/mykey/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-state-wellness-nonprod"
    encrypt        = true
  }
}

Я изо всех сил пытаюсь включить эту внутреннюю конфигурацию во все папки, например, я хочу использовать одно и то же бэкэнд-ведро s3 в приложении, mysql и vpc (ключи различий для Dynamodb), но пока это работает в одной папке, во второй папка terraform хочет удалить как ведро S3, так и Dynamodb.


person Illusionist    schedule 24.10.2019    source источник
comment
Как ты это делаешь? Похоже, у вас три приложения, поэтому корзина будет выглядеть так: [app | mysql | vpc]/global/s3/mykey/terraform.tfstate   -  person x80486    schedule 24.10.2019
comment
поэтому я должен создавать папки внутри ведер - чтобы мой ключ ведра в бэкэнд-блоке был похож на mybucket-app, mybucket-mysql и т. д.? Я просто запускаю terraform init и terraform apply / plan   -  person Illusionist    schedule 24.10.2019
comment
На основе предоставленных вами файлов конфигурация backend повторяется три раза, и это должно сработать. Если вы войдете в каждый каталог и запустите команды, все должно быть в порядке. И нет, вам не нужно делать что-либо вручную в этой корзине, Terraform будет управлять всеми этими файлами за вас.   -  person x80486    schedule 24.10.2019
comment
К сожалению, это не работает, terraform находит его, но когда я планирую его в новой папке, он хочет уничтожить старый бэкэнд, а затем, очевидно, все терпит неудачу   -  person Illusionist    schedule 25.10.2019


Ответы (1)


Я рекомендую вам использовать структуру module в коде терраформирования.

нравиться :

   dev
    ├──modules
    │    ├── app
    │    │   └── app.tf
    │    ├── mysql
    │    │   └── mysql.tf
    │    └── vpc
    │        └── vpc.tf
    └──main.tf

main.tf:

module "app" {
  source = "./modules/app"
...
}

module "mysql" {
  source = "./modules/mysql"
...
}

module "vpc" {
  source = "./modules/vpc"
...
}

terraform {
  backend "s3" {
    ...
  }
}

Если вы хотите применить / уничтожить каждый модуль:

terraform apply -target module.app
terraform destroy -target module.app

Видеть :

Вот репозиторий, использующий структуру module.

person GNOKOHEAT    schedule 25.10.2019
comment
Спасибо, можно мне вложенные модули? потому что часть моего кода уже находится внутри модулей в подпапках - person Illusionist; 25.10.2019
comment
затем попробуйте использовать другое рабочее пространство. он может сделать один и тот же модуль для разных ресурсов. и вы можете использовать повторяющийся модуль, просто изменив имя модуля в той же рабочей области. - person GNOKOHEAT; 25.10.2019
comment
так что в основном это работает, но у меня есть переменная в файле модуля, как мне передать их из основного файла? Это обязательная переменная - person Illusionist; 25.10.2019
comment
terraform plan -var = password = mypass выдает ошибку A variable named "password" was assigned on the command line, but the root module does not declare a variable of that name. To use this value, add a "variable" block to the configuration., она определена на уровне модуля - person Illusionist; 25.10.2019
comment
вы просматривали репозиторий? вы можете узнать, как установить переменные в modules с помощью main.tf. - person GNOKOHEAT; 26.10.2019