использовать разные корзины для бэкэнда terraform s3 в зависимости от того, какая учетная запись aws настроена

Мне нужно, чтобы серверная часть terraform s3 использовала одну корзину для моей производственной учетной записи AWS, а другую корзину - для моей учетной записи AWS для разработки. Нам это нужно, потому что мы не можем разрешить пользователям из учетной записи AWS для разработки получить доступ к корзине s3 в производственной учетной записи AWS. Имена сегментов S3 должны быть глобально уникальными, поэтому поле имени сегмента не может быть одинаковым.

Я пробовал использовать здесь переменную, но ошибка переменных в бэкэндах terraform. Это очень востребованная функция, и для нее существует проблема с GitHub, но она была открыт в течение 4 лет, и, похоже, нет никаких планов по добавлению этой функции, поэтому мне нужно обходное решение. Одно предложение исходит из той же проблемы с GitHub. Предлагается использовать источник данных удаленного состояния terraform. К сожалению, это не работает. Вот что я пробовал:

// backend.tf

terraform {
  backend "s3" {}
}
data terraform_remote_state "state" {
  backend = "s3"
  config {
    bucket = var.aws_account == "123456789000" ? "my-prod-bucket" : "my-dev-bucket"
    key    = "apps/main-stack.tfstate"
    region = "us-east-1"
  }
}

Ни одно из значений не используется, и предлагается ввести все их вручную.

$ terraform init
Initializing modules...

Initializing the backend...
bucket
The name of the S3 bucket

Enter a value:

Я поискал другие решения, но пока безуспешно. Кто-нибудь знает, как это исправить?


person williamcodes    schedule 09.03.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как передать переменные для внутреннего ресурса Terraform S3?   -  person Chin Huang    schedule 09.03.2021
comment
@ChinHuang отличный ответ. Там определенно было совпадение. Я обновил свой вопрос, чтобы больше сосредоточиться на конкретной проблеме достижения паритета ведра s3 от учетной записи aws и связался с вашим ответом для более общего случая переменных в бэкэндах.   -  person williamcodes    schedule 10.03.2021


Ответы (1)


Похоже, решение состоит в том, чтобы использовать файл конфигурации серверной части. Это называется частичной конфигурацией. Вы можете сохранить файл tfvars для каждой учетной записи aws, для которой вам нужен отдельный сервер, и предоставить его при инициализации terraform следующим образом:

// prod-backend-config.tfvars

bucket = "my-prod-s3-bucket-for-terraform"
// dev-backend-config.tfvars

bucket = "my-dev-s3-bucket-for-terraform"
// backend.tf

terraform {
  backend "s3" {
    // do not set a bucket name here
    key    = "apps/main-stack.tfstate"
    region = "us-east-1"
  }
}
$ terraform init -backend-config prod-backend-config.tfvars

Это позволяет поддерживать паритет между учетными записями aws и корзинами s3 для вашего бэкэнда.

Для более общего решения по настройке любого бэкэнда с произвольными переменными см. Как передать переменные для серверного ресурса Terraform S3?

person williamcodes    schedule 09.03.2021