2017-07-19 50 views
2

根據環境是生產還是非生產,我使用不同的KMS CMK創建AWS RDS實例。所以,我有使用如果terraform計數兩種資源:Terraform輸出中的插值

count = "${var.bluegreen == "nonprod" ? 1 : 0}" 

這與不同的地址不同的KMS密鑰旋轉起來的RDS實例。我需要捕獲該端點(在構建完成後我使用terraform顯示完成),那麼爲什麼不在Terraform中工作?

output "rds_endpoint" { 
    value = "${var.bluegreen == "nonprod" ? aws_db_instance.rds_nonprod.address : aws_db_instance.rds_prod.address}" 
} 
+1

我知道如何解決此問題 - kms_key_id =「$ {var.bluegreen ==」nonprod「?」arn:aws:kms:eu-west-2:1234567890:key/foo「:」arn:aws:kms :eu-west-2:1234567890:key/bar「}」在aws_db_instance資源中將aws_db_instance資源減少爲一個(從兩個)。 – Chris

回答

1

這是訪問具有count = 0資源的屬性,可惜Terraform目前在其檢查步驟,檢查兩個條件的「面」,所以像這樣的表述可能會失敗的錯誤。與此同時,目前的行爲是輸出中的錯誤沒有明確顯示,因爲當狀態尚未完成時(例如,由於使用了-target)輸出可能會被填充。在這種情況下,這些煩惱總結了很多混亂。

在這種情況下,使用「splat表達式」可以更好地使用「splat表達式」,該表達式在count = 0的情況下評估爲空列表。這看起來像下面這樣:

output "rds_endpoint" { 
    value = "${element(concat(aws_db_instance.rds_nonprod.*.address, aws_db_instance.rds_prod.*.address), 0)}" 
} 

這需要通過連接在一起的所有nonprod地址和所有督促地址創建的列表的第一個元素。由於您如何在這些資源塊上配置count,因此生成的列表將只有一個元素,因此它只會採用該元素。

一般來說,要調試輸出問題,可以幫助您評估terraform console或配置中的其他位置中的表達式,以繞過輸出上默認忽略錯誤的限制。

+0

很好的回答,我沒有考慮過「splat表達式」。從我的答案中,我可以假設另一種方法可用於我已經使用的方法?我問,因爲我看到了這種方法的意外行爲 - 例如,當計數比較應該相同時(藍綠色仍然等於nonprod),第二次運行時會破壞aws安全組規則資源。 – Chris

+0

事實上,如果你傳遞任何「」 - 即使是部分 - 都會遇到一些挑戰,那麼它的結果就會被計算出來,因爲Terraform的核心部分保守地處理所有函數。在這種情況下,我沒有預料到問題,因爲它看起來更像是「一種或另一種」情況,但是如果你用'count.index'連接它們來創建一堆相關資源,這會變得棘手。只要'bluegreen'保持設置爲'nonprod',這裏的東西應該是穩定的。 –