GNU/Linux >> Tutoriales Linux >  >> Linux

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 depósito S3 y una tabla DynamoDB en AWS.

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

  • Estado de Terraformar (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, entonces 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.
  • Bloquear
    Si almacenamos el archivo de estado de forma remota para que muchas personas puedan acceder a él, entonces 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 depósito de S3, 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 de AWS (cree si no tiene una).
  5. 'access_key' &'secret_key' de un usuario de AWS IAM. (Haga clic aquí para aprender a crear un usuario de IAM con 'access_key' y 'secret_key' en AWS)

Lo que haremos

  1. Cree un depósito 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.

Crea un S3 Bucket y adjúntale una política.

Haga clic aquí para obtener información sobre cómo 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.

Use 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

Crear una tabla de DynamoDB usando Terraform

Cree 'variables.tf' que contiene las variables requeridas para la 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 al Panel de control de DynamoDB en la consola para comprobar si la tabla se ha creado o no.

Hasta este momento, hemos creado un depósito S3 manualmente desde la consola S3 y la tabla DynamoDB usando 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 Terraform main.tf. 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 reinicializar 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", se habilitó a Terraform para usar la tabla DynamoDb 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 el estado que 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 ningún cambio en el backend del proveedor.

Puedes usar el comando "terraform plan" 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 se ha habilitado el bloqueo, 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 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 el bloqueo 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.


Linux
  1. Cómo administrar las capacidades de archivos de Linux

  2. Cómo administrar la contraseña de la cuenta en Linux

  3. Cómo crear una instancia RDS en AWS usando Terraform

  4. Cómo crear un rol de IAM en AWS usando Terraform

  5. Cómo administrar una partición de intercambio en Linux

Qué es Terraform y cómo instalarlo y usarlo en AWS EC2

Cree un depósito S3 en AWS con Terraform

Cómo crear un depósito S3 usando Python Boto3 en AWS

Cómo crear una tabla de DynamoDB en AWS

Cómo instalar Terraform en Ubuntu 18.04/20.04 LTS

Cómo administrar bases de datos en MariaDB en Ubuntu 18.04