Saltar a contenido

10 — Service Accounts e IAM

Anterior: 09 — Cloud Storage

Las service accounts son identidades que Cloud Run y otros servicios usan para acceder a otros recursos de GCP. Este capítulo crea la service account y le otorga solo los permisos que necesita.


Principio de mínimo privilegio

Seguimos el principio de mínimo privilegio: dar a cada identidad solo los permisos que necesita, nada más.

Nuestro servicio web de Cloud Run necesita: - Secret Manager — leer secretos (DATABASE_URL, SECRET_KEY, etc.) - Cloud Storage — leer/escribir buckets estáticos y de medios

NO necesita: - Cloud SQL Admin (no estamos usando Cloud SQL) - Compute Admin (no estamos ejecutando VMs) - IAM completo (demasiado amplio)


Crear service account con Terraform

Agrega a infrastructure/main.tf:

# Service account for Cloud Run
resource "google_service_account" "run" {
  account_id   = "mycoolproject-run"
  display_name = "MyCoolProject Cloud Run Service Account"
}

# Grant permissions to read secrets
resource "google_project_iam_member" "run_secret_accessor" {
  project = var.project_id
  role    = "roles/secretmanager.secretAccessor"
  member  = "serviceAccount:${google_service_account.run.email}"
}

# Grant permissions to manage storage buckets
resource "google_project_iam_member" "run_storage_admin" {
  project = var.project_id
  role    = "roles/storage.objectAdmin"
  member  = "serviceAccount:${google_service_account.run.email}"
}

# Grant permissions to manage Cloud Tasks
resource "google_project_iam_member" "run_cloudtasks_admin" {
  project = var.project_id
  role    = "roles/cloudtasks.admin"
  member  = "serviceAccount:${google_service_account.run.email}"
}

Ejecuta terraform apply para crear la service account y los permisos.


Formato del email de service account

El email de la service account será:

mycoolproject-run@mycoolproject-prod.iam.gserviceaccount.com

Este formato se usa en todo Terraform y comandos gcloud para referenciar la identidad.


Service account para el worker de Cloud Tasks

El worker de Cloud Tasks (Cloud Run Job) necesita sus propios permisos para ejecutar comandos de gestión de Django y acceder a secretos:

# Service account for Cloud Tasks worker (background jobs)
resource "google_service_account" "worker" {
  account_id   = "mycoolproject-worker"
  display_name = "MyCoolProject Worker Service Account"
}

# Grant same permissions as web service account
resource "google_project_iam_member" "worker_secret_accessor" {
  project = var.project_id
  role    = "roles/secretmanager.secretAccessor"
  member  = "serviceAccount:${google_service_account.worker.email}"
}

resource "google_project_iam_member" "worker_storage_admin" {
  project = var.project_id
  role    = "roles/storage.objectAdmin"
  member  = "serviceAccount:${google_service_account.worker.email}"
}

resource "google_project_iam_member" "worker_cloudtasks_admin" {
  project = var.project_id
  role    = "roles/cloudtasks.admin"
  member  = "serviceAccount:${google_service_account.worker.email}"
}

Resumen de roles IAM

Service Account Rol Por qué
mycoolproject-run secretmanager.secretAccessor Leer secretos (DB, clave secreta, etc.)
mycoolproject-run storage.objectAdmin Leer/escribir archivos estáticos y de medios
mycoolproject-run cloudtasks.admin Encolar tareas desde el servicio web
mycoolproject-worker secretmanager.secretAccessor Leer secretos para trabajos en segundo plano
mycoolproject-worker storage.objectAdmin Escribir archivos procesados si es necesario
mycoolproject-worker cloudtasks.admin Procesar tareas de la cola

Outputs para emails de service accounts

Agrega a main.tf:

output "run_service_account_email" {
  value = google_service_account.run.email
}

output "worker_service_account_email" {
  value = google_service_account.worker.email
}

Verificar las service accounts

gcloud iam service-accounts list --project=mycoolproject-prod

Deberías ver tanto mycoolproject-run como mycoolproject-worker.


Qué hemos construido hasta ahora

Después de los capítulos 05-10, Terraform ha creado: - Proyecto GCP con APIs habilitadas - Repositorio de Artifact Registry - Secretos de Secret Manager (estructura, no valores) - Buckets de Cloud Storage (estáticos + medios) - Service accounts con permisos IAM

Próximo: Servicio de Cloud Run (el servidor web real).