我有一个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智慧!
答案 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}
。