【问题标题】:Terraform: How to conditionally assign an EBS volume to an ECS ClusterTerraform:如何有条件地将 EBS 卷分配给 ECS 集群
【发布时间】:2018-01-08 14:45:13
【问题描述】:

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

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

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 块设备,一次不使用 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 指标警报等。在 2 个单独的条件下重复所有这些代码两次感觉非常不爽。我是不是在这里漏了个把戏?

感谢任何相关的 Terraform 智慧!

【问题讨论】:

  • 您使用的是哪个 AMI?

标签: terraform


【解决方案1】:

不幸的是,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}"
}

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

【讨论】:

    【解决方案2】:

    看来您实际上并不需要aws_launch_configuration 资源中的条件。

    如果您使用的是基于 Amazon Linux 优化的 AWS ECS,那么它会自动在/dev/xvdcz 附加一个设备卷,默认卷大小=22gb。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-25
      • 2019-10-19
      • 1970-01-01
      • 2017-08-12
      • 2016-11-17
      • 2020-07-31
      • 2018-07-17
      • 2021-11-04
      相关资源
      最近更新 更多