Con Terraform AWS IAM conviertes usuarios, roles y políticas en infraestructura declarativa: revisable en Git, aplicable en CI/CD y alineada con el principio de least privilege. Esta guía muestra cómo modelar un rol para un workload en EC2, adjuntar políticas administradas y gestionar iam_policy_document sin hacer clic en la consola de AWS.
- Qué obtendrás: ejemplo de módulo mínimo, buenas prácticas de nombres y cómo evitar credenciales estáticas.
- Prerrequisitos: cuenta AWS, Terraform instalado y credenciales vía perfil o OIDC.
Contenido
¿Por qué Terraform AWS IAM?
Gestionar IAM solo desde la consola genera deuda operativa: políticas duplicadas, permisos demasiado amplios y ausencia de trazabilidad. Terraform AWS IAM te permite versionar cada cambio, abrir pull requests y aplicar el mismo modelo en varias cuentas o regiones. El proveedor oficial hashicorp/aws expone recursos como aws_iam_role, aws_iam_policy y aws_iam_role_policy_attachment con documentación en HashiCorp Developer.
Si ya despliegas red con nuestro tutorial de Terraform AWS VPC, el siguiente paso natural es cerrar el perímetro de identidades antes de añadir bases de datos con Terraform AWS RDS. También puedes enlazar el flujo con despliegues de contenedores documentados en Portainer Docker Compose para equipos híbridos cloud + bare metal.
Terraform AWS IAM: conceptos imprescindibles
Antes de escribir HCL, alinea el vocabulario: un role es una identidad que asumen servicios o usuarios federados; la trust policy define quién puede asumir el rol; las permissions policies describen acciones sobre recursos. En Terraform AWS IAM suele usarse data "aws_iam_policy_document" para componer JSON legible y reutilizable. Consulta la referencia de AWS IAM User Guide cuando dudes sobre ARN, condiciones y límites de recursos.
Evita mezclar usuarios de larga duración con claves en EC2: prefiere instance profiles que adjuntan un rol al nodo y rotan credenciales automáticamente. Esta práctica refuerza que Terraform AWS IAM no es solo “crear policies”, sino automatizar el modelo de confianza correcto.
Ejemplo Terraform AWS IAM para una instancia EC2
El siguiente bloque define un rol asumible por EC2, una política mínima para leer objetos en un bucket y un instance profile. Ajusta ARNs y nombres a tu entorno:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "eu-west-1"
}
data "aws_iam_policy_document" "ec2_assume" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
}
resource "aws_iam_role" "app" {
name = "demo-app-ec2-role"
assume_role_policy = data.aws_iam_policy_document.ec2_assume.json
}
data "aws_iam_policy_document" "s3_read" {
statement {
sid = "AllowReadConfigBucket"
actions = ["s3:GetObject", "s3:ListBucket"]
resources = [
"arn:aws:s3:::mi-bucket-config",
"arn:aws:s3:::mi-bucket-config/*",
]
}
}
resource "aws_iam_policy" "app_s3_read" {
name = "demo-app-s3-read"
policy = data.aws_iam_policy_document.s3_read.json
}
resource "aws_iam_role_policy_attachment" "attach" {
role = aws_iam_role.app.name
policy_arn = aws_iam_policy.app_s3_read.arn
}
resource "aws_iam_instance_profile" "app" {
name = "demo-app-ec2-profile"
role = aws_iam_role.app.name
}
Tras terraform plan y apply, asocia el instance_profile en tu aws_instance o plantilla de Auto Scaling. Conserva los nombres en un prefijo por entorno (prod-, staging-) para minimizar colisiones. Este patrón es la base de muchos módulos públicos en el Terraform Registry.
Terraform AWS IAM: políticas administradas vs inline
AWS distingue entre managed policies reutilizables y inline policies ligadas a un solo rol o usuario. En Terraform AWS IAM, las administradas se modelan con aws_iam_policy y ARN compartido; las inline con aws_iam_role_policy cuando el alcance es único y quieres evitar proliferar objetos globales. Para servicios de datos sensibles, combina políticas administradas AWS (por ejemplo lectura de CloudWatch) con una política custom mínima para tu bucket S3 o cola SQS.
Los límites de tamaño (2048 caracteres para inline sobre usuarios, 10 240 sobre roles) deben vigilarse en pipelines que generan JSON dinámico. Si tu equipo usa AWS Organizations SCP, recuerda que las SCP limitan el máximo permiso efectivo: Terraform AWS IAM puede crear políticas perfectas en la cuenta hija y aun así quedar acotadas por la guardrail corporativa — coordina con el equipo de cloud governance antes de abrir tickets de “permiso denegado”.
Terraform AWS IAM: estado, drift y gobierno
Los cambios manuales en IAM rompen la fuente de verdad: programa scans periódicos y usa políticas OPA/Sentinel si trabajas con Terraform Cloud. Cuando detectes drift, importa o vuelve a aplicar el código. Para equipos grandes, separa Terraform AWS IAM en un workspace dedicado y protege el pipeline con revisiones obligatorias; documenta también el uso de Terraform OSS en GitHub y versiones del proveedor AWS.
El backend remoto (S3 + DynamoDB para lock) es especialmente útil cuando varias personas tocan identidades: serializa apply y guarda historial versionado. Etiqueta los roles con tags estándar (Owner, CostCenter, DataClassification) para que informes de seguridad y finops identifiquen rápidamente recursos huérfanos. En auditorías ISO o SOC, demostrar que cada modificación de Terraform AWS IAM pasó por PR acelera el cierre de hallazgos.
Terraform AWS IAM: federación, MFA y condiciones
Cuando integres SAML u OIDC, el rol de confianza incluirá el proveedor de identidad y condiciones como StringEquals sobre el ID de audiencia. Terraform AWS IAM permite fijar esas condiciones en el documento JSON y evitar que un token emitido para otra aplicación asuma el rol equivocado. Añade aws:MultiFactorAuthPresent en políticas sensibles para exigir MFA en sesiones interactivas.
Para cargas automatizadas (CI/CD), usa roles OIDC en GitHub Actions o GitLab en lugar de claves de larga duración: reduces superficie y puedes auditar cada ejecución por subject del token. Este patrón se complementa con la guía de Terraform GitHub Provider publicada en el blog, donde el mismo enfoque declarativo se aplica a repos y ramas protegidas.
Terraform AWS IAM: troubleshooting habitual
Los errores más comunes al aplicar Terraform AWS IAM incluyen MalformedPolicyDocument (comillas o ARN incorrectos), AccessDenied por SCP o boundary policy, y límites de adjuntos por rol. Revisa el Effective permissions en la consola solo como verificación puntual; la fuente debe seguir siendo el código. Si migras políticas existentes, usa terraform import sobre aws_iam_role y documenta el ID importado en el changelog interno.
| Síntoma | Causa probable | Acción |
|---|---|---|
| AssumeRole falla desde EC2 | Trust policy incorrecta o perfil no asociado | Validar Principal y instance_profile |
| 403 en API concreta | Falta acción IAM o condición de recurso | Ampliar statement puntual, no usar * global |
| Plan muestra cambio perpetuo | Orden JSON distinto o normalización AWS | Usar aws_iam_policy_document y ignorar campos opcionales |
Integra alertas con stacks de observabilidad ya descritos en el blog — por ejemplo Uptime Kuma Docker Compose para disponibilidad perimetral — de modo que una rotación fallida de rol sea visible antes de producción.
Terraform AWS IAM: pruebas locales y pipelines seguros
Antes de fusionar a main, ejecuta terraform validate y terraform plan -out=tfplan en un runner aislado. Almacena el plan firmado si usas Terraform Enterprise/Cloud y restringe quién puede aprobar apply en producción. Para secretos, nunca pegues claves en el código: usa TF_VAR_ con variables sensibles marcadas sensitive = true o integra Vault/AWS Secrets Manager. El módulo de Terraform AWS IAM debe vivir en un repositorio distinto a aplicaciones para que los permisos de pipeline no colapsen con el despliegue de microservicios.
En entornos multi-región, replica políticas con for_each sobre una lista de regiones o delega en AWS Organizations. Documenta en Confluence o Notion el mapa “servicio → rol → política” para que soporte N2 entienda el impacto de un cambio aparentemente menor. Los equipos que combinan contenedores y EC2 suelen referenciar el mismo rol base y especializar solo los adjuntos S3 o SSM necesarios.
Terraform AWS IAM: buenas prácticas de naming y lifecycle
Usa prefijos por dominio (payments-, analytics-) y evita nombres genéricos como role1. Añade lifecycle { prevent_destroy = true } solo en recursos críticos tras validar pipelines; de lo contrario bloquearás eliminaciones legítimas. Cuando deprecas un rol, marca primero force_detach_policies y elimina dependencias en otros módulos. Las revisiones trimestrales de Terraform AWS IAM deben incluir lectura de CloudTrail filtrada por AssumeRole y alarmas de uso inusual coordinadas con el SOC.
Finalmente, alinea Terraform AWS IAM con el catálogo de datos: si una política permite kms:Decrypt, anótalo en el registro de cifrado y vincula la CMK correspondiente. Esta disciplina reduce incidentes donde el código IAM es correcto pero el contexto criptográfico no lo es.
Un hábito recomendable es revisar trimestralmente los permission boundaries y las políticas de sesión en roles federados: aunque Terraform AWS IAM describa el rol ideal, una boundary demasiado laxa heredada de proyectos antiguos puede conceder derechos efectivos mayores de lo esperado. Cruza esas revisiones con los informes de IAM Access Analyzer y con los hallazgos de configuración de AWS Security Hub para priorizar remediaciones.
Preguntas frecuentes sobre Terraform AWS IAM
¿Puedo gestionar SSO y OIDC? Sí; el proveedor AWS incluye recursos para proveedores de identidad y asignaciones de cuenta. El flujo es más complejo que un rol EC2, pero el patrón sigue siendo declarativo.
¿Qué tamaño debe tener una política? Tan pequeña como el servicio lo permita: divide por aplicación y evita * en recursos salvo requisitos justificados.
¿Cómo pruebo sin romper producción? Usa cuentas de sandbox, terraform workspace o backends distintos por entorno.
¿Debo usar AWS Control Tower? No es obligatorio, pero si ya operáis con OU y cuentas delegadas, encapsulad Terraform AWS IAM en un módulo estándar aprobado por arquitectura para que cada cuenta hija herede límites coherentes.
¿Qué pasa con las claves de acceso legacy? Migra a roles asumidos y elimina claves estáticas; si es inevitable, rota con automatismo y monitoriza CreateAccessKey en CloudTrail.
Conclusión: Terraform AWS IAM en producción
Terraform AWS IAM te da repetibilidad y auditoría sobre el pilar más sensible de AWS: quién puede hacer qué. Empieza por roles con trust explícito, políticas JSON generadas con aws_iam_policy_document y perfiles de instancia frente a claves largas. Cuando domines el flujo, podrás reutilizar módulos internos y alinear identidades con el resto de tu IaC.
El camino de madurez suele pasar por tres fases: (1) importar lo existente y congelar cambios manuales, (2) estandarizar módulos y etiquetas por coste, (3) integrar detección de anomalías y simulaciones de permisos en el pipeline. Documenta cada fase con métricas — tiempo medio de revisión de PR, número de roles huérfanos, hallazgos de IAM Access Analyzer — para demostrar mejora continua a dirección y clientes.
Recuerda que Terraform AWS IAM no sustituye la cultura de seguridad: revisa los permisos cuando un servicio añade nuevas APIs, y mantén comunicación fluida con el equipo de aplicaciones para que los despliegues no asuman credenciales mágicas fuera del control de Terraform. Con esa disciplina, tu nube mantiene trazabilidad y velocidad al mismo tiempo.
