Terraform IAM: roles y policies automáticos

Clase 13 de 30Curso de Ciberseguridad para Desarrollo Web

Resumen

Configura en minutos una base sólida de infraestructura como código en AWS con Terraform, módulos IAM, policies, roles y estado remoto en S3. Aprenderás a estructurar carpetas, crear policies en json, conectar módulos con outputs y ejecutar los comandos clave: init, fmt, plan y apply. Resultado: un rol con permisos para RDS y logs en CloudWatch listo para tus funciones Lambda.

¿Cómo preparar el entorno con Make y Terraform?

Para automatizar y versionar la infraestructura se usan infraestructura como código, Make y Terraform. La verificación y la instalación correcta evitan fallos al ejecutar los planes.

¿Qué herramientas instalar y cómo verificar la instalación?

  • Instala Make en Mac o Linux por defecto. En Windows: instalar manualmente.
  • Verifica que quedó instalado: make --version.
  • Descarga Terraform desde su landing para Mac, Windows o Linux.

¿Cómo organizar la carpeta infra y el backend en S3?

  • En la raíz del proyecto crea una carpeta: infra o terraform.
  • Dentro vivirá todo: módulos, policies, roles y archivos .tf.
  • Configura el backend en S3 para guardar el estado remoto: bucket platzi-tf-security, key predeterminada terraform.tfstate, región us-east-2 (Ohio).
terraform {
  backend "s3" {
    bucket = "platzi-tf-security"
    key    = "terraform.tfstate"
    region = "us-east-2"
  }
}
  • Define que trabajarás con AWS y usa la región más cercana a ti.

¿Cómo modelar IAM con módulos, policies y roles en Terraform?

La sintaxis de Terraform “trae” valores de afuera hacia adentro y los referencia por nombre. Usa módulos para separar responsabilidades: iam/policies y iam/roles.

¿Cómo definir policies en json para RDS y logs?

  • Crea dos policies: una para acceso a RDS y otra para logs en CloudWatch.
  • Usa un recurso aws_iam_policy con jsonencode y genera el json con el AWS Policy Generator.
# policies/can_access_rds.tf
resource "aws_iam_policy" "can_access_RDS" {
  name        = "can_access_RDS"
  path        = "/"
  description = "Databases for queries."
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Effect   = "Allow",
      Action   = [/* acciones de RDS */],
      Resource = "*"
    }]
  })
}

output "can_access_RDS_arn" {
  value = aws_iam_policy.can_access_RDS.arn
}
# policies/can_log.tf
resource "aws_iam_policy" "can_log" {
  name        = "can_log"
  path        = "/"
  description = "Allow logs to CloudWatch."
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Effect = "Allow",
      Action = [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      Resource = "*"
    }]
  })
}

output "can_log_arn" {
  value = aws_iam_policy.can_log.arn
}
  • Habilidades y conceptos aplicados: definición de recursos aws_iam_policy, uso de jsonencode, diseño de permisos con efecto Allow, acciones y resource, y exposición de ARNs con outputs.

¿Cómo crear el rol RepoCollectorPlatzi y pasar ARNs entre módulos?

  • En iam/roles, define variables para recibir los ARNs: RDSpolicy_arn y logPolicy_arn.
  • Crea el rol RepoCollectorPlatzi con su documento de asunción.
# roles/vars.tf
variable "RDSpolicy_arn" { type = string }
variable "logPolicy_arn" { type = string }

# roles/role.tf
data "aws_iam_policy_document" "assume_role" {
  # documento para asumir el rol (Lambda u otro servicio)
}

resource "aws_iam_role" "RepoCollectorPlatzi" {
  name               = "RepoCollectorPlatzi"
  assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

# adjunta las policies usando los ARNs recibidos por variables
# (recurso de attachment según corresponda)

output "repo_collector_role_arn" {
  value = aws_iam_role.RepoCollectorPlatzi.arn
}
  • Conecta los módulos en main.tf para pasar ARNs de policies al módulo de roles y exponer el output del rol:
module "policies" {
  source = "./iam/policies"
}

module "roles" {
  source         = "./iam/roles"
  RDSpolicy_arn  = module.policies.can_access_RDS_arn
  logPolicy_arn  = module.policies.can_log_arn
}

output "repo_collector_role_arn" {
  value = module.roles.repo_collector_role_arn
}

¿Cómo ejecutar terraform init, plan y apply para desplegar en AWS?

Una vez creados los archivos, inicializa, formatea, valida el plan y aplica los cambios. Si el plan no muestra cambios, revisa que el main.tf importe los módulos.

¿Qué hace cada comando y cómo interpretar el plan?

  • terraform init: inicializa módulos y estado en S3.
  • terraform fmt -recursive: formatea archivos .tf.
  • terraform plan: muestra qué creará, cambiará o borrará, sin ejecutar.
  • terraform apply: aplica el plan y solicita confirmación con yes.
terraform init
terraform fmt -recursive
terraform plan
terraform apply
  • Expectativa del plan: crear 2 policies (RDS y logs) y 1 rol RepoCollectorPlatzi con las policies adjuntas.

¿Cómo validar en IAM que se creó todo?

  • En la consola de AWS IAM: verifica el rol RepoCollectorPlatzi.
  • Revisa que tenga adjuntas las policies can_access_RDS y can_log.
  • Abre cada policy para confirmar el json de permisos.

¿Tienes dudas sobre la estructura de módulos, el backend en S3 o las policies en json? Cuéntame en los comentarios qué parte te gustaría profundizar.