Tema 5 de 11
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.
Contenido
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
--container; solo uno recibe el tráfico de entrada.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.
El acceso IAM decide quién; el ingress decide desde qué red se aceptan las peticiones.
| Ajuste | Qué permite |
|---|---|
| All | El menos restrictivo: todo, incluidas las peticiones directas desde internet a la URL run.app |
| Internal | El 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 Balancing | Lo 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 |
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.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.
| Standard | Advanced | |
|---|---|---|
| Para qué | Entregar eventos de un proveedor a un destino con triggers | Bus central donde se publican eventos y los servicios se suscriben con enrollments |
| Enrutado | Proveedor a destino | Muchos proveedores a muchos destinos |
| Filtrado | Por tipo de evento y atributos concretos | Por cualquier atributo |
| Transformación | No | Sí, con expresiones CEL, y conversión de esquema |
| Entre proyectos | No | Sí |
| Cola de mensajes fallidos | Sí, con el tema de dead letter de Pub/Sub | No |
| Tamaño máximo del evento | 512 KB | 1 MB |
| Límites | 500 triggers por proyecto y región | Un 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.
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 evento | Cuándo |
|---|---|
google.cloud.storage.object.v1.finalized | Evento directo: se crea un objeto en un bucket |
google.cloud.pubsub.topic.v1.messagePublished | Se publica un mensaje en un tema (existente o creado por Eventarc) |
google.cloud.audit.log.v1.written | Se escribe una entrada de auditoría que cumple el filtro, p. ej. crear una VM |
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.
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).
| Evento | Cuándo se envía |
|---|---|
OBJECT_FINALIZE | Se crea un objeto o una nueva generación (incluye copiar, reescribir o restaurar). Una subida fallida no lo dispara |
OBJECT_METADATA_UPDATE | Cambian los metadatos de un objeto existente |
OBJECT_DELETE | Se borra un objeto de forma permanente (incluido por el ciclo de vida) |
OBJECT_ARCHIVE | Solo con versionado: la versión activa pasa a no actual |
OBJECT_INITIALIZE | Empieza la creación de un objeto en un bucket zonal |
| Situación | Respuesta | Por 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 Armor | Ingress «Internal and Cloud Load Balancing» | Bloquea las peticiones directas a run.app. |
| Ejecutar código cada vez que se sube un objeto a un bucket | Trigger de Eventarc con google.cloud.storage.object.v1.finalized | Evento directo de Cloud Storage. |
| Reaccionar cuando alguien crea una VM | Trigger de Eventarc con Cloud Audit Logs | Los eventos de auditoría cubren operaciones de API. |
| Procesar mensajes de un tema existente en un servicio de Cloud Run | Suscripción push con cuenta de servicio autenticada | Pub/Sub entrega por HTTP al servicio. |
| Enrutar eventos de muchos orígenes a muchos destinos y transformarlos | Eventarc Advanced | Bus central, filtrado y transformación con CEL. |
| Desplegar una función de Python desde el código fuente | gcloud run deploy --source . --function | Cloud Run construye la imagen. |
❓ ¿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?
Preguntas originales, cada una con su explicación.
Empezar un simulacro