Almacena el estado de Terraform en un bucket de Cloud Storage

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

En este instructivo, aprenderás a almacenar el estado de Terraform en un bucket de Cloud Storage.

De forma predeterminada, Terraform almacena el estado de manera local en un archivo llamado terraform.tfstate. Esta configuración predeterminada puede dificultar el uso de Terraform para los equipos cuando varios usuarios ejecutan Terraform al mismo tiempo y cada máquina tiene su propia comprensión de la infraestructura actual.

Para ayudarte a evitar esos problemas, en esta página, se muestra cómo configurar un estado remoto que apunte a un bucket de Cloud Storage. El estado remoto es una característica de los backends de Terraform.

Costos

Cloud Storage genera costos por el almacenamiento, las operaciones de lectura y escritura, la salida de red y la replicación.

El bucket de Cloud Storage en este instructivo tiene habilitado el control de versiones de objetos para mantener el historial de tus implementaciones. Habilitar el control de versiones de objetos aumenta los costos de almacenamiento, lo cual se puede mitigar si configuras la Administración del ciclo de vida de los objetos para que borre versiones de estado antiguas.

Antes de comenzar

  1. Asegúrate de tener los permisos de Cloud Storage necesarios en tu cuenta de usuario:
    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    Ir a la página IAM

    Obtén más información sobre los roles y permisos.

    Como práctica recomendada, sugerimos controlar el acceso al bucket y los archivos de estado almacenados allí. Solo un pequeño conjunto de usuarios (por ejemplo, el administrador principal de la nube y la persona que actúa como administrador alternativo o de respaldo) deben tener permisos de administrador para el bucket. Los otros desarrolladores deben tener permisos para escribir y leer objetos en el bucket.

  2. Cómo iniciar Cloud Shell

    Cloud Shell es una máquina virtual de Compute Engine. Las credenciales de servicio asociadas a esta máquina virtual son automáticas, por lo que no es necesario configurar ni descargar una clave de cuenta de servicio.

  3. Habilita la API de Cloud Storage:

    gcloud services enable storage.googleapis.com
    

Configura Terraform para almacenar el estado en un bucket de Cloud Storage

En los siguientes pasos, creas un bucket de Cloud Storage y cambias la configuración del backend a tu bucket nuevo y a tu proyecto de Google Cloud.

Crea el bucket

  1. Agrega el siguiente recurso de Terraform google_storage_bucket a un archivo de configuración de Terraform, como main.tf.

    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name          = "${random_id.bucket_prefix.hex}-bucket-tfstate"
      force_destroy = false
      location      = "US"
      storage_class = "STANDARD"
      versioning {
        enabled = true
      }
    }

    En el fragmento de código, el campo location está hard-coded como US (lo que significa que se crea un bucket multirregional en US). Puedes cambiar este campo a una ubicación de tu elección.

  2. Ejecuta terraform apply para crear el bucket de almacenamiento.

Si la aplicación falla, es posible que el nombre del bucket no sea único a nivel global. En la siguiente sección, se muestra cómo resolver este problema.

Establece un nombre de bucket único

A fin de que el nombre del bucket sea único a nivel global, puedes incluir un complemento de Terraform para crear ID aleatorios.

// Terraform plugin for creating random IDs
resource "random_id" "instance_id" {
  byte_length = 8
}

Luego, debes usar el ID aleatorio en el atributo name del bucket.

resource "google_storage_bucket" "default" {
  name = "bucket-tfstate-${random_id.instance_id.hex}"
  ...
}

Vuelve a ejecutar el comando terraform apply.

Cambia la configuración del backend

  1. Agrega el siguiente texto a un nuevo archivo de configuración de Terraform llamado backend.tf.

    terraform {
     backend "gcs" {
       bucket  = "BUCKET_NAME"
       prefix  = "terraform/state"
     }
    }
    

    Asegúrate de actualizar BUCKET_NAME para que coincida con el nombre de tu bucket de Cloud Storage nuevo.

  2. Ejecuta terraform init para configurar tu backend de Terraform.

    Terraform detecta que ya tienes un archivo de estado de forma local y te solicita que lo copies en el nuevo bucket de Cloud Storage. Ingresa yes.

Después de ejecutar este comando, el estado de Terraform se almacena en el bucket de Cloud Storage. Terraform extrae el estado más reciente de este bucket antes de ejecutar un comando y lo envía al bucket después de ejecutar un comando.

Próximos pasos