Compartir a través de


Almacenar el estado de Terraform en Azure Storage

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

El estado de Terraform se usa para conciliar los recursos implementados con configuraciones de Terraform. El estado permite a Terraform saber qué recursos de Azure agregar, actualizar o eliminar.

De forma predeterminada, el estado de Terraform se almacena localmente, lo que no es ideal por los siguientes motivos:

  • El estado local no funciona bien en un entorno de equipo o de colaboración.
  • El estado de Terraform puede incluir información confidencial.
  • Almacenar el estado localmente aumenta la posibilidad de eliminación involuntaria.

En este artículo aprenderá a:

  • Creación de una cuenta de Azure Storage
  • Use Azure Storage para almacenar el estado remoto de Terraform.
  • Descripción del bloqueo de estado
  • Descripción del cifrado en reposo

1. Configuración del entorno

  • Suscripción de Azure: si no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.

2. Configuración de la cuenta de almacenamiento de estado remoto

Antes de usar Azure Storage como back-end, debe crear una cuenta de almacenamiento.

Ejecute los siguientes comandos o configuración para crear una cuenta y un contenedor de 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

Puntos clave:

  • Las cuentas de Azure Storage requieren un nombre único global. Para más información sobre la solución de problemas de nombres de cuenta de almacenamiento, consulte Resolución de errores de nombres de cuenta de almacenamiento.
  • El estado de Terraform se almacena en texto sin formato y puede contener secretos. Si el estado no está debidamente protegido, puede resultar en acceso no autorizado a los sistemas y pérdida de datos.
  • En este ejemplo, Terraform se autentica en la cuenta de almacenamiento de Azure mediante una clave de acceso. En una implementación de producción, se recomienda evaluar las opciones de autenticación disponibles compatibles con el back-end de azurerm y usar la opción más segura para el caso de uso.
  • En este ejemplo, se permite el acceso a la red pública a esta cuenta de Almacenamiento de Azure. En una implementación de producción, se recomienda restringir el acceso a esta cuenta de almacenamiento mediante un firewall de almacenamiento, un punto de conexión de servicio o un punto de conexión privado.

3. Configurar el estado del backend de Terraform

Para configurar el estado del backend, necesita la siguiente información de almacenamiento de Azure:

  • storage_account_name: el nombre de la cuenta de Azure Storage.
  • container_name: nombre del contenedor de blobs.
  • key: el nombre del archivo de almacén de estado que se va a crear.
  • access_key: la clave de acceso de almacenamiento.

Cada uno de estos valores se puede especificar en el archivo de configuración de Terraform o en la línea de comandos. Se recomienda usar una variable de entorno para el access_key valor. El uso de una variable de entorno impide que la clave se escriba en el disco.

Ejecute los siguientes comandos para obtener la clave de acceso de almacenamiento y almacenarla como una variable de entorno:

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

Puntos clave:

  • Para proteger aún más la clave de acceso de la cuenta de Azure Storage, almacénela en Azure Key Vault. A continuación, se puede establecer la variable de entorno mediante un comando similar al siguiente. Para más información sobre Azure Key Vault, consulte la documentación de Azure Key Vault.

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

Cree una configuración de Terraform con un backend bloque de configuración.

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

Reemplace <storage_account_name> por el nombre de la cuenta de Azure Storage.

Ejecute el siguiente comando para inicializar la configuración:

terraform init

Ejecute el siguiente comando para ejecutar la configuración:

terraform apply

Ahora puede encontrar el archivo de estado en el blob de Azure Storage.

4. Comprender el bloqueo de estado

Los blobs de Azure Storage se bloquean automáticamente antes de cualquier operación que escriba el estado. Este patrón previene las operaciones concurrentes del estado, lo cual puede provocar corrupción.

Para obtener más información, consulte Bloqueo de estado en la documentación de Terraform.

Puede ver el bloqueo al examinar el blob a través de Azure Portal u otras herramientas de administración de Azure.

Blob de Azure con bloqueo

5. Descripción del cifrado en reposo

Los datos almacenados en un blob de Azure se cifran antes de conservarse. Cuando sea necesario, Terraform recupera el estado del back-end y lo almacena en la memoria local. Si usa este patrón, el estado nunca se escribe en el disco local.

Para más información sobre el cifrado de Azure Storage, consulte Cifrado del servicio Azure Storage para datos en reposo.

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes