Przechowywanie stanu programu Terraform w usłudze Azure Storage

Narzędzie Terraform umożliwia definiowanie, wyświetlanie wersji zapoznawczej i wdrażanie infrastruktury chmury. Za pomocą narzędzia Terraform tworzysz pliki konfiguracji przy użyciu składni HCL. Składnia listy HCL umożliwia określenie dostawcy chmury — takiego jak platforma Azure — oraz elementów tworzących infrastrukturę chmury. Po utworzeniu plików konfiguracji utworzysz plan wykonywania, który umożliwia wyświetlenie podglądu zmian infrastruktury przed ich wdrożeniem. Po zweryfikowaniu zmian należy zastosować plan wykonywania w celu wdrożenia infrastruktury.

Stan narzędzia Terraform służy do uzgadniania wdrożonych zasobów z konfiguracjami programu Terraform. Stan umożliwia programowi Terraform poznanie zasobów platformy Azure do dodawania, aktualizowania lub usuwania.

Domyślnie stan narzędzia Terraform jest przechowywany lokalnie, co nie jest idealne z następujących powodów:

  • Stan lokalny nie działa dobrze w zespole ani w środowisku współpracy.
  • Stan narzędzia Terraform może zawierać informacje poufne.
  • Przechowywanie stanu lokalnego zwiększa prawdopodobieństwo przypadkowego usunięcia.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Tworzenie konta usługi Azure Storage
  • Przechowywanie zdalnego stanu programu Terraform przy użyciu usługi Azure Storage.
  • Omówienie blokowania stanu
  • Omówienie szyfrowania magazynowanych

1. Konfigurowanie środowiska

  • Subskrypcja platformy Azure: jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

2. Konfigurowanie konta magazynu stanu zdalnego

Przed użyciem usługi Azure Storage jako zaplecza należy utworzyć konto magazynu.

Uruchom następujące polecenia lub konfigurację, aby utworzyć konto i kontener usługi Azure Storage:

#!/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

Kluczowe punkty:

  • Konta usługi Azure Storage wymagają globalnie unikatowej nazwy. Aby dowiedzieć się więcej na temat rozwiązywania problemów z nazwami kont magazynu, zobacz Rozwiązywanie błędów nazw kont magazynu.
  • Stan narzędzia Terraform jest przechowywany w postaci zwykłego tekstu i może zawierać wpisy tajne. Jeśli stan jest niepoprawnie zabezpieczony, może to spowodować nieautoryzowany dostęp do systemów i utraty danych.
  • W tym przykładzie narzędzie Terraform uwierzytelnia się na koncie usługi Azure Storage przy użyciu klucza dostępu. W przypadku wdrożenia produkcyjnego zaleca się ocenę dostępnych opcji uwierzytelniania obsługiwanych przez zaplecze modułu azurerm i użycie najbezpieczniejszej opcji dla danego przypadku użycia.
  • W tym przykładzie dostęp do sieci publicznej jest dozwolony dla tego konta usługi Azure Storage. W ramach wdrożenia produkcyjnego zaleca się ograniczenie dostępu do tego konta magazynu przy użyciu zapory magazynu, punktu końcowego usługi lub prywatnego punktu końcowego.

3. Konfigurowanie stanu zaplecza terraform

Aby skonfigurować stan zaplecza, potrzebne są następujące informacje o usłudze Azure Storage:

  • storage_account_name: nazwa konta usługi Azure Storage.
  • container_name: nazwa kontenera obiektów blob.
  • key: nazwa pliku magazynu stanów, który ma zostać utworzony.
  • access_key: klucz dostępu do magazynu.

Każda z tych wartości może być określona w pliku konfiguracji narzędzia Terraform lub w wierszu polecenia. Zalecamy użycie zmiennej środowiskowej access_key dla wartości . Użycie zmiennej środowiskowej uniemożliwia zapisanie klucza na dysku.

Uruchom następujące polecenia, aby uzyskać klucz dostępu do magazynu i zapisać go jako zmienną środowiskową:

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

Kluczowe punkty:

  • Aby dodatkowo chronić klucz dostępu do konta usługi Azure Storage, zapisz go w usłudze Azure Key Vault. Zmienną środowiskową można następnie ustawić za pomocą polecenia podobnego do poniższego. Aby uzyskać więcej informacji na temat usługi Azure Key Vault, zobacz dokumentację usługi Azure Key Vault.

    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
    

Utwórz konfigurację programu Terraform z blokiem backend konfiguracji.

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"
}

Zastąp <storage_account_name> ciąg nazwą konta usługi Azure Storage.

Uruchom następujące polecenie, aby zainicjować konfigurację:

terraform init

Uruchom następujące polecenie, aby uruchomić konfigurację:

terraform apply

Plik stanu można teraz znaleźć w obiekcie blob usługi Azure Storage.

4. Omówienie blokowania stanu

Obiekty blob usługi Azure Storage są automatycznie blokowane przed dowolną operacją zapisującą stan. Ten wzorzec uniemożliwia współbieżne operacje stanu, które mogą powodować uszkodzenie.

Aby uzyskać więcej informacji, zobacz State locking in the Terraform documentation (Blokowanie stanu w dokumentacji narzędzia Terraform).

Blokada jest widoczna podczas badania obiektu blob za pomocą witryny Azure Portal lub innych narzędzi do zarządzania platformą Azure.

Azure blob with lock

5. Omówienie szyfrowania magazynowanych

Dane przechowywane w obiekcie blob platformy Azure są szyfrowane przed utrwalone. W razie potrzeby program Terraform pobiera stan z zaplecza i przechowuje go w pamięci lokalnej. Jeśli używasz tego wzorca, stan nigdy nie jest zapisywany na dysku lokalnym.

Aby uzyskać więcej informacji na temat szyfrowania usługi Azure Storage, zobacz Szyfrowanie usługi Azure Storage dla danych magazynowanych.

Rozwiązywanie problemów z programem Terraform na platformie Azure

Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform na platformie Azure

Następne kroki