瞭解地形變數、區域值和輸出 - AWS 規定指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

瞭解地形變數、區域值和輸出

變數可讓程式碼區塊內的預留位置加強程式碼彈性。每當重複使用代碼時,變量可以代表不同的值。地形通過它們的模塊化範圍它的變量類型之間的區別。輸入變量是可以注入到模塊中的外部值,輸出值是可以在外部共享的內部值,並且局部值始終保持在其原始範圍內。

Variables

AWS CloudFormation 使用參數來表示可從一個堆疊部署設定和重設到下一個堆疊部署的自訂值。同樣地,地形使用輸入變數或變數變量可以在 Terraform 配置文件中的任何地方聲明,並且通常使用所需的數據類型或默認值聲明。以下所有三個表達式都是有效的 Terraform 變量聲明。

variable "thing_i_made_up" { type = string } variable "random_number" { default = 5 } variable "dogs" { type = list(object({ name = string breed = string })) default = [ { name = "Sparky", breed = "poodle" } ] }

要在配置中訪問斯帕克的品種,您可以使用該變量var.dogs[0].breed。如果變數沒有預設值且未分類為 Null,則必須為每個部署設定變數的值。否則,為變量設置新值是可選的。在根模組中,您可以在指令列環境變數或 terrafor m.tfvars 檔案中設定目前的變數值。下列範例會示範如何在儲存在模組頂層目錄中的 terraform.tfvars 檔案中輸入變數值。

# terraform.tfvars dogs = [ { name = "Sparky", breed = "poodle" }, { name = "Fluffy", breed = "chihuahua" } ] random_number = 7 thing_i_made_up = "Kabibble"

dogs在此範例中,terraform.tfvars 檔案中的值會覆寫變數宣告中的預設值。如果您要在子模組中宣告變數,則可以直接在模組宣告區塊內設定變數值,如下列範例所示。

module "my_custom_module" { source = "modulesource/custom" version = "0.0.1" random_number = 8 }

聲明變量時可以使用的其他一些參數包括:

  • sensitive— 設定此項可true防止變數值暴露在 Terraform 流程輸出中。 

  • nullable— 將其設定為true允許變數沒有值。這對於未設置默認值的變量很方便。

  • description— 將變數的描述新增至堆疊的中繼資料。

  • validation— 設定變數的驗證規則。

Terraform 變量最方便的方面之一是能夠在變量聲明中添加一個或多個驗證對象。您可以使用驗證物件來新增變數必須通過的條件,否則部署失敗。您還可以設置自定義錯誤消息以在違反條件時顯示。

例如,您正在設定 Terraform 設定檔,讓團隊成員執行該檔案。在部署堆疊之前,團隊成員需要建立 terraform.tfvars 檔案來設定重要的組態值。為了提醒他們,您可以執行以下操作。

variable "important_config_setting" { type = string validation { condition = length(var.important_config_setting) > 0 error_message = "Don't forget to create the terraform.tfvars file!" } validation { condition = substr(var.important_config_setting, 0, 7) == "prefix-" error_message = "Remember that the value always needs to start with 'prefix-'" } }

如此範例所示,您可以在單一變數內設定多個條件。地形只會顯示失敗狀況的錯誤訊息。通過這種方式,您可以在變量值上強制執行各種規則。如果變數值導致管線失敗,您將確切知道原因。

局部值

如果您想要別名的模組中有任何值,請使用locals關鍵字,而不是宣告永遠不會更新的預設變數。顧名思義,locals塊包含在內部範圍為該特定模塊的術語。如果您想要轉換字串值,例如在變數值中加入前置詞以供資源名稱使用,則使用本機值可能是個不錯的解決方案。單一locals區塊可以宣告模組的所有區域值,如下列範例所示。

locals { moduleName = "My Module" localConfigId = concat("prefix-", var.important_config_setting) }

請記住,當您訪問該值時,locals關鍵字變為單數,例如local.LocalConfigId

輸出值

如果 Terraform 輸入變量就像 CloudFormation 參數,那麼你可以說 Terraform 輸出值就像輸出。CloudFormation兩者都用於公開部署堆疊中的值。但是,由於 Terraform 模組更根深蒂固於工具的結構中,因此 Terraform 輸出值也可用於將模組內的值公開給父模組或其他子模組,即使這些模組都位於相同的部署堆疊中。如果您正在構建兩個自定義模塊,並且第一個模塊需要訪問第二個模塊的 ID 值,那麼您需要將以下output塊添加到第二個模塊。

output "module_id" { value = local.module_id } Then in the first module you could use it like this: module "first_module" { source = "path/to/first/module" } resource "example_resource" "example_resource_name" { module_id = module.first_module.module_id }

由於 Terraform 輸出值可以在同一堆疊中使用,因此您也可以使用output區塊中的sensitive屬性來抑制該值,使其不會顯示在堆疊輸出中。此外,區output塊可以使用precondition區塊的方式與變數使用validation區塊相同:以確保變數遵循特定的規則集。這有助於確保在繼續部署之前,模組內的所有值都如預期般存在。

output "important_config_setting" { value = var.important_config_setting precondition { condition = length(var.important_config_setting) > 0 error_message = "You forgot to create the terraform.tfvars file again." } }