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 que Terraform sepa qué recursos de Azure agregar, actualizar o eliminar.

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

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

En este artículo aprenderá a:

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

1. Configurar su entorno

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

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

Para poder usar Azure Storage como back-end, es preciso crear antes una cuenta de almacenamiento.

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

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 está protegido incorrectamente, el acceso no autorizado a los sistemas y la pérdida de datos puede dar lugar.
  • 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. Configuración del estado del back-end de Terraform

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

  • storage_account_name: nombre de la cuenta de Azure Storage.
  • container_name: nombre del contenedor de blobs.
  • key: nombre del archivo de almacenamiento de estados que se va a crear.
  • access_key: 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 valor access_key. El uso de una variable de entorno evita 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 el uso de 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 bloque de configuración 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"
}

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

Ya puede encontrar el archivo de estado en Azure Storage Blob.

4. Descripción del bloqueo de estado

Los blobs de Azure Storage Blob se bloquean automáticamente antes de cualquier operación que escriba el estado. Este patrón evita operaciones de estado simultáneas que pueden causar daños.

Para más información, consulte el artículo acerca del bloqueo del estado en la documentación de Terraform.

El bloqueo se puede ver al examinar el blob desde Azure Portal, o cualquier otra herramienta de administración de Azure.

Azure blob with lock

5. Descripción del cifrado en reposo

Los datos almacenados en un blob de Azure se cifran antes de enviarse. Si es 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 acerca del cifrado de Azure Storage, consulte Cifrado de 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