Speichern des Terraform-Status in Azure Storage
Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.
Der Terraform-Status wird verwendet, um bereitgestellte Ressourcen auf Terraform-Konfigurationen abzustimmen. State teilt Terraform mit, welche Azure-Ressourcen hinzugefügt, aktualisiert oder gelöscht werden sollen.
Der Terraform-Zustand wird standardmäßig lokal gespeichert, was allerdings aus folgenden Gründen nicht ideal ist:
- Der lokale Zustand eignet sich nicht besonders für eine team- oder zusammenarbeitsorientierte Umgebung.
- Der Terraform-Zustand kann sensible Informationen enthalten.
- Das lokale Speichern des Zustands erhöht das Risiko einer versehentlichen Löschung.
In diesem Artikel werden folgende Vorgehensweisen behandelt:
- Erstellen eines Azure-Speicherkontos
- Verwenden von Azure-Speicher zum Speichern des Terraform-Remotezustands
- Verstehen der Zustandssperre
- Verstehen der Verschlüsselung ruhender Daten
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Konfigurieren von Terraform: Konfigurieren Sie Terraform mithilfe einer der folgenden Optionen, sofern noch nicht geschehen:
Um Azure Storage als Back-End verwenden zu können, müssen Sie zunächst ein Speicherkonto erstellen.
Führen Sie die folgenden Befehle oder Konfigurationsschritte aus, um ein Azure-Speicherkonto und einen Container zu erstellen:
#!/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
Die wichtigsten Punkte:
- Der Name eines Azure-Speicherkontos muss global eindeutig sein. Weitere Informationen zur Behandlung von Problemen mit Speicherkontonamen finden Sie unter Beheben von Fehlern bei Speicherkontonamen.
- Der Terraform-Zustand wird im Nur-Text-Zustand gespeichert und kann Geheimnisse enthalten. Wenn der Zustand falsch gesichert ist, kann der nicht autorisierte Zugriff auf Systeme und Datenverlust dazu führen.
- In diesem Beispiel authentifiziert sich Terraform mithilfe eines Zugriffsschlüssels beim Azure-Speicherkonto. In einer Produktionsbereitstellung wird empfohlen, die verfügbaren Authentifizierungsoptionen zu bewerten, die vom Azurerm-Back-End unterstützt werden, und die sicherste Option für Ihren Anwendungsfall zu verwenden.
- In diesem Beispiel ist der Zugriff auf öffentliche Netzwerke auf dieses Azure-Speicherkonto zulässig. In einer Produktionsbereitstellung wird empfohlen, den Zugriff auf dieses Speicherkonto mithilfe einer Speicherfirewall, eines Dienstendpunkts oder eines privaten Endpunkts einzuschränken.
Zum Konfigurieren des Back-End-Zustands sind folgende Azure Storage-Informationen erforderlich:
- storage_account_name: Der Name des Azure Storage-Kontos.
- container_name: Der Name des Blobcontainers.
- key: Der Name der zu erstellenden Zustandsspeicherdatei.
- access_key: Der Speicherzugriffsschlüssel.
Jeder dieser Werte kann in der Terraform-Konfigurationsdatei oder über die Befehlszeile angegeben werden. Wir empfehlen, für den Wert access_key
eine Umgebungsvariable zu verwenden. Durch die Verwendung einer Umgebungsvariablen wird verhindert, dass der Schlüssel auf den Datenträger geschrieben wird.
Führen Sie die folgenden Befehle aus, um den Speicherzugriffsschlüssel abzurufen und als Umgebungsvariable zu speichern:
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
Die wichtigsten Punkte:
Um den Zugriffsschlüssel des Azure Storage-Kontos noch stärker zu schützen, speichern Sie ihn in Azure Key Vault. Die Umgebungsvariable kann dann mit einem Befehl wie dem Folgenden festgelegt werden. Weitere Informationen zu Azure Key Vault finden Sie in der Dokumentation zu Azure Key Vault.
export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
Erstellen Sie eine Terraform-Konfiguration mit einem Konfigurationsblock für das Back-End (backend
).
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"
}
Ersetzen Sie <storage_account_name>
durch den Namen Ihres Azure-Speicherkontos.
Führen Sie den folgenden Befehl aus, um die Konfiguration zu initialisieren:
terraform init
Führen Sie den folgenden Befehl aus, um die Konfiguration auszuführen:
terraform apply
Nun befindet sich die Zustandsdatei im Azure Storage-Blob.
Azure Storage-Blobs werden vor Zustandsschreibvorgängen automatisch gesperrt. Diese Konfiguration verhindert die gleichzeitige Ausführung mehrerer Zustandsvorgänge, da dies zu Beschädigungen führen kann.
Weitere Informationen finden Sie in der Terraform-Dokumentation unter Zustandssperre.
Die Sperre wird angezeigt, wenn Sie das Blob über das Azure-Portal oder in anderen Azure-Verwaltungstools untersuchen.
In einem Azure-Blob gespeicherte Daten werden vor dem Speichern verschlüsselt. Bei Bedarf ruft Terraform den Zustand vom Back-End ab und speichert ihn im lokalen Arbeitsspeicher. Wenn Sie dieses Muster verwenden, wird der Zustand nie auf den lokalen Datenträger geschrieben.
Weitere Informationen zur Azure Storage-Verschlüsselung finden Sie unter Azure Storage-Verschlüsselung für ruhende Daten.
Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure