Lagra Terraform-tillstånd i Azure Storage

Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna tillämpar du körningsplanen för att distribuera infrastrukturen.

Terraform-tillstånd används för att stämma av distribuerade resurser med Terraform-konfigurationer. Med tillståndet kan Terraform veta vilka Azure-resurser som ska läggas till, uppdateras eller tas bort.

Terraform-tillståndet lagras som standard lokalt, vilket inte är idealiskt av följande skäl:

  • Det lokala tillståndet fungerar inte bra i ett team eller en samarbetsmiljö.
  • Terraform-tillstånd kan innehålla känslig information.
  • Om du lagrar tillståndet lokalt ökar risken för oavsiktlig borttagning.

I den här artikeln kan du se hur du:

  • Skapa ett Azure Storage-konto
  • Använd Azure Storage för att lagra fjärrtillstånd för Terraform.
  • Förstå tillståndslåsning
  • Förstå kryptering i vila

1. Konfigurera din miljö

  • Azure-prenumeration: Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

2. Konfigurera fjärrtillståndslagringskonto

Innan du använder Azure Storage som serverdel måste du skapa ett lagringskonto.

Kör följande kommandon eller konfiguration för att skapa ett Azure Storage-konto och en container:

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

Viktiga punkter:

  • Azure Storage-konton kräver ett globalt unikt namn. Mer information om hur du felsöker lagringskontonamn finns i Lösa fel för lagringskontonamn.
  • Terraform-tillståndet lagras i oformaterad text och kan innehålla hemligheter. Om tillståndet är felaktigt skyddat kan obehörig åtkomst till system och dataförlust resultera.
  • I det här exemplet autentiserar Terraform till Azure Storage-kontot med hjälp av en åtkomstnyckel. I en produktionsdistribution rekommenderar vi att du utvärderar de tillgängliga autentiseringsalternativ som stöds av azurerm-serverdelen och att använda det säkraste alternativet för ditt användningsfall.
  • I det här exemplet tillåts åtkomst till det offentliga nätverket till det här Azure-lagringskontot. I en produktionsdistribution rekommenderar vi att du begränsar åtkomsten till det här lagringskontot med hjälp av en lagringsbrandvägg, tjänstslutpunkt eller en privat slutpunkt.

3. Konfigurera terraform-serverdelstillstånd

För att konfigurera serverdelstillståndet behöver du följande Azure-lagringsinformation:

  • storage_account_name: Namnet på Azure Storage-kontot.
  • container_name: Namnet på blobcontainern.
  • nyckel: Namnet på tillståndsarkivfilen som ska skapas.
  • access_key: Lagringsåtkomstnyckeln.

Vart och ett av dessa värden kan anges i Terraform-konfigurationsfilen eller på kommandoraden. Vi rekommenderar att du använder en miljövariabel för värdet access_key . Om du använder en miljövariabel förhindras nyckeln från att skrivas till disk.

Kör följande kommandon för att hämta lagringsåtkomstnyckeln och lagra den som en miljövariabel:

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

Viktiga punkter:

  • Om du vill skydda åtkomstnyckeln för Azure Storage-kontot ytterligare lagrar du den i Azure Key Vault. Miljövariabeln kan sedan anges med hjälp av ett kommando som liknar följande. Mer information om Azure Key Vault finns i Dokumentationen om Azure Key Vault.

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

Skapa en Terraform-konfiguration med ett backend konfigurationsblock.

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

Ersätt <storage_account_name> med namnet på ditt Azure Storage-konto.

Kör följande kommando för att initiera konfigurationen:

terraform init

Kör följande kommando för att köra konfigurationen:

terraform apply

Nu kan du hitta tillståndsfilen i Azure Storage-bloben.

4. Förstå tillståndslåsning

Azure Storage-blobar låses automatiskt innan någon åtgärd som skriver tillstånd. Det här mönstret förhindrar samtidiga tillståndsåtgärder, vilket kan orsaka skada.

Mer information finns i Tillståndslåsning i Terraform-dokumentationen.

Du kan se låset när du undersöker bloben via Azure-portalen eller andra Azure-hanteringsverktyg.

Azure blob with lock

5. Förstå kryptering i vila

Data som lagras i en Azure-blob krypteras innan de sparas. Vid behov hämtar Terraform tillståndet från serverdelen och lagrar det i lokalt minne. Om du använder det här mönstret skrivs aldrig tillståndet till den lokala disken.

Mer information om Azure Storage-kryptering finns i Azure Storage-tjänstkryptering för vilande data.

Felsöka Terraform i Azure

Felsöka vanliga problem när du använder Terraform i Azure

Nästa steg