Brains4Cloud
ESEN
Practicar

Tema 5 de 11

D2 · Planificar e implementar una solución en la nube

Cloud Run, Cloud Run functions y Eventarc

El temario pide desplegar aplicaciones en plataformas serverless, incluido el procesamiento de eventos de Google Cloud: eventos de Pub/Sub, notificaciones de cambios en objetos de Cloud Storage y Eventarc. Este artículo cubre cómo se despliega y cómo se conecta a los eventos; las revisiones, el reparto de tráfico y el escalado están en el dominio D3.

Desde una imagen

La imagen se guarda en Artifact Registry (o Docker Hub) y se despliega indicando su URL.

Desde el código fuente

Con --source, Cloud Run construye el contenedor con Cloud Build y lo guarda en Artifact Registry.

# Desde una imagen
gcloud run deploy my-service --image us-docker.pkg.dev/PROJECT/repo/app:1.0 --region us-central1

# Desde el código fuente
gcloud run deploy my-service --source . --region us-central1
  • Cada despliegue crea una revisión nueva e inmutable.
  • El contenedor debe escuchar en un puerto TCP y atender peticiones HTTP.
  • Un servicio puede tener varios contenedores (sidecars) con --container; solo uno recibe el tráfico de entrada.
  • Roles habituales para desplegar: Cloud Run Admin y Service Account User sobre la cuenta de servicio con la que se ejecuta.

Quién puede invocar el servicio

Invocar un servicio requiere el rol Cloud Run Invoker (roles/run.invoker). Por defecto, solo pueden llamarlo los principales autorizados.

Servicio público

Desplegar con --allow-unauthenticated, que concede roles/run.invoker a allUsers. Para webs y APIs públicas.

Servicio privado

Concede roles/run.invoker solo a las cuentas que deben llamarlo, por ejemplo la cuenta de servicio de una suscripción push o de un trigger.

La política de organización «Restrict identities by domain» puede impedir añadir allUsers.

Ingress: desde dónde llega el tráfico

El acceso IAM decide quién; el ingress decide desde qué red se aceptan las peticiones.

AjusteQué permite
AllEl menos restrictivo: todo, incluidas las peticiones directas desde internet a la URL run.app
InternalEl más restrictivo: balanceador de aplicaciones interno, redes VPC del mismo proyecto, VPC compartida configurada, recursos dentro del perímetro de VPC Service Controls y ciertos productos de Google Cloud del mismo proyecto
Internal and Cloud Load BalancingLo anterior más el balanceador de aplicaciones externo. Las peticiones directas a run.app desde internet se bloquean, así que todo pasa por IAP, Cloud Armor o Cloud CDN

Desplegar Cloud Run functions

Una función se despliega en Cloud Run desde el código fuente indicando el punto de entrada y la imagen base del runtime.

gcloud run deploy my-function --source . \
  --function FUNCTION_ENTRYPOINT --base-image python314 --region europe-west1
  • --function: nombre de la función o clase completa que se ejecuta.
  • --base-image: entorno del runtime, como nodejs24, python314, go127, java25, dotnet10, ruby40 o php85.
  • Funciones HTTP: responden en el endpoint HTTPS del servicio, ideales para webhooks.
  • Funciones dirigidas por eventos: todas usan triggers de Eventarc para recibir los eventos.
  • Por compatibilidad siguen existiendo gcloud functions deploy, la API Cloud Functions v2 y el recurso de Terraform google_cloudfunctions2_function.

Servicio serverless y totalmente gestionado para enrutar eventos de forma asíncrona desde un origen hasta un destino, ocupándose de la entrega, la seguridad, la autorización, la observabilidad y los errores.

  • Un evento es un registro de que algo ocurrió: un cambio en una base de datos, un archivo nuevo, un trabajo programado.
  • Proveedores: más de 130 de Google, que envían eventos directamente (por ejemplo, Cloud Storage o Pub/Sub) o a través de entradas de Cloud Audit Logs.
  • Los eventos de Google usan Pub/Sub como transporte y llegan al destino en formato CloudEvents.
  • Destinos: Cloud Run (servicios y funciones), Workflows, GKE y endpoints HTTP internos de una VPC (estos dos, en vista previa).
  • Entrega al menos una vez, sin orden garantizado, con reintentos durante 24 horas por defecto.

Eventarc Standard y Advanced

StandardAdvanced
Para quéEntregar eventos de un proveedor a un destino con triggersBus central donde se publican eventos y los servicios se suscriben con enrollments
EnrutadoProveedor a destinoMuchos proveedores a muchos destinos
FiltradoPor tipo de evento y atributos concretosPor cualquier atributo
TransformaciónNoSí, con expresiones CEL, y conversión de esquema
Entre proyectosNoSí
Cola de mensajes fallidosSí, con el tema de dead letter de Pub/SubNo
Tamaño máximo del evento512 KB1 MB
Límites500 triggers por proyecto y regiónUn bus y 100 pipelines por proyecto y región

Ambas usan el mismo modelo de datos, así que se puede pasar de Standard a Advanced cuando el caso de uso se complica.

Crear un trigger de Eventarc

Un trigger filtra los eventos por origen, tipo y atributos, y los envía al destino. En la consola: Cloud Run → servicio → pestaña Triggers → Add trigger.

gcloud eventarc triggers create storage-trigger --location=us-central1 \
  --destination-run-service=my-service --destination-run-region=us-central1 \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=my-bucket" \
  --service-account=trigger-sa@PROJECT_ID.iam.gserviceaccount.com
Tipo de eventoCuándo
google.cloud.storage.object.v1.finalizedEvento directo: se crea un objeto en un bucket
google.cloud.pubsub.topic.v1.messagePublishedSe publica un mensaje en un tema (existente o creado por Eventarc)
google.cloud.audit.log.v1.writtenSe escribe una entrada de auditoría que cumple el filtro, p. ej. crear una VM
  • Ubicación: la del recurso que vigilas; normalmente el servicio de Cloud Run va en la misma región.
  • Identidad: el trigger usa una cuenta de servicio. Si no indicas ninguna, usa la cuenta predeterminada de Compute Engine, que puede tener permisos excesivos. Google recomienda una cuenta gestionada por el usuario con permisos mínimos.
  • Los eventos llegan al servicio como peticiones HTTP.

Eventos de Pub/Sub: suscripción push

Además de Eventarc, un servicio de Cloud Run puede recibir mensajes de un tema mediante una suscripción push que hace una petición HTTP al servicio por cada mensaje.

gcloud iam service-accounts create cloud-run-pubsub-invoker
gcloud run services add-iam-policy-binding pubsub-tutorial \
  --member=serviceAccount:cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/run.invoker
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \
  --ack-deadline=600 --push-endpoint=SERVICE-URL/ \
  --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com

El servicio puede seguir siendo privado: la suscripción se autentica con una cuenta de servicio que tiene roles/run.invoker.

Notificaciones de cambios en Cloud Storage

Las notificaciones de Pub/Sub para Cloud Storage publican en un tema un mensaje con el evento y el objeto afectado. La alternativa más directa, si no quieres gestionar un tema, es una Cloud Run function con trigger de Cloud Storage (el bucket debe estar en el mismo proyecto).

EventoCuándo se envía
OBJECT_FINALIZESe crea un objeto o una nueva generación (incluye copiar, reescribir o restaurar). Una subida fallida no lo dispara
OBJECT_METADATA_UPDATECambian los metadatos de un objeto existente
OBJECT_DELETESe borra un objeto de forma permanente (incluido por el ciclo de vida)
OBJECT_ARCHIVESolo con versionado: la versión activa pasa a no actual
OBJECT_INITIALIZEEmpieza la creación de un objeto en un bucket zonal
  • Hasta 100 configuraciones de notificación por bucket y 10 para un mismo evento.
  • Entrega al menos una vez: puede llegar el mismo evento varias veces con distinto ID.
  • Para otros eventos, como lecturas de objetos u operaciones sobre el bucket, se activan los registros de auditoría y se enrutan a Pub/Sub.

Escenarios de examen

SituaciónRespuestaPor qué
Publicar una web en Cloud Run accesible para cualquiera--allow-unauthenticated (allUsers con run.invoker)Sin eso, solo invocan principales autorizados.
Que el servicio solo acepte tráfico de internet a través de un balanceador con Cloud ArmorIngress «Internal and Cloud Load Balancing»Bloquea las peticiones directas a run.app.
Ejecutar código cada vez que se sube un objeto a un bucketTrigger de Eventarc con google.cloud.storage.object.v1.finalizedEvento directo de Cloud Storage.
Reaccionar cuando alguien crea una VMTrigger de Eventarc con Cloud Audit LogsLos eventos de auditoría cubren operaciones de API.
Procesar mensajes de un tema existente en un servicio de Cloud RunSuscripción push con cuenta de servicio autenticadaPub/Sub entrega por HTTP al servicio.
Enrutar eventos de muchos orígenes a muchos destinos y transformarlosEventarc AdvancedBus central, filtrado y transformación con CEL.
Desplegar una función de Python desde el código fuentegcloud run deploy --source . --functionCloud Run construye la imagen.

Trampas frecuentes del examen

❓ ¿Qué rol necesita una cuenta para invocar un servicio privado de Cloud Run?

Cloud Run Invoker (roles/run.invoker).

❓ ¿Qué identidad usa un trigger de Eventarc si no indicas ninguna?

La cuenta de servicio predeterminada de Compute Engine. Google recomienda una cuenta gestionada por el usuario con permisos mínimos.

❓ ¿Eventarc garantiza el orden de los eventos?

No. La entrega es al menos una vez y sin orden FIFO garantizado.

❓ ¿Qué edición de Eventarc admite transformar eventos y entregarlos entre proyectos?

Eventarc Advanced.

❓ ¿OBJECT_FINALIZE se envía si una subida falla?

No. Solo cuando el objeto se crea correctamente.

❓ ¿Cómo detectas que alguien lee un objeto de un bucket?

Las notificaciones de Pub/Sub no cubren lecturas: activa los registros de auditoría de acceso a datos y enrútalos.

¿Entendiste este tema?

Pon a prueba lo que acabas de aprender

Cada vez que se sube una factura en PDF a un bucket, un servicio privado de Cloud Run debe procesarla. El equipo de seguridad exige que el servicio no sea público y que se use una identidad con permisos mínimos. ¿Qué configura?

¿Listo para poner a prueba "Cloud Run, Cloud Run functions y Eventarc"?

Preguntas originales, cada una con su explicación.

Empezar un simulacro