2017-06-21 89 views
0

我正在使用Terraform編寫AWS構建腳本。我旋轉了多個跨多個可用區的實例,在這個例子中,2:如何從另一個資源中的統計資源訪問屬性?

resource "aws_instance" "myinstance" { 
    count     = 2 
    ami      = "${var.myamiid}" 
    instance_type   = "${var.instancetype}" 
    availability_zone  = "${data.aws_availability_zones.all.names[count.index]}" 
    # other details omitted for brevity 
} 

我現在需要分配一個彈性IP到這些情況,讓我能在未來重建的情況下,不他們的IP地址在變化。下面顯示了我最好喜歡做:

resource "aws_eip" "elastic_ips" { 
    count = 2 
    instance = "${aws_instance.myinstance[count.index].id}" 
    vpc  = true 
} 

但這個錯誤有:

預計 「}」,但發現 「」

我也使用lookup嘗試:

instance = "${lookup(aws_instance.sbc, count.index).id}" 

但失敗同樣的錯誤。

我該如何去將Elastic IP附加到這些實例?

回答

1

多一點玩弄,我已經找到了答案 - 你可以索引到「圖示」語法:

instance = "${aws_instance.myinstance.*.id[count.index]}" 
1

請通過terraform interpolation - element list index

元素(列表,索引) - 從給定索引處的列表中返回單個元素。如果索引大於元素的數量,則此函數將使用標準的mod算法進行換行。此功能僅適用於平面列表。例子:

element(aws_subnet.foo.*.id, count.index) 

所以你的情況,該代碼將是:

instance = "${element(aws_instance.myinstance.*.id, count.index}" 
+0

所以這已經纏繞的額外的好處 - 還有沒有其他原因使用它,我不是看見了什麼?將來肯定會記住它,但我認爲在我的情況下,我寧願得到一個錯誤而不是環繞,因爲它應該是兩個資源之間的1-1映射。 –

+0

我以前用過你的方式,但看起來hashicorp用新的方式更新了他們的文檔。兩種方式都應該有效。 – BMW