Как передать настройки aws_elastic_beanstalk_environment в модуль Terraform

Я использую модуль Terraform для управления приложениями и средами AWS Elastic Beanstalk и хочу передать в модуль список переменных среды.

Из-за отсутствия лучшего решения я сейчас передаю плоский список имен и значений и объявляю фиксированное количество setting строф (см. Ниже). Кажется, это работает, если, конечно, кто-то не собирается передавать больше переменных среды, чем я ожидал.

Итак, есть ли лучший способ добиться этого?

# file: main.tf
variable env_vars {
  default = ["FIRST_ENV_VAR", "1", "SECOND_ENV_VAR", "2"]
}

provider "aws" {
  region = "eu-central-1"
}

module "beanstalk-app" {
  source   = "./beanstalk"
  env_vars = "${var.env_vars}"
}

# file: beanstalk/main.tf
variable "env_vars" {
  type = "list"
}

resource "aws_elastic_beanstalk_application" "app" {
  name = "myapp"
}

resource "aws_elastic_beanstalk_environment" "env" {
  name                = "myapp-env"
  application         = "${aws_elastic_beanstalk_application.app.name}"
  solution_stack_name = "64bit Amazon Linux 2016.03 v2.1.3 running Tomcat 8 Java 8"

  setting {
    namespace = "aws:elasticbeanstalk:application:environment"
    name      = "${element(var.env_vars, 0)}"
    value     = "${element(var.env_vars, 1)}"
  }

  setting {
    namespace = "aws:elasticbeanstalk:application:environment"
    name      = "${element(var.env_vars, 2)}"
    value     = "${element(var.env_vars, 3)}"
  }

  setting {
    namespace = "aws:elasticbeanstalk:application:environment"
    name      = "${element(var.env_vars, 4)}"
    value     = "${element(var.env_vars, 5)}"
  }
}

person otto.poellath    schedule 27.08.2016    source источник


Ответы (1)


В HCL повторяющиеся блоки объектов эквивалентны списку (см. здесь .Поэтому вы можете передать переменную (список карт) в settings.

variable "settings" {
    type = "list"
    default = [
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "FOO"
      value     = "BAR"
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name      = "BAZ"
      value     = "HAZ"
    },
  ]
}

resource "aws_elastic_beanstalk_environment" "env" {
  name                = "myapp-env"
   application         = "${aws_elastic_beanstalk_application.app.name}"
  solution_stack_name = "64bit Amazon Linux 2016.03 v2.1.3 running Tomcat 8 Java 8"
  setting = ["${var.settings}"]
}
person Valentin    schedule 04.11.2017
comment
Пока не появится Terraform 0.12, это работает, но с оговорками - см. Эту проблему - person ecoe; 12.02.2019