2017-08-01 43 views
1

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

我最初尝试在启动配置中使用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块设备例如

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智慧!

回答

0

不幸的是,计数元属性仅适用于资源级别。在资源中有一个条件块(比如你的ebs_block_device或者例如logging或者etc)是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的条件为你。