Terraform 如何创建一个通用的弹性豆茎模块?

Terraform 如何创建一个通用的弹性豆茎模块?,terraform,Terraform,我正在尝试为弹性beanstalk资源创建一个可重用的terraform模块。我一直在试图弄清楚如何传入应用程序环境变量。我想这样做: //api.tf module "eb" { source = "./eb" name = "api" vpc_id = "${var.vpc_id}" ... environment = { VAR1 = "${var.var1}" VAR2 = "${var.var2}" VAR3 = "${va

我正在尝试为弹性beanstalk资源创建一个可重用的terraform模块。我一直在试图弄清楚如何传入应用程序环境变量。我想这样做:

//api.tf

module "eb" {
  source = "./eb"

  name    = "api"
  vpc_id  = "${var.vpc_id}"
  ...

  environment = {
    VAR1  = "${var.var1}"
    VAR2  = "${var.var2}"
    VAR3  = "${var.var3}"
    ...
  }  
}
./eb/eb.tf

variable "name"         { }
variable "vpc_id"       { }
variable "environment"  { type = "map" }

resource "aws_elastic_beanstalk_environment" "api" {
  name  = "${var.name}"
  ...

  setting {
    namespace   = "aws:ec2:vpc"
    name        = "VPCId"
    value       = "${var.vpc_id}"
  }

  # application environment variables

  # Here's where I'm stuck:
  # I would like to iterate over the environment map, setting name and value.
  setting {
    count       = "${length(keys(var.environment))}"
    namespace   = "aws:elasticbeanstalk:application:environment"
    name        = "${element(keys(var.environment), count.index)}"
    value       = "${lookup(var.environment, element(keys(var.environment), count.index))}"
  }
}

我的第一个问题是,选项似乎不支持计数。是否有其他方法可以实现类似的功能,以便我可以为电子商务模块提供其他设置?

我根据这个答案找到了一个解决方案:

您可以在Terraform中使用类型为“list”的变量来指定地图列表

这对我很有用:

provider aws {
  region = "us-east-1"
}

variable environment_variables {
  type = "list"
  default = [
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name = "VAR1"
      value = "Value1"
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name = "VAR2"
      value = "Value2"
    }
  ]
}

resource "aws_elastic_beanstalk_application" "app" {
  name = "temp-example-app"
}

resource "aws_elastic_beanstalk_environment" "app" {
  name = "temp-example-app"
  application = "${aws_elastic_beanstalk_application.app.id}"
  solution_stack_name = "64bit Amazon Linux 2017.03 v2.6.0 running Docker 1.12.6"

  setting = ["${var.environment_variables}"]

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "InstanceType"
    value = "t2.micro"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "EnvironmentType"
    value = "SingleInstance"
  }
}

注意:我没有指定应用程序版本,因此您可能会在应用时出错,但您应该能够在AWS控制台中看到环境变量。

我找到了基于此答案的解决方案:

您可以在Terraform中使用类型为“list”的变量来指定地图列表

这对我很有用:

provider aws {
  region = "us-east-1"
}

variable environment_variables {
  type = "list"
  default = [
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name = "VAR1"
      value = "Value1"
    },
    {
      namespace = "aws:elasticbeanstalk:application:environment"
      name = "VAR2"
      value = "Value2"
    }
  ]
}

resource "aws_elastic_beanstalk_application" "app" {
  name = "temp-example-app"
}

resource "aws_elastic_beanstalk_environment" "app" {
  name = "temp-example-app"
  application = "${aws_elastic_beanstalk_application.app.id}"
  solution_stack_name = "64bit Amazon Linux 2017.03 v2.6.0 running Docker 1.12.6"

  setting = ["${var.environment_variables}"]

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name = "InstanceType"
    value = "t2.micro"
  }
  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name = "EnvironmentType"
    value = "SingleInstance"
  }
}

注意:我没有指定应用程序版本,因此您可能会在应用时出错,但您应该能够在AWS控制台中看到环境变量。

Nice!我不知道你可以将一个列表传递给默认变量的设置选项。谢谢这很聪明,但它只在至少有一个环境变量的情况下才起作用。如果你没有,它就断了。很好!我不知道你可以将一个列表传递给默认变量的设置选项。谢谢这很聪明,但它只在至少有一个环境变量的情况下才起作用。如果你没有,它就坏了。