En este tema, aprenderemos cómo utilizar módulos en Terraform para organizar y reutilizar configuraciones de infraestructura. Los módulos permiten encapsular configuraciones comunes y reutilizarlas en diferentes partes de tu infraestructura, lo que facilita la gestión y el mantenimiento.

Conceptos Clave

  1. Módulo: Un conjunto de archivos de configuración de Terraform en una carpeta que define recursos relacionados.
  2. Módulo raíz: El módulo que se encuentra en el directorio donde se ejecuta el comando terraform init o terraform apply.
  3. Módulo de hijo: Un módulo que es llamado por otro módulo (puede ser el módulo raíz u otro módulo hijo).

Estructura de un Módulo

Un módulo típico de Terraform contiene los siguientes archivos:

  • main.tf: Define los recursos principales del módulo.
  • variables.tf: Define las variables de entrada del módulo.
  • outputs.tf: Define las salidas del módulo.

Ejemplo Práctico

Vamos a crear un módulo simple que aprovisiona una instancia de EC2 en AWS.

Paso 1: Crear el Módulo

  1. Estructura de Archivos:

    my-ec2-module/
    ├── main.tf
    ├── variables.tf
    └── outputs.tf
    
  2. Contenido de main.tf:

    resource "aws_instance" "example" {
      ami           = var.ami_id
      instance_type = var.instance_type
    
      tags = {
        Name = var.instance_name
      }
    }
    
  3. Contenido de variables.tf:

    variable "ami_id" {
      description = "The AMI ID to use for the instance"
      type        = string
    }
    
    variable "instance_type" {
      description = "The type of instance to use"
      type        = string
      default     = "t2.micro"
    }
    
    variable "instance_name" {
      description = "The name of the instance"
      type        = string
    }
    
  4. Contenido de outputs.tf:

    output "instance_id" {
      description = "The ID of the EC2 instance"
      value       = aws_instance.example.id
    }
    
    output "public_ip" {
      description = "The public IP of the EC2 instance"
      value       = aws_instance.example.public_ip
    }
    

Paso 2: Usar el Módulo en el Módulo Raíz

  1. Estructura de Archivos:

    root/
    ├── main.tf
    └── variables.tf
    
  2. Contenido de main.tf:

    provider "aws" {
      region = "us-west-2"
    }
    
    module "ec2_instance" {
      source        = "../my-ec2-module"
      ami_id        = "ami-0c55b159cbfafe1f0"
      instance_type = "t2.micro"
      instance_name = "example-instance"
    }
    
    output "instance_id" {
      value = module.ec2_instance.instance_id
    }
    
    output "public_ip" {
      value = module.ec2_instance.public_ip
    }
    
  3. Contenido de variables.tf:

    variable "region" {
      description = "The AWS region to deploy resources"
      type        = string
      default     = "us-west-2"
    }
    

Paso 3: Ejecutar Terraform

  1. Inicializar el Directorio de Trabajo:

    terraform init
    
  2. Aplicar la Configuración:

    terraform apply
    

    Terraform solicitará confirmación antes de crear los recursos. Una vez confirmado, Terraform aprovisionará la instancia de EC2 utilizando el módulo.

Ejercicio Práctico

Ejercicio 1: Crear un Módulo de VPC

  1. Objetivo: Crear un módulo que configure una VPC con una subred pública.
  2. Instrucciones:
    • Crea un directorio llamado my-vpc-module.
    • Dentro del directorio, crea los archivos main.tf, variables.tf y outputs.tf.
    • Define los recursos para una VPC y una subred pública en main.tf.
    • Define las variables necesarias en variables.tf.
    • Define las salidas en outputs.tf.
    • Usa el módulo en un módulo raíz para crear una VPC y una subred pública.

Solución

  1. Estructura de Archivos:

    my-vpc-module/
    ├── main.tf
    ├── variables.tf
    └── outputs.tf
    
  2. Contenido de main.tf:

    resource "aws_vpc" "example" {
      cidr_block = var.vpc_cidr
    }
    
    resource "aws_subnet" "example" {
      vpc_id            = aws_vpc.example.id
      cidr_block        = var.subnet_cidr
      availability_zone = var.availability_zone
    }
    
  3. Contenido de variables.tf:

    variable "vpc_cidr" {
      description = "The CIDR block for the VPC"
      type        = string
    }
    
    variable "subnet_cidr" {
      description = "The CIDR block for the subnet"
      type        = string
    }
    
    variable "availability_zone" {
      description = "The availability zone for the subnet"
      type        = string
    }
    
  4. Contenido de outputs.tf:

    output "vpc_id" {
      description = "The ID of the VPC"
      value       = aws_vpc.example.id
    }
    
    output "subnet_id" {
      description = "The ID of the subnet"
      value       = aws_subnet.example.id
    }
    
  5. Usar el Módulo en el Módulo Raíz:

    provider "aws" {
      region = "us-west-2"
    }
    
    module "vpc" {
      source             = "../my-vpc-module"
      vpc_cidr           = "10.0.0.0/16"
      subnet_cidr        = "10.0.1.0/24"
      availability_zone  = "us-west-2a"
    }
    
    output "vpc_id" {
      value = module.vpc.vpc_id
    }
    
    output "subnet_id" {
      value = module.vpc.subnet_id
    }
    

Conclusión

En esta sección, hemos aprendido cómo usar módulos en Terraform para organizar y reutilizar configuraciones de infraestructura. Los módulos nos permiten encapsular configuraciones comunes y reutilizarlas en diferentes partes de nuestra infraestructura, lo que facilita la gestión y el mantenimiento. Hemos visto un ejemplo práctico de cómo crear y usar un módulo, y hemos realizado un ejercicio para reforzar los conceptos aprendidos. En el siguiente módulo, exploraremos el aprovisionamiento de recursos en diferentes proveedores de nube.

© Copyright 2024. Todos los derechos reservados