En este proyecto, vamos a aplicar los conocimientos adquiridos a lo largo del curso para crear y gestionar una infraestructura en AWS utilizando Terraform. Este proyecto está diseñado para consolidar tus habilidades y darte una experiencia práctica en un entorno del mundo real.
Objetivos del Proyecto
- Configurar un proveedor de AWS en Terraform.
- Crear una VPC (Virtual Private Cloud).
- Configurar subredes públicas y privadas.
- Implementar instancias de EC2 en las subredes.
- Configurar un balanceador de carga (ELB).
- Configurar reglas de seguridad (Security Groups).
Requisitos Previos
- Cuenta de AWS activa.
- Terraform instalado y configurado en tu máquina local.
- Conocimientos básicos de AWS y Terraform.
Paso 1: Configurar el Proveedor de AWS
Primero, necesitamos configurar el proveedor de AWS en nuestro archivo de configuración de Terraform.
Explicación
provider "aws"
: Define el proveedor de AWS.region
: Especifica la región de AWS donde se desplegarán los recursos.
Paso 2: Crear una VPC
Vamos a crear una VPC con un bloque CIDR de 10.0.0.0/16
.
Explicación
resource "aws_vpc" "main"
: Define un recurso de VPC en AWS.cidr_block
: Especifica el rango de direcciones IP para la VPC.tags
: Añade etiquetas para identificar la VPC.
Paso 3: Configurar Subredes Públicas y Privadas
Vamos a crear una subred pública y una privada dentro de la VPC.
# subnets.tf resource "aws_subnet" "public" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" map_public_ip_on_launch = true availability_zone = "us-west-2a" tags = { Name = "public-subnet" } } resource "aws_subnet" "private" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "us-west-2a" tags = { Name = "private-subnet" } }
Explicación
vpc_id
: Asocia la subred con la VPC creada anteriormente.cidr_block
: Define el rango de direcciones IP para la subred.map_public_ip_on_launch
: Asigna automáticamente una IP pública a las instancias en la subred pública.availability_zone
: Especifica la zona de disponibilidad.
Paso 4: Implementar Instancias de EC2
Vamos a crear una instancia de EC2 en la subred pública y otra en la subred privada.
# ec2.tf resource "aws_instance" "public_instance" { ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI instance_type = "t2.micro" subnet_id = aws_subnet.public.id tags = { Name = "public-instance" } } resource "aws_instance" "private_instance" { ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI instance_type = "t2.micro" subnet_id = aws_subnet.private.id tags = { Name = "private-instance" } }
Explicación
ami
: Especifica la Amazon Machine Image (AMI) para la instancia.instance_type
: Define el tipo de instancia.subnet_id
: Asocia la instancia con la subred correspondiente.
Paso 5: Configurar un Balanceador de Carga (ELB)
Vamos a configurar un balanceador de carga para distribuir el tráfico entre las instancias.
# elb.tf resource "aws_elb" "web" { name = "web-load-balancer" availability_zones = ["us-west-2a"] listener { instance_port = 80 instance_protocol = "HTTP" lb_port = 80 lb_protocol = "HTTP" } instances = [aws_instance.public_instance.id] health_check { target = "HTTP:80/" interval = 30 timeout = 5 healthy_threshold = 2 unhealthy_threshold = 2 } tags = { Name = "web-load-balancer" } }
Explicación
availability_zones
: Define las zonas de disponibilidad donde el ELB estará activo.listener
: Configura el puerto y el protocolo para el balanceador de carga.instances
: Lista de instancias que el ELB balanceará.health_check
: Configura las verificaciones de salud para las instancias.
Paso 6: Configurar Reglas de Seguridad (Security Groups)
Vamos a crear grupos de seguridad para las instancias y el balanceador de carga.
# security_groups.tf resource "aws_security_group" "web_sg" { vpc_id = aws_vpc.main.id ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "web-sg" } } resource "aws_security_group" "private_sg" { vpc_id = aws_vpc.main.id ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "private-sg" } }
Explicación
ingress
: Define las reglas de entrada para el grupo de seguridad.egress
: Define las reglas de salida para el grupo de seguridad.
Ejercicio Práctico
- Configura el proveedor de AWS en Terraform.
- Crea una VPC con un bloque CIDR de
10.0.0.0/16
. - Configura una subred pública y una privada.
- Implementa una instancia de EC2 en cada subred.
- Configura un balanceador de carga para la instancia pública.
- Crea grupos de seguridad para las instancias y el balanceador de carga.
Solución
La solución completa se encuentra en los archivos de configuración proporcionados anteriormente. Asegúrate de aplicar los cambios utilizando los comandos de Terraform:
Conclusión
En este proyecto, hemos creado una infraestructura básica en AWS utilizando Terraform. Hemos configurado una VPC, subredes, instancias de EC2, un balanceador de carga y grupos de seguridad. Este ejercicio práctico te proporciona una base sólida para gestionar infraestructuras más complejas en el futuro.
En el siguiente proyecto, exploraremos cómo desplegar una infraestructura multi-nube utilizando Terraform. ¡Sigue adelante y sigue aprendiendo!
Curso de Terraform
Módulo 1: Introducción a Terraform
- ¿Qué es Terraform?
- Instalando Terraform
- Conceptos Básicos de Terraform
- Primera Configuración de Terraform
Módulo 2: Lenguaje de Configuración de Terraform
Módulo 3: Gestión del Estado
Módulo 4: Módulos de Terraform
Módulo 5: Aprovisionamiento de Recursos
- Conceptos Básicos de Aprovisionamiento
- Aprovisionamiento de Recursos AWS
- Aprovisionamiento de Recursos Azure
- Aprovisionamiento de Recursos GCP
Módulo 6: Funcionalidades Avanzadas de Terraform
Módulo 7: Mejores Prácticas de Terraform
- Organización del Código
- Control de Versiones
- Pruebas del Código de Terraform
- Mejores Prácticas de Seguridad
Módulo 8: Terraform en CI/CD
- Integración de Terraform con CI/CD
- Automatización de Terraform con Jenkins
- Uso de Terraform con GitHub Actions
- Terraform Cloud y Enterprise