Cómo crear un módulo Terraform

En este artículo veremos cómo crear módulos reutilizables en Terraform. Los módulos nos permiten evitar la duplicación de código. Esto significa que se puede utilizar el mismo código para crear recursos del mismo tipo. Utilizando módulos no necesitas copiar y pegar tu código para crear varios recursos del mismo tipo.

Por ejemplo, puedes poner el código dentro de un módulo Terraform y reutilizar ese módulo en los entornos de staging y producción, de esta forma podremos hacer que ambos entornos reutilicen el mismo código del mismo módulo en lugar de escribir el código varias veces.

En este artículo, escribiremos un módulo para crear un S3 Bucket como ejemplo.

Requisitos previos

  1. Conocimientos básicos de Terraform.
  2. Terraform instalado en tu sistema.
  3. Cuenta de AWS (Créala si no tienes una).
  4. ‘access_key’ & ‘secret_key’ de un Usuario IAM de AWS. (Haz clic aquí para aprender a crear un usuario IAM con ‘access_key’ & ‘secret_key’ en AWS, )

Qué haremos

  1. Escribir nuestro propio módulo
  2. Crear un bucket S3 utilizando el Módulo Terraform.
  3. Eliminar el recurso creado utilizando el Módulo Terraform.

Escribir nuestro propio módulo Terraform

Crea un directorio dedicado donde puedas tener tu archivo terraform «main.tf» y un módulo.

Utiliza el siguiente comando para crear un directorio

mkdir -p módulos/aws-s3

 

Escribir un módulo Terraform

Crea un archivo main.tf en modules/aws-s3 y copia y pega el siguiente bloque de código que se utilizará como módulo para crear un S3 Bucket.

vim modules/aws-s3/main.tf

resource "aws_s3_bucket" "s3_bucket" {
  bucket = var.bucket_name
  acl    = "public-read"
  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::${var.bucket_name}/*"
            ]
        }
    ]
}
EOF 
  website {
    index_document = "index.html"
    error_document = "error.html"
  }
   tags = var.tags
}

Código del módulo Terraform

Declara la variable necesaria en «modules/aws-s3/variables.tf». Si quieres puedes especificar los valores por defecto a las variables. Copia y pega el siguiente bloque de código para crear el archivo.

vim modules/aws-s3/variables.tf

variable "bucket_name" {
  description = "Name of the s3 bucket. Must be unique."
  type = string
}

variable "tags" {
  description = "Tags to set on the bucket."
  type = map(string)
  default = {}
}

Terraform variables

Ahora, crea el archivo «main.tf» que llamará al módulo que hemos definido en el paso anterior. Llamar a un módulo significa incluir el contenido de ese módulo en la configuración con valores específicos para su variable. Los módulos se llaman desde dentro de otros módulos utilizando los bloques module:

vim main.tf

provider "aws" {
      region     = "${var.region}"
      access_key = "${var.access_key}"
      secret_key = "${var.secret_key}"
}


module "website_s3_bucket" {
  source = "./modules/aws-s3"

  bucket_name = "${var.bucket_name}"

  tags = {
    Terraform   = "true"
    Environment = "dev"
  }
}

Archivo principal de Terraform

Todos los módulos requieren un argumento fuente. Su valor es o bien la ruta a un directorio local de los archivos de configuración del módulo, o bien una fuente remota del módulo que Terraform debe descargar y utilizar.

Se puede especificar la misma dirección de origen en varios bloques de módulos para crear varias copias de los recursos definidos en ellos, posiblemente con distintos valores de variables.

Crea «variables.tf», que contendrá la definición de las variables. Contendrá los valores por defecto que hay que pasar al módulo junto con «access_key» y «secret_key» de AWS.

vim variables.tf
variable "access_key" {
     description = "Access key to AWS console"
}
variable "secret_key" {
     description = "Secret key to AWS console"
}
variable "region" {
     description = "Region of AWS VPC"
}
variable "bucket_name" {
  description = "(Required) Creates a unique bucket name"
  type        = "string"
  default     = "test-bucket-rahul-delete"
}

Ampliar el archivo variables.tf

Ahora crea «terraform.tfvars» que contendrá las credenciales de usuario de AWS. Las siguientes claves deben cambiarse por las claves de tu usuario IAM. Antes de especificar estas claves, debes crearlas desde la consola de AWS y no compartirlas con nadie.

vim terraform.tfvars

region = "eu-west-3"
access_key = "AKIAQ6GAIA5XX54GLLNG"
secret_key = "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"

Crear un bucket S3 utilizando el módulo Terraform

Antes de ejecutar los siguientes comandos asegúrate de que has configurado la access_key y la secret_key válidas.

El primer comando a utilizar es ‘terraform init’. Este comando descarga e instala los plugins de los proveedores utilizados en la configuración. En nuestro caso es AWS.

terraform init

El segundo comando a utilizar es ‘terraform plan’. Este comando se utiliza para ver los cambios que se producirán 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 tus datos para crear los recursos.

terraformar aplicar

Cuando ejecutes el comando anterior, una vez completado con éxito, podrás ver que se ha añadido 1 nuevo recurso y se ha destruido 0.

Puedes ir a la consola de AWS S3 para verificar si el S3 Bucket está creado o no.

Eliminar el S3 Bucket creado utilizando Terraform

Si ya no necesitas un recurso que has creado utilizando la configuración mencionada en el archivo main.tf, puedes utilizar el comando «terraform destroy» para eliminar todos esos recursos. En este caso, el cubo S3 se eliminará al ejecutar el siguiente comando.

terraform destruir

Conclusión

En este artículo, hemos visto los pasos para escribir nuestro propio módulo y crear un cubo de S3 utilizándolo. Ahora el mismo módulo se puede utilizar para crear múltiples cubos de S3, para ello sólo tenemos que cambiar los valores de las variables y reutilizar el mismo módulo.

También te podría gustar...