將 Terraform 狀態儲存在 Azure 儲存體

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

Terraform 狀態可用來協調已部署的資源與 Terraform 組態。 Terraform 可透過 [狀態] 來瞭解要新增、更新或刪除哪些 Azure 資源。

根據預設,Terraform 狀態會儲存在本機,這不適合下列原因:

  • 本機狀態在小組或共同作業環境中無法正常運作。
  • Terraform 狀態可以包含敏感性資訊。
  • 在本機儲存狀態會增加意外刪除的機會。

在本文中,您將學會如何:

  • 建立 Azure 儲存體帳戶
  • 使用 Azure 記憶體來儲存遠端 Terraform 狀態。
  • 了解狀態鎖定
  • 瞭解 待用加密

1.設定您的環境

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

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 時,您可以看到鎖定。

Azure blob with lock

5.瞭解待用加密

儲存在 Azure Blob 中的數據會在保存之前加密。 如有需要,Terraform 會從後端擷取狀態,並將其儲存在本機記憶體中。 如果您使用此模式,狀態永遠不會寫入本機磁碟。

如需 Azure 儲存體 加密的詳細資訊,請參閱 Azure 儲存體 待用數據的服務加密。

對 Azure 上的 Terraform 進行疑難排解

針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解

下一步