Terraform AWS · 6 min read · Dec 10, 2025
Cómo gestionar el estado de Terraform en un bucket S3 de AWS

En este artículo, veremos qué es un estado de Terraform y cómo gestionarlo en un bucket S3. También veremos qué es el “lock” en Terraform y cómo implementarlo. Para implementar esto, necesitamos crear un bucket S3 y una tabla DynamoDB en AWS.
Antes de proceder, entendamos los conceptos básicos del estado de Terraform y el Lock.
- Estado de Terraform (archivo terraform.tstate):
El archivo de estado contiene información sobre qué recursos existen definidos en los archivos de configuración de terraform. Por ejemplo, si has creado una instancia EC2 utilizando la configuración de terraform, entonces el archivo de estado contiene información sobre el recurso real que se creó en AWS. - S3 como Backend para almacenar el archivo de estado:
Si estamos trabajando en un equipo, entonces es bueno almacenar el archivo de estado de terraform de forma remota para que las personas del equipo puedan acceder a él. Para almacenar el estado de forma remota necesitamos dos cosas: un bucket S3 para almacenar el archivo de estado y un recurso backend de terraform s3. - Lock:
Si almacenamos el archivo de estado de forma remota para que muchas personas puedan acceder a él, entonces corremos el riesgo de que múltiples personas intenten hacer cambios en el mismo archivo al mismo tiempo. Por lo tanto, necesitamos tener un mecanismo que “bloquee” el estado si actualmente está siendo utilizado por otros usuarios. Podemos lograr esto creando una tabla DynamoDB para que terraform la use.
Aquí, veremos todos los pasos desde la creación manual de un bucket S3, añadiendo la política requerida, creando la tabla DynamoDB usando Terraform y configurando Terraform para usar S3 como un Backend y DynamoDB para almacenar el lock.
Requisitos previos
- Comprensión básica de Terraform.
- Comprensión básica de S3 Bucket.
- Terraform instalado en tu sistema.
- Cuenta de AWS (Crea una si no tienes una).
- ‘access_key’ y ‘secret_key’ de un usuario IAM de AWS. (Haz clic aquí para aprender a crear un usuario IAM con ‘access_key’ y ‘secret_key’ en AWS, )
Lo que haremos
- Crear un bucket S3 y adjuntar una política a él.
- Crear una tabla DynamoDB usando Terraform.
- Crear un EC2 usando los archivos de configuración de Terraform.
- Eliminar la instancia EC2 creada usando Terraform.
Crear un bucket S3 y adjuntar una política a él.
Haz clic aquí para aprender a crear un bucket S3 en la cuenta de AWS. Una vez que crees un bucket, adjunta la siguiente política a él.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1560164441598",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject*",
"s3:List*",
"s3:Get*",
"s3:Delete*"
],
"Resource": [
"arn:aws:s3:::state-lock-rahul",
"arn:aws:s3:::state-lock-rahul/*"
]
}
]
}
Configura “AWS_ACCESS_KEY_ID” y “AWS_SECRET_ACCESS_KEY” para que puedas acceder a tu cuenta desde la CLI.
Usa el siguiente comando para exportar los valores de “AWS_ACCESS_KEY_ID” y “AWS_SECRET_ACCESS_KEY”.
export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEYUna vez que hayas configurado tus credenciales, puedes probarlas simplemente listando los buckets usando el siguiente comando.
aws s3 ls

Crear una tabla DynamoDB usando Terraform
Crea ‘variables.tf’ que contenga la declaración de las variables requeridas.
vim variables.tf
variable "region" {
description = "Región de AWS VPC"
}
Crea ‘main.tf’ que es responsable de crear una tabla DynamoDB. Este main.tf leerá los valores de las variables de variables.tf. Esta tabla se usará para almacenar el lock.
provider "aws" {
region = "${var.region}"
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
El primer comando a usar es ‘terraform init’. Este comando descarga e instala plugins para los proveedores utilizados dentro de la configuración. En nuestro caso, es AWS.
*terraform init

El segundo comando a usar es ‘terraform plan’. Este comando se usa para ver los cambios que tendrán lugar en la infraestructura.
terraform plan

El comando ‘terraform apply’ creará los recursos en AWS mencionados en el archivo main.tf. Se te pedirá que proporciones tu entrada para crear los recursos.
terraform apply

Ahora, puedes ir al panel de DynamoDB en la consola para verificar si la tabla ha sido creada o no.

Hasta este punto, hemos creado un bucket S3 manualmente desde la consola S3 y una tabla DynamoDB usando Terraform. No hemos configurado el bucket S3 como un Backend para almacenar el estado y la tabla DynamoDB para almacenar el lock.
Para lograr nuestro objetivo, tenemos que modificar nuestro archivo main.tf de Terraform. Después de modificar el código y ejecutarlo, nuestro estado local preexistente se copiará al Backend S3.
Actualiza nuestro main.tf existente con el siguiente código.
vim main.tf
provider "aws" {
region = "${var.region}"
}
terraform {
backend "s3" {
bucket = "state-lock-rahul"
key = "test/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "rahul-test-dynamodb-table"
}
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Ahora, si intentas el comando “terraform plan” para ver qué nuevo recurso se creará, el comando fallará con el siguiente error.
Se te pedirá que reinicialices el backend.

Para reinicializar el backend, usa el comando “terraform init”. En este paso, tu archivo de estado local se copiará al bucket S3.
terraform init
Puedes observar la salida como se muestra en la captura de pantalla a continuación después de ejecutar el comando “terraform init”, Terraform ha sido habilitado para usar la tabla DynamoDB para adquirir el lock. Una vez que el bloqueo está habilitado, no se pueden realizar dos operaciones iguales en el mismo recurso de forma paralela.

Puedes ir al panel de S3 desde la consola de AWS para ver si el terraform.tfstate ha sido copiado o no.

Ahora, nuevamente puedes crear un nuevo recurso y ver que el estado se almacenará en el bucket S3. Para crear una nueva tabla de prueba DynamoDB, actualiza el archivo main.tf con el siguiente código.
vim main.tf
variable "region" {
description = "Región de AWS VPC"
}
Rahuls-MacBook-Pro:terraform rahul$ cat main.tf
provider "aws" {
region = "${var.region}"
}
tf {
backend "s3" {
bucket = "state-lock-rahul"
key = "test/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "rahul-test-dynamodb-table"
}
}
resource "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
resource "aws_dynamodb_table" "test-table" {
name = "rahul-test-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
Esta vez, no hay necesidad de ejecutar “terraform init” ya que no hay cambios en el Backend al Proveedor.
Puedes simplemente usar el comando “terraform plan” para ver qué nuevos recursos se crearán.
terraform plan


Ahora, ejecuta el siguiente comando para crear una nueva tabla de prueba DynamoDB.
terraform apply


En la captura de pantalla anterior, puedes ver que el bloqueo ha sido habilitado, el archivo .tfstate se está copiando a S3.
Ahora, en la consola puedes ver que la nueva tabla ha sido creada.

Ahora, si ya no necesitas el recurso que creaste usando Terraform, usa el siguiente comando para eliminar los recursos.
terraform destroy

Tan pronto como elimines los recursos, puedes ver que la tabla que se estaba utilizando para el bloqueo también ha sido eliminada. Si no necesitas el bucket S3 tampoco, puedes eliminarlo desde la consola.
Conclusión
En este artículo, aprendimos sobre la necesidad de usar un estado remoto y el bloqueo en Terraform. Vimos los pasos para usar el bucket S3 como un Backend para almacenar el estado de Terraform y la tabla DynamoDB para habilitar el bloqueo.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.