Назад | Перейти на главную страницу

Динамическая переменная Terraform

Я создаю подсети как часть отдельного шаблона terraform и экспортирую идентификаторы следующим образом.

output "subnet-aza-dev" {
  value = "${aws_subnet.subnet-aza-dev.id}"
}
output "subnet-azb-dev" {
  value = "${aws_subnet.subnet-azb-dev.id}"
}
output "subnet-aza-test" {
  value = "${aws_subnet.subnet-aza-test.id}"
}
output "subnet-azb-test" {
  value = "${aws_subnet.subnet-azb-test.id}"
}
...

Затем я намерен найти эти идентификаторы в другом шаблоне, который повторно используется для предоставления нескольких сред. Пример ниже показывает, что мой второй шаблон вызывает модуль для предоставления экземпляра EC2 и проходит через subnet_id.

variable "environment" {
    description = "Environment name"
    default     = "dev"
}

module "sql-1-ec2" {
  source     = "../modules/ec2winserver_sql"
  ...
  subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-dev}" 
}

Я бы хотел передать переменную среды как часть поиска subnet_id, например.

subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-${var.environment}"

Однако я знаю, что интерполяция переменных не поддерживается. Я пробовал использовать карту внутри первого шаблона terraform, чтобы экспортировать их все в «подсеть», которую я затем мог бы использовать для поиска из второго шаблона. Это не сработало, так как я не мог выводить переменные внутри карты.

Такой шаблон проектирования я использовал ранее с CloudFormation, но я гораздо новичок в терраформе. Я упустил что-то очевидное?

Я думаю, что карта вывода - это правильный подход. Я не уверен, что пошло не так, когда вы это попробовали, но попробуйте что-нибудь вроде:

output "subnets_map" {
  dev = "${aws_subnet.subnet_aza_dev.id}"
  test = "${aws_subnet.subnet_aza_test.id}"
}

затем

subnet_id = "${data.terraform_remote_state.env_shared.subnets_map[var.environment]}"

Кстати, я думаю, что в HCL лучше использовать подчеркивания, а не дефисы.