Terraform:如何有条件地将EBS卷分配给ECS群集

时间:2017-08-01 16:13:05

标签: terraform

我有一个ecs_cluster模块,用于定义ECS集群。我希望模块可以重复使用,这样我就可以创建具有不同配置的各种集群。因此,我希望能够选择性地指定是否在ECS主机的启动配置中创建和附加EBS卷。

我最初尝试在启动配置中的count中使用ebs_block_device,例如

variable "ebs_volume_device_name" { type = "string", default = "" }
variable "ebs_volume_type" { type = "string", default = "" }
variable "ebs_volume_size" { type = "string", default = "" }

resource "aws_launch_configuration" "launch_configuration" {
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  ebs_block_device {
    count = "${length(var.ebs_volume_device_name) > 0 ? 1 : 0}"
    device_name = "${var.ebs_volume_device_name }"
    volume_type = "${var.ebs_volume_type}"
    volume_size = "${var.ebs_volume_size}"
  }
} 

然而,这会导致以下错误:

module.ecs_cluster.aws_launch_configuration.launch_configuration: ebs_block_device.0: invalid or unknown key: count

然后我尝试两次指定launch_configuration资源,一次使用和不使用ebs块设备,例如。

variable "ebs_volume_device_name" { type = "string", default = "" }
variable "ebs_volume_type" { type = "string", default = "" }
variable "ebs_volume_size" { type = "string", default = "" }

resource "aws_launch_configuration" "launch_configuration" {
  count = "${length(var.ebs_volume_device_name) == 0 ? 1 : 0}"
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  # No specification of ebs_block_device
}

resource "aws_launch_configuration" "launch_configuration" {
  count = "${length(var.ebs_volume_device_name) > 0 ? 1 : 0}"
  name_prefix = "foo"
  image_id = "bar"
  # Irrelevant stuff removed for brevity...

  ebs_block_device {

    device_name = "${var.ebs_volume_device_name }"
    volume_type = "${var.ebs_volume_type}"
    volume_size = "${var.ebs_volume_size}"
  }
}

然而Terraform抱怨,因为资源定义了两次。

我无法更改任一资源的ID,因为我有一个自动缩放组,这取决于启动配置的名称,例如。

resource "aws_autoscaling_group" "autoscaling_group" {
  name = "foo"
  launch_configuration = "${aws_launch_configuration.launch_configuration.name}"
}

我想我可以有条件地定义2个自动缩放组并将一个映射到每个启动配置,但这感觉非常混乱。此外,这些资源本身也具有相关资源,例如cloudwatch指标警报等。在两个独立条件下重复所有此代码两次感觉非常不顺利。我在这里错过了一招吗?

感谢任何相关的Terraform智慧!

2 个答案:

答案 0 :(得分:3)

遗憾的是,count元属性仅适用于资源级别。在资源中有条件块(例如你的ebs_block_device或者例如日志记录等)是github中的terraform问题中常见的问题,据我所知,还没有解决方案。

在你的情况下,一个'技巧'可能是你的autoscaling_group.launch_configuration属性也有一个三元运算符,即

resource "aws_autoscaling_group" "autoscaling_group" {
  name = "foo"
  launch_configuration = "${length(var.ebs_volume_device_name) == 0 ? aws_launch_configuration.launch_configuration.name : aws_launch_configuration.launch_configuration2.name}"
}

或者更好的是在具有输出名称的launch_configuration模块中提取该逻辑,然后上面的内容可能看起来像

resource "aws_autoscaling_group" "autoscaling_group" {
      name = "foo"
      launch_configuration = "${module.launch_config.name}"
}

并不是说它不是丑陋的,而是那种适合你的条件。

答案 1 :(得分:0)

似乎aws_launch_configuration资源中实际上不需要此条件。

如果您使用的是基于Amazon Linux的经过优化的AWS ECS,则默认情况下,它将自动将设备卷附加到/dev/xvdcz,默认卷大小为22gb。

如果您想根据需要增加或减小该特定卷的大小,可以将该变量传递给其他变量(例如50gb)到该变量${var.ebs_volume_device_name}