Infrastructure as Code
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
- 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
- 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
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