Terraform 允許對雲端基礎結構進行定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。
Terraform 狀態可用來協調已部署的資源與 Terraform 組態。 狀態可讓 Terraform 知道要新增、更新或刪除哪些 Azure 資源。
根據預設,Terraform 狀態會儲存在本機,這不適合下列原因:
- 本地狀態在小組或共同作業環境中運作不佳。
- Terraform 狀態屬性可能會包含敏感性資訊。
- 在本機儲存狀態會增加意外刪除的機會。
在本文中,您將學會如何:
- 建立 Azure 儲存體帳戶
- 使用 Azure 記憶體來儲存遠端 Terraform 狀態。
- 了解狀態鎖定
- 瞭解 靜態加密
1.設定您的環境
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
設定 Terraform:如果您尚未這麼做,請使用下列其中一個選項來設定 Terraform:
2.設定遠端狀態記憶體帳戶
使用 Azure 記憶體作為後端之前,您必須先建立記憶體帳戶。
執行下列命令或組態來建立 Azure 記憶體帳戶和容器:
#!/bin/bash
RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate
# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location eastus
# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob
# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME
重點:
- Azure 記憶體帳戶需要全域唯一的名稱。 若要深入瞭解如何針對記憶體帳戶名稱進行疑難解答,請參閱 解決記憶體帳戶名稱的錯誤。
- Terraform 狀態會以純文本儲存,而且可能包含秘密。 如果安全狀態不當,可能會導致未經授權的存取,進而造成資料流失。
- 在此範例中,Terraform 會使用存取密鑰向 Azure 記憶體帳戶進行驗證。 在生產部署中,建議您評估 azurerm 後端支援的可用 驗證選項 ,並針對您的使用案例使用最安全的選項。
- 在此範例中,此 Azure 記憶體帳戶允許公用網路存取。 在生產部署中,建議使用 記憶體防火牆、服務端點或私人端點來限制此儲存體帳戶的存取。
3.設定 terraform 後端狀態
若要設定後端狀態,您需要下列 Azure 記憶體資訊:
- storage_account_name:Azure 記憶體帳戶的名稱。
- container_name:Blob 容器的名稱。
- 鍵:要建立的狀態存放檔案的名稱。
- access_key:記憶體存取金鑰。
這些值都可以在 Terraform 組態檔或命令行上指定。 建議您針對 access_key 值使用環境變數。 使用環境變數可防止金鑰寫入磁碟。
執行下列命令以取得記憶體存取金鑰,並將其儲存為環境變數:
ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY
重點:
若要進一步保護 Azure 記憶體帳戶存取密鑰,請將它儲存在 Azure Key Vault 中。 然後可以使用類似下列的命令來設定環境變數。 如需 Azure Key Vault 的詳細資訊,請參閱 Azure Key Vault 檔。
export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
建立含有 backend 組態區塊的 Terraform 組態。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
backend "azurerm" {
resource_group_name = "tfstate"
storage_account_name = "<storage_account_name>"
container_name = "tfstate"
key = "terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "state-demo-secure" {
name = "state-demo"
location = "eastus"
}
將 <storage_account_name> 取代成您的 Azure 儲存體帳戶名稱。
執行下列命令來初始化組態:
terraform init
執行下列命令以執行組態:
terraform apply
您現在可以在 Azure 記憶體 Blob 中找到狀態檔案。
4.了解狀態鎖定
Azure 儲存體 Blob 會在寫入狀態的任何操作之前自動鎖定。 此模式會防止並行狀態作業,這可能會導致損毀。
如需詳細資訊,請參閱 Terraform 檔中 的狀態鎖定 。
當您透過 Azure 入口網站或其他 Azure 管理工具檢視 Blob 時,您可以看到鎖。
5.瞭解靜態加密
儲存在 Azure Blob 中的數據會在保存之前加密。 如有需要,Terraform 會從後端擷取狀態,並將其儲存在本機記憶體中。 如果您使用此模式,狀態永遠不會寫入本機磁碟。
如需 Azure 儲存加密的詳細資訊,請參閱 Azure 靜態資料儲存服務加密。
排除 Azure 上 Terraform 的故障
針對在 Azure 上使用 Terraform 時的常見問題進行疑難解答