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 aemail-service.sms-service-sub→ push autenticado asms-service.
- IAM service account:
pubsub-cloud-run-invoker. - IAM bindings:
roles/run.invokersobreemail-serviceparapubsub-cloud-run-invoker.roles/run.invokersobresms-serviceparapubsub-cloud-run-invoker.roles/iam.serviceAccountTokenCreatorpara 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