Cómo administrar el estado de Terraform en un depósito de AWS S3

Cómo administrar el estado de Terraform en un depósito de AWS S3

En este art√≠culo, veremos qu√© es un estado de Terraform y c√≥mo administrarlo en un S3 Bucket. Tambi√©n veremos qu√© es el ¬ębloqueo¬Ľ en Terraform y c√≥mo implementarlo. Para implementar esto, necesitamos crear un S3 Bucket y una DynamoDB Table en AWS.

Antes de continuar, comprendamos los conceptos b√°sicos del estado y bloqueo de Terraform.

  • Estado de terraformaci√≥n (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 ha creado una instancia EC2 mediante la configuración de terraform, 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, es bueno almacenar el archivo de estado de terraformación de forma remota para que las personas del equipo puedan acceder a él. Para almacenar el estado de forma remota, necesitamos dos cosas: un cubo s3 para almacenar el archivo de estado y un recurso de back-end terraform s3.
  • Cerrar:
    Si almacenamos el archivo de estado de forma remota para que muchas personas puedan acceder a √©l, corremos el riesgo de que varias personas intenten realizar cambios en el mismo archivo al mismo tiempo. Por lo tanto, debemos tener un mecanismo que ¬ębloquee¬Ľ el estado si otros usuarios lo est√°n utilizando actualmente. Podemos lograr esto creando una tabla de dynamoDB para que la use terraform.

Aquí, veremos todos los pasos desde la creación manual de un S3 Bucket, agregarle la política requerida, crear una tabla de DynamoDB usando Terraform y configurar Terraform para usar S3 como backend y DynamoDB para almacenar el bloqueo.

requisitos previos

  1. Comprensión básica de Terraform.
  2. Comprensión básica de S3 Bucket.
  3. Terraform instalado en su sistema.
  4. Cuenta AWS (Crear si no tienes uno).
  5. ‘access_key’ y ‘secret_key’ de un usuario de AWS IAM. (Haga clic aqu√≠ para obtener informaci√≥n sobre c√≥mo crear un usuario de IAM con ‘access_key’ y ‘secret_key’ en AWS)

Lo que haremos

  1. Cree un dep√≥sito de S3 y adj√ļntelo a una pol√≠tica.
  2. Cree una tabla de DynamoDB usando Terraform
  3. Cree un EC2 utilizando los archivos de configuración de Terraform.
  4. Elimine la instancia EC2 creada mediante Terraform.

Cree un dep√≥sito de S3 y adj√ļntelo a una pol√≠tica.

Haga clic aqu√≠ para aprender a crear un dep√≥sito de S3 en una cuenta de AWS. Una vez que cree un dep√≥sito, adj√ļntelo a la siguiente pol√≠tica.

{
    "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/*"
            ]
        }
    ]
}

Configure ¬ęAWS_ACCESS_KEY_ID¬Ľ y ¬ęAWS_SECRET_ACCESS_KEY¬Ľ para que pueda acceder a su cuenta desde la CLI.

Utilice 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_KEY

Una vez que haya configurado sus credenciales, simplemente puede probarlas enumerando los cubos con el siguiente comando.

aws s3 ls

Cree una tabla de DynamoDB usando Terraform

Cree ‘variables.tf’ que contiene las variables requeridas de declaraci√≥n.

vim variables.tf

variable "region" {
     description = "Region of AWS VPC"
}

Cree ‘main.tf’ que es responsable de crear una tabla de DynamoDB. Este main.tf leer√° los valores de las variables de variables.tf. Esta tabla se utilizar√° para almacenar el candado.

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 que se utilizar√° es ‘terraform init’. Este comando descarga e instala complementos para proveedores utilizados dentro de la configuraci√≥n. En nuestro caso es AWS.

inicio de terraformación

El segundo comando que se utilizar√° es ‘plan de terraformaci√≥n’. Este comando se utiliza para ver los cambios que se producir√°n en la infraestructura.

plan de terraformación

El comando ‘terraform apply’ crear√° los recursos en AWS mencionados en el archivo main.tf. Se le pedir√° que proporcione su entrada para crear los recursos.

Aplicar terraformación

Ahora, puede ir a DynamoDB Dashboard en la consola para comprobar si la tabla se ha creado o no.

Hasta este momento, hemos creado un depósito de S3 manualmente desde la consola de S3 y la tabla de DynamoDB mediante Terraform. No hemos configurado el depósito de S3 como backend para almacenar el estado y la tabla de DynamoDB para almacenar el bloqueo.

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á en el backend de S3.

Actualice nuestro main.tf existente con el siguiente código.

vim principal.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 prueba el comando ¬ęterraform plan¬Ľ para ver qu√© nuevo recurso se crear√°, el comando fallar√° con el siguiente error.

Se le pedir√° que reinicie el backend.

Para reiniciar el backend, use el comando ¬ęterraform init¬Ľ. En este paso, su archivo de estado local se copiar√° en S3 Bucket.

inicio de terraformación

Puede observar el resultado como se muestra en la siguiente captura de pantalla despu√©s de ejecutar el comando ¬ęterraform init¬Ľ, Terraform se ha habilitado para usar DynamoDb Table para adquirir el bloqueo. Una vez que se habilita el bloqueo, no se pueden realizar dos operaciones iguales en el mismo recurso en forma paralela.

Puede ir al panel de S3 desde la consola de AWS para ver si terraform.tfstate se ha copiado o no.

Ahora, nuevamente puede crear un nuevo recurso y ver que el estado se almacenará en S3 Bucket. Para crear una nueva tabla de prueba de DynamoDB, actualice el archivo main.tf con el siguiente código.

vim principal.tf

variable "region" {
     description = "Region of AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat 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"
  }
}


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 del Proveedor.

Simplemente puede usar el comando ¬ęplan de terraformaci√≥n¬Ľ para ver qu√© nuevos recursos se crear√°n.

plan de terraformación

Ahora, ejecute el siguiente comando para crear una nueva tabla de prueba de DynamoDb.

Aplicar terraformación

En la captura de pantalla anterior, puede ver que el bloqueo se ha habilitado, el archivo .tfstate se est√° copiando en S3.

Ahora, en la consola puedes ver que la nueva tabla ha sido creada

Ahora, si ya no necesita el recurso que creó con Terraform, use el siguiente comando para eliminar los recursos.

terraformar destruir

Tan pronto como elimine los recursos, puede ver que la tabla que se estaba utilizando para bloquear también se eliminó. Si no necesita el S3 Bucket también, puede eliminarlo de la consola.

Conclusión

En este artículo, aprendimos sobre la necesidad de usar un estado remoto y bloquear Terraform. Vimos los pasos para usar S3 Bucket como backend para almacenar el estado de Terraform y la tabla de DynamoDb para habilitar el bloqueo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *