Infrastructure as Code (IaC) es la práctica de gestionar y aprovisionar infraestructura de computación a través de archivos de configuración en lugar de procesos manuales.

¿Qué es IaC?

IaC es el proceso de gestionar y aprovisionar infraestructura de computación a través de archivos de configuración que pueden ser versionados, reutilizados y compartidos.

Beneficios de IaC

Automatización

  • Despliegue automatizado: Infraestructura desplegada automáticamente
  • Consistencia: Configuración consistente entre entornos
  • Reproducibilidad: Misma infraestructura en diferentes entornos
  • Eficiencia: Reducción de tiempo de despliegue

Control de Versiones

  • Versionado: Control de versiones de infraestructura
  • Rollback: Capacidad de revertir cambios
  • Historial: Trazabilidad de cambios
  • Colaboración: Múltiples desarrolladores trabajando juntos

Seguridad

  • Configuración segura: Configuración segura por defecto
  • Auditoría: Trazabilidad de cambios
  • Compliance: Cumplimiento normativo
  • Validación: Validación de configuración

Herramientas de IaC

Terraform

  • Multi-cloud: Soporte para múltiples proveedores
  • Estado: Gestión de estado de infraestructura
  • Plan: Planificación de cambios
  • Apply: Aplicación de cambios

Ansible

  • Agentless: No requiere agentes
  • YAML: Configuración en YAML
  • Idempotencia: Ejecución idempotente
  • Orquestación: Orquestación de tareas

CloudFormation

  • AWS nativo: Servicio nativo de AWS
  • JSON/YAML: Configuración en JSON o YAML
  • Stacks: Gestión de stacks
  • Drift detection: Detección de desviaciones

Pulumi

  • Multi-language: Múltiples lenguajes de programación
  • Real-time: Actualizaciones en tiempo real
  • Testing: Capacidades de testing
  • CI/CD: Integración con CI/CD

Ejemplo con Terraform

Configuración Básica

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# main.tf
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1d0"
  instance_type = "t3.micro"
  
  tags = {
    Name = "Web Server"
    Environment = "production"
  }
}

resource "aws_security_group" "web_sg" {
  name_prefix = "web-"
  
  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"]
  }
}

Módulos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# modules/web-server/main.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t3.micro"
}

variable "environment" {
  description = "Environment name"
  type        = string
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = var.instance_type
  
  tags = {
    Name        = "Web Server"
    Environment = var.environment
  }
}

# modules/web-server/outputs.tf
output "instance_id" {
  description = "ID of the EC2 instance"
  value       = aws_instance.web.id
}

Uso de Módulos

1
2
3
4
5
6
7
# main.tf
module "web_server" {
  source = "./modules/web-server"
  
  instance_type = "t3.small"
  environment   = "production"
}

Ejemplo con Ansible

Playbook Básico

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# playbook.yml
---
- name: Configure web server
  hosts: web_servers
  become: yes
  vars:
    nginx_port: 80
    
  tasks:
    - name: Install nginx
      package:
        name: nginx
        state: present
        
    - name: Start nginx
      service:
        name: nginx
        state: started
        enabled: yes
        
    - name: Configure nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
      
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

Inventario

1
2
3
4
5
6
7
# inventory.ini
[web_servers]
web1 ansible_host=10.0.1.10
web2 ansible_host=10.0.1.11

[db_servers]
db1 ansible_host=10.0.2.10

Seguridad en IaC

Configuración Segura

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Configuración segura de S3
resource "aws_s3_bucket" "secure_bucket" {
  bucket = "my-secure-bucket"
  
  versioning {
    enabled = true
  }
  
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }
  
  public_access_block {
    block_public_acls       = true
    block_public_policy     = true
    ignore_public_acls      = true
    restrict_public_buckets = true
  }
}

Gestión de Secretos

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Uso de secretos
resource "aws_db_instance" "database" {
  identifier = "my-database"
  engine     = "mysql"
  
  username = var.db_username
  password = var.db_password
  
  vpc_security_group_ids = [aws_security_group.db.id]
}

Validación

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Validación de entrada
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  
  validation {
    condition     = contains(["t3.micro", "t3.small", "t3.medium"], var.instance_type)
    error_message = "Instance type must be t3.micro, t3.small, or t3.medium."
  }
}

Mejores Prácticas

Estructura de Proyecto

project/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
├── modules/
│   └── web-server/
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf
└── environments/
    ├── dev/
    ├── staging/
    └── production/

Versionado

  • Git: Usar Git para control de versiones
  • Tags: Etiquetar versiones
  • Branches: Usar ramas para diferentes entornos
  • Commits: Mensajes de commit descriptivos

Testing

  • Unit tests: Pruebas unitarias
  • Integration tests: Pruebas de integración
  • Security tests: Pruebas de seguridad
  • Compliance tests: Pruebas de cumplimiento

CI/CD

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# .github/workflows/terraform.yml
name: Terraform
on:
  push:
    branches: [main]
    
jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1
        
      - name: Terraform Init
        run: terraform init
        
      - name: Terraform Plan
        run: terraform plan
        
      - name: Terraform Apply
        run: terraform apply -auto-approve

Monitoreo y Auditoría

Logs

  • Terraform logs: Logs de ejecución
  • Cloud logs: Logs de proveedores cloud
  • Application logs: Logs de aplicaciones
  • Security logs: Logs de seguridad

Métricas

  • Deployment time: Tiempo de despliegue
  • Success rate: Tasa de éxito
  • Error rate: Tasa de errores
  • Resource usage: Uso de recursos

Alertas

  • Deployment failures: Fallos de despliegue
  • Configuration drift: Desviaciones de configuración
  • Security issues: Problemas de seguridad
  • Performance issues: Problemas de rendimiento

Conceptos Relacionados

  • DevOps - Metodología que incluye IaC
  • SecOps - Operaciones de seguridad con IaC
  • Cloud Security - Seguridad en la nube con IaC
  • GitLab - Plataforma que gestiona IaC
  • Container Management - Gestión de contenedores con IaC
  • CSPM - Gestión de postura de seguridad en la nube
  • SIEM - Monitoreo de infraestructura IaC
  • SOAR - Automatización de IaC
  • Registros - Logs de infraestructura IaC
  • Dashboards - Visualización de infraestructura IaC
  • Métricas - Medición de infraestructura IaC
  • CISO - Rol que supervisa IaC

Referencias