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

Edd*_*ant 3 terraform

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

我最初尝试countebs_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}"
  }
} 
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

module.ecs_cluster.aws_launch_configuration.launch_configuration: ebs_block_device.0: invalid or unknown key: count
Run Code Online (Sandbox Code Playgroud)

然后我尝试两次指定 launch_configuration 资源,一次使用 ebs 块设备,一次不使用 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}"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

resource "aws_autoscaling_group" "autoscaling_group" {
  name = "foo"
  launch_configuration = "${aws_launch_configuration.launch_configuration.name}"
}
Run Code Online (Sandbox Code Playgroud)

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

感谢任何相关的 Terraform 智慧!

Ste*_*n R 5

不幸的是,计数元属性仅适用于资源级别。在资源中包含条件块(例如您的 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}"
}
Run Code Online (Sandbox Code Playgroud)

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

resource "aws_autoscaling_group" "autoscaling_group" {
      name = "foo"
      launch_configuration = "${module.launch_config.name}"
}
Run Code Online (Sandbox Code Playgroud)

并不是说它不丑,而是 terraform 对您的条件。