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.
Objetivos
En este instructivo, se muestra cómo realizar lo siguiente:
- Usar Terraform para aprovisionar un bucket de Cloud Storage para almacenar el estado de Terraform.
- Agregar plantillas en el archivo de configuración de Terraform para migrar el estado del backend local al bucket de Cloud Storage.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Libera espacio.
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
-
En la Google Cloud consola, activa Cloud Shell.
Cloud Shell viene con Terraform preinstalado.
Si usas un shell local, sigue estos pasos:
- Instala Terraform.
-
Crea credenciales de autenticación locales para tu cuenta de usuario:
gcloud auth application-default login
Si se muestra un error de autenticación y usas un proveedor de identidad (IdP) externo, confirma que accediste a gcloud CLI con tu identidad federada.
-
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Seleccionar un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de creador de proyectos
(
roles/resourcemanager.projectCreator), que contiene elresourcemanager.projects.createpermiso. Obtén más información para otorgar roles.
-
Crea un proyecto de: Google Cloud
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el Google Cloud proyecto de que estás creando. -
Selecciona el Google Cloud proyecto de que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu Google Cloud proyecto de.
-
Verifica que la facturación esté habilitada para tu Google Cloud proyecto.
-
Habilita la API de Cloud Storage:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene elserviceusage.services.enablepermiso. Obtén más información para otorgar roles.gcloud services enable storage.googleapis.com
-
Otorga roles a tu cuenta de usuario. Ejecuta el siguiente comando una vez para cada uno de los siguientes roles de IAM:
roles/storage.admingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Reemplaza lo siguiente:
PROJECT_ID: ID del proyectoUSER_IDENTIFIER: Es el identificador de tu cuenta de usuario. cuenta. Para obtener ejemplos, consulta Representa a los usuarios del grupo de personal en políticas de IAM.ROLE: Es el rol de IAM que otorgas a tu cuenta de usuario.
Como alternativa, puedes crear un rol de IAM personalizado que contenga los siguientes permisos:
storage.buckets.createstorage.buckets.liststorage.objects.getstorage.objects.createstorage.objects.deletestorage.objects.update
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.
Prepare el entorno
Clona el repositorio de GitHub que contiene las muestras de Terraform:
git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branchCambia al directorio de trabajo:
cd terraform-docs-samples/storage/remote_terraform_backend_template
Revisa los archivos de Terraform
Revisa el archivo
main.tf:cat main.tfEl resultado es similar al que se muestra a continuación:
En este archivo, se describen los siguientes recursos:
random_id: Se agrega al nombre del bucket de Cloud Storage para garantizar un nombre único para el bucket de Cloud Storage.google_storage_bucket: Es el bucket de Cloud Storage para almacenar el archivo de estado. Este bucket está configurado para tener las siguientes propiedades:force_destroyse establece enfalsepara garantizar que el bucket no se borre si contiene objetos. Esto garantiza que la información de estado en el bucket no se borre de forma accidental.public_access_preventionse establece enenforcedpara garantizar que el contenido del bucket no se exponga de forma accidental al público.uniform_bucket_level_accessse establece entruepara permitir el control del acceso al bucket y su contenido con permisos de IAM en lugar de listas de control de acceso.versioningestá habilitado para garantizar que las versiones anteriores del estado se conserven en el bucket.
local_file: Es un archivo local. El contenido de este archivo le indica a Terraform que use el bucket de Cloud Storage como backend remoto una vez que se crea el bucket.
Aprovisiona el bucket de Cloud Storage
Inicializa Terraform mediante este comando:
terraform initCuando ejecutas
terraform initpor primera vez, el bucket de Cloud Storage que especificaste en el archivomain.tfaún no existe, por lo que Terraform inicializa un backend local para almacenar el estado en el sistema de archivos local.Aplica la configuración para aprovisionar los recursos descritos en el archivo
main.tf:terraform applyCuando se te solicite, ingresa
yes.Cuando ejecutas
terraform applypor primera vez, Terraform aprovisiona el bucket de Cloud Storage para almacenar el estado. También crea un archivo local; el contenido de este archivo le indica a Terraform que use el bucket de Cloud Storage como backend remoto para almacenar el estado.
Migra el estado al bucket de Cloud Storage
Migra el estado de Terraform al backend remoto de Cloud Storage:
terraform init -migrate-stateTerraform detecta que ya tienes un archivo de estado de forma local y te solicita que migres el estado al nuevo bucket de Cloud Storage. Cuando se te solicite, 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.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
Sigue estos pasos para evitar que se apliquen cargos a tu Google Cloud cuenta de por los recursos que usaste en esta página.
Abre el archivo
main.tf.En el recurso
google_storage_bucket.default, actualiza el valor deforce_destroyatrue.Aplica la configuración actualizada:
terraform applyCuando se te solicite, ingresa
yes.Borra el archivo de estado:
rm backend.tfVuelve a configurar el backend para que sea local:
terraform init -migrate-stateCuando se te solicite, ingresa
yes.Ejecuta el siguiente comando para borrar los recursos de Terraform:
terraform destroyCuando se te solicite, ingresa
yes.