Puedes usar Workflows para ejecutar un trabajo de Cloud Run como parte de un flujo de trabajo que realice un procesamiento de datos más complejo o que organice un sistema de trabajos existentes.
En este instructivo, se muestra cómo usar Workflows para ejecutar un trabajo de Cloud Run que procesa datos de eventos almacenados en un bucket de Cloud Storage. Almacenar la carga útil del evento en un bucket de Cloud Storage te permite encriptar los datos con claves de encriptación administradas por el cliente, lo que no es posible si pasas los datos del evento como variables de entorno a la tarea de Cloud Run.
En el siguiente diagrama, se proporciona una descripción general de alto nivel:
Objetivos
En este instructivo, realizarás las siguientes acciones:
- Crea un trabajo de Cloud Run que procese los datos de eventos almacenados en un bucket de Cloud Storage.
- Implementa un flujo de trabajo que haga lo siguiente:
- Recibe un evento como argumento.
- Escribe los datos de la carga útil del evento en el bucket de Cloud Storage.
- Usa el conector de la API de Cloud Run Admin para ejecutar la tarea de Cloud Run.
- Crea un tema de Pub/Sub para poder publicar un mensaje en él. En este instructivo, se usa un evento de Pub/Sub como ejemplo de cómo enrutar eventos con Workflows y guardarlos en Cloud Storage para que un trabajo de Cloud Run pueda procesar los datos del evento.
- Crea un activador de Eventarc que ejecute el flujo de trabajo cuando se escriba un mensaje en el tema de Pub/Sub.
- Para activar el flujo de trabajo, escribe un mensaje en el tema de Pub/Sub.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.
Antes de comenzar este instructivo, debes habilitar APIs específicas y crear una cuenta de servicio administrada por el usuario. Debes otorgarle a la cuenta de servicio los roles y permisos necesarios para que puedas enrutar eventos con un activador de Eventarc y ejecutar un flujo de trabajo.
Ten en cuenta que, si usas Cloud Shell para probar este instructivo, es posible que debas otorgar roles adicionales a la cuenta de servicio predeterminada de Compute Engine. Para obtener más información, consulta la sección Crea un trabajo de Cloud Run en este documento.
Console
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart
. - Click Create and continue.
-
Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
To grant a role, find the Select a role list, then select the role.
To grant additional roles, click
Add another role and add each additional role. - Click Continue.
-
Click Done to finish creating the service account.
-
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart
. - Click Create and continue.
-
Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
To grant a role, find the Select a role list, then select the role.
To grant additional roles, click
Add another role and add each additional role. - Click Continue.
-
Click Done to finish creating the service account.
-
- Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril de 2021 o antes de esa fecha,
para admitir las solicitudes de envío de Pub/Sub autenticadas, otorga
el rol de creador de tokens de cuenta de servicio (
roles/iam.serviceAccountTokenCreator
) al agente de servicio. De lo contrario, este rol se otorga de forma predeterminada:- En la consola de Google Cloud, ve a la página IAM.
- Selecciona la casilla de verificación Incluir asignaciones de roles proporcionadas por Google.
- En la columna Nombre, busca la Cuenta de servicio de Cloud Pub/Sub y, luego, haz clic en Editar principal en la fila correspondiente.
- Haz clic en Agregar rol o Agregar otro rol.
- En la lista Seleccionar un rol, filtra por Creador de tokens de cuenta de servicio y, luego, selecciona el rol.
- Haz clic en Guardar.
- En la consola de Google Cloud, ve a la página IAM.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Cloud Shell admite los pasos de la línea de comandos de este instructivo.
gcloud
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
roles/eventarc.eventReceiver, roles/logging.logWriter, roles/run.admin, roles/storage.objectCreator, roles/workflows.invoker
:gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
roles/eventarc.eventReceiver, roles/logging.logWriter, roles/run.admin, roles/storage.objectCreator, roles/workflows.invoker
:gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril de 2021 o antes de esa fecha,
para admitir las solicitudes de envío de Pub/Sub autenticadas, otorga
el rol de creador
de tokens de cuenta de servicio (
roles/iam.serviceAccountTokenCreator
) al agente de servicio. De lo contrario, este rol se otorga de forma predeterminada:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
Reemplaza PROJECT_NUMBER
por el número de proyecto de Google Cloud. Para encontrar el número del proyecto, ve a la página de bienvenida de la consola de Google Cloud o ejecuta el siguiente comando:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Crea un trabajo de Cloud Run
En este instructivo, se usa código de muestra que puedes encontrar en GitHub. La secuencia de comandos de implementación compila una imagen de contenedor para crear un trabajo de Cloud Run. La secuencia de comandos también crea un bucket de Cloud Storage. La tarea de Cloud Run lee los datos de eventos almacenados en el bucket de Cloud Storage y, luego, los imprime.
Si ejecutas la secuencia de comandos de implementación en Cloud Shell y la cuenta de servicio predeterminada de Compute Engine no tiene el rol de editor, otorga los siguientes roles en el proyecto a la cuenta de servicio predeterminada de Compute Engine. (De lo contrario, puedes omitir este paso y continuar con la clonación del repositorio de la app de ejemplo en el siguiente paso).
Otorga el rol de escritor de Artifact Registry (
roles/artifactregistry.writer
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.writer
Reemplaza
PROJECT_NUMBER
por el número de proyecto de Google Cloud. Para encontrar el número del proyecto, ve a la página de bienvenida de la consola de Google Cloud o ejecuta el siguiente comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Otorga el rol de usuario de objetos de almacenamiento (
roles/storage.objectUser
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/storage.objectUser
Otorga el rol de escritor de registros de Logging (
roles/logging.logWriter
):gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
Clona el repositorio de la app de muestra en tu máquina local para obtener el código de muestra:
git clone https://github.com/GoogleCloudPlatform/workflows-demos.git
Como alternativa, puedes descargar la muestra como un archivo ZIP.
Dirígete al directorio que contiene el código de muestra:
cd workflows-demos/cloud-run-jobs-payload-gcs/message-payload-job
Ejecuta la secuencia de comandos de implementación para crear el trabajo de Cloud Run:
./deploy-job.sh
La secuencia de comandos crea un bucket de Cloud Storage con el nombre message-payload-PROJECT_ID
, en el que PROJECT_ID
es el ID de tu proyecto de Google Cloud.
También se crea un trabajo de Cloud Run llamado message-payload-job
.
Implementa un flujo de trabajo que ejecute el trabajo de Cloud Run
Define e implementa un flujo de trabajo que ejecute el trabajo de Cloud Run que acabas de crear. La definición de un flujo de trabajo está compuesta por una serie de pasos descritos con la sintaxis de Workflows.
El flujo de trabajo recibe un evento, guarda sus datos en un bucket de Cloud Storage y, luego, ejecuta un trabajo de Cloud Run para procesarlos.
Console
En la consola de Google Cloud, ve a la página Flujos de trabajo:
Haz clic en
Crear.Ingresa un nombre para el flujo de trabajo nuevo, como
message-payload-workflow
.Elige una región adecuada, por ejemplo,
us-central1
.En el campo Cuenta de servicio, selecciona la cuenta de servicio que creaste antes.
La cuenta de servicio funciona como la identidad del flujo de trabajo. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:
- Administrador de Cloud Run: Para ejecutar trabajos de Cloud Run
- Escritor de registros: Para escribir entradas de registro
- Creador de objetos de almacenamiento: Para crear objetos en Cloud Storage
Haz clic en Siguiente.
En el editor de flujos de trabajo, ingresa la siguiente definición para tu flujo de trabajo:
Haz clic en Implementar.
gcloud
Crea un archivo de código fuente para tu flujo de trabajo:
touch message-payload-workflow.yaml
Copia la siguiente definición de flujo de trabajo en
message-payload-workflow.yaml
:Para implementar el flujo de trabajo, ingresa el siguiente comando:
gcloud workflows deploy message-payload-workflow \ --location=us-central1 \ --source=message-payload-workflow.yaml \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Reemplaza lo siguiente:
SERVICE_ACCOUNT_NAME
: Es el nombre de la cuenta de servicio que creaste antes.PROJECT_ID
: El ID de tu proyecto de Google Cloud
La cuenta de servicio funciona como la identidad del flujo de trabajo. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:
roles/logging.logWriter
: Para escribir entradas de registroroles/run.admin
: Para ejecutar trabajos de Cloud Runroles/storage.objectCreator
: Para crear objetos en Cloud Storage
El flujo de trabajo hace lo siguiente:
Paso
init
: Acepta un evento como argumento y establece las variables necesarias.Paso
log_event
: Crea una entrada de registro en Cloud Logging con la función sys.log.Paso
write_payload_to_gcs
: Realiza una solicitud HTTPPOST
y escribe los datos de la carga útil del evento en un archivo de bucket de Cloud Storage.Paso
run_job_to_process_payload
: Usa el método del conector de la API de Cloud Run Admin,googleapis.run.v1.namespaces.jobs.run
, para ejecutar la tarea. El bucket de Cloud Storage y el nombre del archivo de datos se pasan como variables de anulación del flujo de trabajo al trabajo.Paso
finish
: Muestra información sobre la ejecución del trabajo como resultado del flujo de trabajo.
Crea un tema de Pub/Sub
Crea un tema de Pub/Sub para poder publicar un mensaje en él. Se usa un evento de Pub/Sub para demostrar cómo enrutar un evento con Workflows y guardarlo en Cloud Storage para que un trabajo de Cloud Run pueda procesar los datos del evento.
Console
En la consola de Google Cloud, ve a la página Temas.
Haz clic en
Crear tema.En el campo ID de tema, ingresa un ID para el tema, como
message-payload-topic
.Mantén la opción Agregar una suscripción predeterminada.
No selecciones las otras opciones.
Haz clic en Crear.
gcloud
Para crear un tema con el ID message-payload-topic
, ejecuta el comando gcloud pubsub topics create
:
gcloud pubsub topics create message-payload-topic
Crea un activador de Eventarc para enrutar eventos al flujo de trabajo
Para ejecutar automáticamente el flujo de trabajo y, a su vez, el trabajo de Cloud Run, crea un activador de Eventarc que responda a los eventos de Pub/Sub y que dirija los eventos al flujo de trabajo. Cada vez que se escribe un mensaje en el tema de Pub/Sub, el evento activa una ejecución del flujo de trabajo.
Console
En la consola de Google Cloud, ve a la página Flujos de trabajo:
Haz clic en el nombre de tu flujo de trabajo, como
message-payload-workflow
.En la página Detalles del flujo de trabajo, haz clic en
Editar.En la página Editar flujo de trabajo, en la sección Activadores, haz clic en Agregar activador nuevo > Eventarc.
Se abrirá el panel Evento de Eventarc.
En el campo Nombre del activador, ingresa un nombre para el activador, como
message-payload-trigger
.En la lista Proveedor de eventos, selecciona Cloud Pub/Sub.
En la lista Evento, selecciona google.cloud.pubsub.topic.v1.messagePublished.
En la lista Selecciona un tema de Cloud Pub/Sub, selecciona el tema de Pub/Sub que creaste antes.
En el campo Cuenta de servicio, selecciona la cuenta de servicio que creaste antes.
La cuenta de servicio funciona como la identidad del activador. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:
- Receptor de eventos de Eventarc: Para recibir eventos
- Invocador de flujos de trabajo: Para ejecutar flujos de trabajo
Haz clic en Guardar activador.
El activador de Eventarc ahora aparece en la sección Activadores de la página Editar flujo de trabajo.
Haz clic en Siguiente.
Haz clic en Implementar.
gcloud
Ejecuta el siguiente comando para crear un activador de Eventarc:
gcloud eventarc triggers create message-payload-trigger \ --location=us-central1 \ --destination-workflow=message-payload-workflow \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_ID/topics/message-payload-topic \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Reemplaza lo siguiente:
PROJECT_ID
El ID de tu proyecto de Google Cloud.SERVICE_ACCOUNT_NAME
: Es el nombre de la cuenta de servicio que creaste antes.
La cuenta de servicio funciona como la identidad del activador. Ya deberías haber otorgado los siguientes roles a la cuenta de servicio:
roles/eventarc.eventReceiver
: Para recibir eventosroles/workflows.invoker
: Para ejecutar flujos de trabajo
Activa el flujo de trabajo
Para probar el sistema de extremo a extremo, publica un mensaje en el tema de Pub/Sub y genera un evento. Para obtener más información, consulta cómo activar un flujo de trabajo con eventos o mensajes de Pub/Sub.
Publica un mensaje en el tema de Pub/Sub para generar un evento:
gcloud pubsub topics publish message-payload-topic --message="Hello World"
El evento se enruta al flujo de trabajo que registra el mensaje del evento, guarda los datos del evento en el bucket de Cloud Storage y ejecuta el trabajo de Cloud Run para procesar los datos guardados en Cloud Storage. Este proceso puede tardar un minuto.
Para confirmar que el trabajo de Cloud Run se ejecutó como se esperaba, consulta las ejecuciones del trabajo:
gcloud run jobs executions list --job=message-payload-job
Deberías ver una nueva ejecución de trabajo en el resultado.
Para ver las entradas de registro relacionadas con eventos que se crearon cuando se activó el flujo de trabajo, ejecuta el siguiente comando:
gcloud logging read "resource.type=cloud_run_job AND textPayload:Payload"
Busca una entrada de registro similar a lo siguiente:
textPayload: "Payload: {'message': {'data': 'SGVsbG8gV29ybGQ=', 'messageId': '8834108235224238',\ \ 'publishTime': '2023-09-20T17:07:52.921Z'}, 'subscription': 'projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741'}" ... resource: labels: job_name: message-payload-job location: us-central1 project_id: MY_PROJECT type: cloud_run_job textPayload: Processing message payload gs://message-payload-MY_PROJECT/8254002311197919.data.json
Para confirmar que los resultados sean los esperados, puedes ver los datos del evento en el objeto del bucket de Cloud Storage.
Recupera el nombre de tu bucket:
gcloud storage ls
El resultado es similar a este:
gs://message-payload-PROJECT_ID/
Enumera los objetos de tu bucket:
gcloud storage ls gs://message-payload-PROJECT_ID/** --recursive
El resultado debería ser similar al siguiente ejemplo:
gs://message-payload-PROJECT_ID/OBJECT_ID.data.json
Toma nota de
OBJECT_ID
para usar en el siguiente paso.Descarga el objeto de tu bucket como un archivo:
gcloud storage cp gs://message-payload-PROJECT_ID/OBJECT_ID.data.json message-event.txt
Reemplaza
OBJECT_ID
por el ID que se mostró en el paso anterior.En un editor de texto, abre el archivo
message-event.txt
. El cuerpo del evento escrito en el archivo debería ser similar al siguiente:{ "message": { "data": "SGVsbG8gV29ybGQ=", "messageId": "8254002311197919", "publishTime": "2023-09-20T16:54:29.312Z" }, "subscription": "projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741" }
Ten en cuenta que, si decodificas el valor de datos de
SGVsbG8gV29ybGQ=
desde el formato Base64, se muestra "Hello World".
Realiza una limpieza
Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
Para borrar el proyecto, haz lo siguiente:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina recursos de instructivos
Borra los recursos que creaste en este instructivo: