Link al lab

Recursos identificados

  • APIs: run.googleapis.com, pubsub.googleapis.com, iam.googleapis.com.
  • Cloud Run services:
    • lab-report-service (público) — productor, recibe reportes y los publica en Pub/Sub.
    • email-service (privado) — consumidor, envía notificaciones por email.
    • sms-service (privado) — consumidor, envía notificaciones por SMS.
  • Pub/Sub topic: new-lab-report.
  • Pub/Sub subscriptions push:
    • email-service-sub → push autenticado a email-service.
    • sms-service-sub → push autenticado a sms-service.
  • IAM service account: pubsub-cloud-run-invoker.
  • IAM bindings:
    • roles/run.invoker sobre email-service para pubsub-cloud-run-invoker.
    • roles/run.invoker sobre sms-service para pubsub-cloud-run-invoker.
    • roles/iam.serviceAccountTokenCreator para el service agent de Pub/Sub del proyecto.
  • Código fuente: repositorio rosera/pet-theory.

Comandos ejecutados

Verificar la cuenta activa

gcloud auth list

Verificar el proyecto activo

gcloud config list project

Habilitar la API de Cloud Run

gcloud services enable run.googleapis.com

Clonar repositorio pet-theory

git clone https://github.com/rosera/pet-theory

Crear topic de Pub/Sub

gcloud pubsub topics create new-lab-report

Desplegar lab-report-service (productor público)

Se construye la imagen localmente y se despliega como servicio público.

gcloud run deploy lab-report-service \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated \
  --max-instances=1

Desplegar email-service (consumidor privado)

gcloud run deploy email-service \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \
  --platform managed \
  --region us-central1 \
  --no-allow-unauthenticated \
  --max-instances=1

Desplegar sms-service (consumidor privado)

gcloud run deploy sms-service \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \
  --platform managed \
  --region us-central1 \
  --no-allow-unauthenticated \
  --max-instances=1

Crear service account invocadora

gcloud iam service-accounts create pubsub-cloud-run-invoker \
  --display-name "PubSub Cloud Run Invoker"

Asignar rol run.invoker sobre email-service

gcloud run services add-iam-policy-binding email-service \
  --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
  --role=roles/run.invoker \
  --region us-central1 \
  --platform managed

Asignar rol run.invoker sobre sms-service

gcloud run services add-iam-policy-binding sms-service \
  --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
  --role=roles/run.invoker \
  --region us-central1 \
  --platform managed

Obtener número de proyecto

PROJECT_NUMBER=$(gcloud projects list \
  --filter="qwiklabs-gcp" \
  --format='value(PROJECT_NUMBER)')

Permitir creación de tokens para el service agent de Pub/Sub

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
  --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator

Obtener URL de email-service

EMAIL_SERVICE_URL=$(gcloud run services describe email-service \
  --platform managed \
  --region us-central1 \
  --format="value(status.address.url)")

Crear suscripción push hacia email-service

gcloud pubsub subscriptions create email-service-sub \
  --topic new-lab-report \
  --push-endpoint=$EMAIL_SERVICE_URL \
  --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

Obtener URL de sms-service

SMS_SERVICE_URL=$(gcloud run services describe sms-service \
  --platform managed \
  --region us-central1 \
  --format="value(status.address.url)")

Crear suscripción push hacia sms-service

gcloud pubsub subscriptions create sms-service-sub \
  --topic new-lab-report \
  --push-endpoint=$SMS_SERVICE_URL \
  --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

Obtener URL de lab-report-service

LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service \
  --platform managed \
  --region us-central1 \
  --format="value(status.address.url)")

Probar el flujo completo enviando un reporte

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"id": 12, "status": "pending"}' \
  $LAB_REPORT_SERVICE_URL/v1/report