有沒有辦法可以對存盤桶使用 terraform 資料呼叫(可能創建并存盤在不同的狀態檔案中),然后如果資料中沒有任何內容,則通過設定計數來創建資源?
我一直在做一些實驗,并不斷得到以下結果:
Error: Failed getting S3 bucket (example_random_bucket_name): NotFound: Not Found
status code: 404, request id: <ID here>, host id: <host ID here>
要測驗的示例代碼(已從生成此錯誤的原始代碼修改):
variable "bucket_name" {
default = "example_random_bucket_name"
}
data "aws_s3_bucket" "new" {
bucket = var.bucket_name
}
resource "aws_s3_bucket" "s3_bucket" {
count = try(1, data.aws_s3_bucket.new.id == "" ? 1 : 0 )
bucket = var.bucket_name
}
我覺得我應該得到一個空結果而不是產生錯誤,但事實并非如此。
uj5u.com熱心網友回復:
遺憾的是你不能這樣做。data sources必須存在,否則它們會出錯。TF 中沒有內置方式來檢查資源是否存在。從某種意義上說,資源可能存在,也可能不存在,兩者之間沒有任何關系。
如果您需要此類功能,則必須使用External Data Source 自行編程。或者更簡單,提供一個輸入變數bucket_exist,以便您在應用期間顯式設定它。
uj5u.com熱心網友回復:
Terraform 是一個理想狀態系統,因此您只能描述您想要的結果,而不是達到目標的步驟/條件。
如果 Terraform確實允許您根據是否已經存在該名稱的存盤桶來決定是否宣告存盤桶,那么您將創建一個永遠不會收斂的配置:在第一次運行時,它不存在,因此您的配置將宣告它. 但是在第二次運行時,存盤桶將存在,因此您的配置將不再宣告它,因此 Terraform 將計劃銷毀它。在第三次運行時,它會建議再次創建它,依此類推。
相反,作為系統設計的一部分,您必須決定哪個 Terraform 配置(或其他系統)負責管理每個物件:
- 如果您決定由特定 Terraform 配置負責管理此 S3 存盤桶,則可以使用無條件
aws_s3_bucket資源對其進行宣告。 - 如果您決定某個其他系統應該管理存盤桶,那么您將撰寫配置以從其他地方以某種方式了解存盤桶名稱,例如通過輸入變數或使用
aws_s3_bucket資料源。
uj5u.com熱心網友回復:
資料源旨在以這種方式失敗。
但是,如果您使用來自外部配置的狀態檔案,則可以output根據 s3 存盤桶是否由該狀態管理并在s3_bucket資源中作為條件使用它來在外部狀態中宣告。
例如,外部狀態的輸出將為空字串(非托管)或任何對您有用的屬性的值。布爾是另一種選擇。從此配置中洗掉資料源并根據輸出向資源添加條件。
如果任何此類解決方法使您的配置復雜化或簡化,則由您決定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380789.html
標籤:亚马逊网络服务 地形 terraform-provider
