2017-08-01 42 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的條件爲你。