共用方式為


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

具有鎖定的 Azure Blob

5.瞭解靜態加密

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

如需 Azure 儲存加密的詳細資訊,請參閱 Azure 靜態資料儲存服務加密。

排除 Azure 上 Terraform 的故障

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

後續步驟