將 Terraform 狀態儲存在 Azure 儲存體
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 金鑰保存庫 中。 然後可以使用類似下列的命令來設定環境變數。 如需 Azure 金鑰保存庫 的詳細資訊,請參閱 Azure 金鑰保存庫 檔。
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 時的常見問題進行疑難排解