Infraestructura como código
1. Infraestructura como Código (IaC)¶
La IaC permite definir y gestionar infraestructura de TI mediante archivos de configuración (código), en lugar de procesos manuales. Esto brinda reproducibilidad, automatización y control de versiones sobre recursos como servidores, redes y políticas de seguridad.
Beneficios clave:
✔ Consistencia: Elimina errores humanos en despliegues.
✔ Escalabilidad: Permite replicar entornos rápidamente (ej.: Dev, QA, Prod).
✔ Auditoría: Cambios rastreables mediante Git.
Ejemplo de uso:
- Definir una VPC con subredes públicas/privadas, NAT Gateway y grupos de seguridad en un archivo reutilizable.
2. Terraform (by HashiCorp)¶
Herramienta de IaC multinube que usa el lenguaje HCL (HashiCorp Configuration Language). Gestiona el ciclo de vida completo de recursos (crear, modificar, eliminar) mediante proveedores (providers).
Características avanzadas:
- Estado (State File):
- Almacena el estado actual de la infraestructura en un archivo (local o remoto en S3).
- Permite detectar drifts (diferencias entre lo definido y lo desplegado).
- Módulos:
- Plantillas reutilizables para arquitecturas comunes (ej.: módulo de EKS, módulo de RDS).
-
Ejemplo:
module "vpc" { source = "terraform-aws-modules/vpc/aws" cidr = "10.0.0.0/16" } -
Planificación (
terraform plan): - Simula cambios antes de aplicarlos (evita sorpresas).
Ejemplo de uso en AWS:
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "ServidorWeb"
}
}
Ventajas vs CloudFormation:
| Terraform | CloudFormation |
|---|---|
| Soporte multi-nube | Solo AWS |
| Sintaxis más legible (HCL) | JSON/YAML más verboso |
| Comunidad activa y módulos | Menos flexibilidad |
Estructura de proyecto terraform¶
Un proyecto en terraform tiene la siguiente estructura:
terraform-project/
│
├── main.tf # Configuración principal (recursos, proveedores, etc.)
├── variables.tf # Declaración de variables con tipos y descripciones
├── outputs.tf # Definición de salidas del módulo/proyecto
├── terraform.tfvars # Valores asignados a las variables
├── versions.tf # Requisitos de versión (Terraform y proveedor)
├── backend.tf # (opcional) Configuración de backend para el estado remoto
│
├── modules/ # (opcional) Módulos reutilizables definidos localmente
│ └── vpc/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│
└── envs/ # (opcional) Configuración por entorno (dev, staging, prod)
├── dev/
│ └── terraform.tfvars
└── prod/
└── terraform.tfvars
¶
terraform-project/
│
├── main.tf # Configuración principal (recursos, proveedores, etc.)
├── variables.tf # Declaración de variables con tipos y descripciones
├── outputs.tf # Definición de salidas del módulo/proyecto
├── terraform.tfvars # Valores asignados a las variables
├── versions.tf # Requisitos de versión (Terraform y proveedor)
├── backend.tf # (opcional) Configuración de backend para el estado remoto
│
├── modules/ # (opcional) Módulos reutilizables definidos localmente
│ └── vpc/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│
└── envs/ # (opcional) Configuración por entorno (dev, staging, prod)
├── dev/
│ └── terraform.tfvars
└── prod/
└── terraform.tfvars
Enlace: https://developer.hashicorp.com/terraform
3. Ansible¶
Herramienta de automatización de configuración (no es un gestor de infraestructura como Terraform). Usa YAML para definir playbooks que configuran servidores post-despliegue.
Casos de uso típicos:
- Instalar paquetes (apt, yum).
- Configurar servicios (Nginx, Docker).
- Aplicar parches de seguridad.
Ejemplo de Playbook:
- name: Instalar Nginx
hosts: webservers
tasks:
- name: Actualizar apt
apt: update_cache=yes
- name: Instalar Nginx
apt: name=nginx state=latest
Diferencias clave con Terraform:
| Terraform | Ansible |
|---|---|
| Gestiona infraestructura | Configura sistemas existentes |
| Estado centralizado | Sin estado (idempotente) |
| HCL | YAML |
4. CloudFormation¶
CloudFormation es un servicio nativo de AWS que permite modelar, aprovisionar y gestionar recursos de AWS mediante plantillas declarativas en formato JSON o YAML. A diferencia de Terraform (multinube), CloudFormation está optimizado para AWS y ofrece integración profunda con otros servicios.
Características Clave¶
1. Plantillas Declarativas¶
- Estructura:
Resources: MyEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0c55b159cbfafe1f0 InstanceType: t2.micro - Ventajas:
- Sintaxis estándar (YAML/JSON).
- Documentación integrada en AWS.
2. Gestión de Estados¶
- Stack (Pila): Grupo lógico de recursos que se despliegan juntos.
- Eventos y Rollback: Si falla un recurso, CloudFormation revierte los cambios automáticamente.
3. Drift Detection¶
- Detecta diferencias entre la plantilla y los recursos desplegados.
4. Componentes Reutilizables¶
- Plantillas anidadas (Nested Stacks): Dividir infraestructura en módulos.
- Macros: Personalizar plantillas con lógica custom (ej.: generar nombres dinámicos).
Ejemplo de Uso¶
Escenario: Desplegar una VPC + EC2 + Security Group.
AWSTemplateFormatVersion: '2010-09-09'
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Permitir SSH y HTTP"
VpcId: !Ref MyVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0c55b159cbfafe1f0
InstanceType: t2.micro
SecurityGroupIds:
- !Ref MySecurityGroup
Comparación: Terraform vs. CloudFormation¶
| Criterio | Terraform | CloudFormation |
|---|---|---|
| Lenguaje | HCL (más legible) | JSON/YAML (verboso) |
| Multi-nube | Sí (AWS, Azure, GCP, etc.) | Solo AWS |
| Estado | Guardado en backend (ej.: S3 + DynamoDB) | Gestionado por AWS (no accesible directamente) |
| Velocidad | Más rápido en despliegues complejos | Más lento con stacks grandes |
| Extensibilidad | Módulos de comunidad (Terraform Registry) | Macros y plantillas anidadas |
| Costo | Gratis (solo costos de recursos AWS) | Gratis (solo costos de recursos AWS) |
Ventajas de CloudFormation¶
✔ Integración nativa con servicios AWS (ej.: IAM, CloudTrail).
✔ Soporte oficial de AWS (actualizaciones simultáneas a nuevos servicios).
✔ Rollback automático en errores.
Desventajas¶
✖ Aprendizaje complejo en plantillas grandes (YAML/JSON verboso).
✖ Sin soporte para otros clouds.
¿Cuándo Usar CloudFormation?¶
- Entornos 100% AWS (sin necesidad de multi-nube).
- Cumplimiento empresarial (ej.: políticas de seguridad estrictas).
- Automatización nativa con CodePipeline y Service Catalog.
¿Necesitas un ejemplo avanzado (ej.: EKS + RDS con CloudFormation)?
Tabla Comparativa: IaC en AWS¶
| Herramienta | Lenguaje | Enfoque | Integración AWS | Escenario Ideal |
|---|---|---|---|---|
| Terraform | HCL | Infraestructura multi-nube | Todos los servicios | Entornos híbridos o multi-nube |
| CloudFormation | JSON/YAML | Infraestructura AWS nativa | Soporte nativo | Entornos 100% AWS |
| Ansible | YAML | Configuración y automatización | Módulos para EC2, IAM | Post-despliegue y orquestación |