En este instructivo, se muestra cómo usar Workflows para vincular una serie de servicios. Si conectas dos servicios de HTTP públicos con Cloud Run Functions, una API de REST externa y un servicio privado de Cloud Run, puedes crear una aplicación flexible y sin servidores.
Implementa la primera Cloud Run Function
Después de recibir una solicitud HTTP, esta función de HTTP genera un número aleatorio entre 1 y 100 y, luego, lo muestra en formato JSON.
Crea un directorio llamado
randomgen
y cámbialo como se indica a continuación:mkdir ~/randomgen cd ~/randomgen
Crea un archivo de texto con el nombre de archivo
main.py
que contenga el siguiente código de Python:A fin de admitir una dependencia en Flask para el procesamiento de HTTP, crea un archivo de texto destinado al administrador de paquetes pip. Asígnale el nombre
requirements.txt
y agrega lo siguiente:Implementa la función con un activador de HTTP y permite el acceso no autenticado:
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated
La función puede tardar unos minutos en implementarse. También puedes usar la interfaz de Cloud Run Functions en la consola de Google Cloud para implementar la función.
Una vez que se implementa la función
randomgen
, puedes confirmar la propiedadhttpsTrigger.url
:gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
Guarda la URL. Deberás agregarlo a tu archivo fuente de flujo de trabajo en ejercicios posteriores.
Puedes probar la función con el siguiente comando curl:
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
Se genera y se muestra un número de forma aleatoria.
Implementa la segunda Cloud Run Function
Después de recibir una solicitud HTTP, esta función de HTTP extrae el input
del cuerpo JSON, lo multiplica por 2 y muestra el resultado en formato JSON.
Regresa al directorio principal:
cd ~
Crea un directorio llamado
multiply
y cámbialo como se indica a continuación:mkdir ~/multiply cd ~/multiply
Crea un archivo de texto con el nombre de archivo
main.py
que contenga el siguiente código de Python:A fin de admitir una dependencia en Flask para el procesamiento de HTTP, crea un archivo de texto destinado al administrador de paquetes pip. Asígnale el nombre
requirements.txt
y agrega lo siguiente:Implementa la función con un activador de HTTP y permite el acceso no autenticado:
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --trigger-http \ --allow-unauthenticated
La función puede tardar unos minutos en implementarse. También puedes usar la interfaz de Cloud Run Functions en la consola de Google Cloud para implementar la función.
Una vez que se implementa la función
multiply
, puedes confirmar la propiedadhttpsTrigger.url
:gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
Guarda la URL. Deberás agregarlo a tu archivo fuente de flujo de trabajo en ejercicios posteriores.
Puedes probar la función con el siguiente comando curl:
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}'
Se debería mostrar el número 10.
Conecta las dos funciones de Cloud Run en un flujo de trabajo
Un flujo de trabajo está compuesto por una serie de pasos descritos con la sintaxis de Workflows, que se pueden escribir en formato YAML o JSON. Esta es la definición del flujo de trabajo. Para obtener una explicación detallada, consulta la página Referencia de sintaxis.
Regresa al directorio principal:
cd ~
Crea un archivo de texto con el nombre de archivo
workflow.yaml
que incluya el siguiente contenido:- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
- Reemplaza
RANDOMGEN_FUNCTION_URL
por la URL de tu funciónrandomgen
. - Reemplaza
MULTIPLY_FUNCTION_URL
por la URL de tu funciónmultiply
.
Este archivo fuente vincula las dos funciones de HTTP y muestra un resultado final.
- Reemplaza
Después de crear el flujo de trabajo, puedes implementarlo, con lo que estará listo para ejecutarse.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.
Reemplaza
WORKFLOW_NAME
por un nombre para tu VPC.Ejecuta el flujo de trabajo:
gcloud workflows run WORKFLOW_NAME
Una ejecución es una ejecución única de la lógica que se incluye en la definición de un flujo de trabajo. Todas las ejecuciones de flujos de trabajo son independientes, y el escalamiento rápido Workflows permite una gran cantidad de ejecuciones simultáneas.
Una vez que se ejecuta el flujo de trabajo, el resultado debería ser similar al siguiente:
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
Conecta un servicio público de REST en el flujo de trabajo
Actualiza tu flujo de trabajo existente y conecta una API de REST pública (math.js) que pueda evaluar las expresiones matemáticas. Por ejemplo, curl https://api.mathjs.org/v4/?'expr=log(56)'
Ten en cuenta que, como implementaste tu flujo de trabajo, también puedes editarlo en la página Flujos de trabajo en la consola de Google Cloud .
Edita el archivo fuente de tu flujo de trabajo y reemplázalo por el siguiente contenido:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}
- Reemplaza
RANDOMGEN_FUNCTION_URL
por la URL de tu funciónrandomgen
. - Reemplaza
MULTIPLY_FUNCTION_URL
por la URL de tu funciónmultiply
.
Esto vincula el servicio de REST externo a las funciones de Cloud Run y muestra un resultado final.
- Reemplaza
Implementa el flujo de trabajo modificado:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.
Implementa un servicio de Cloud Run
Implementa un servicio de Cloud Run que, luego de recibir una solicitud HTTP, extrae input
del cuerpo JSON, calcula su math.floor
y muestra el resultado.
Crea un directorio llamado
floor
y cámbialo como se indica a continuación:mkdir ~/floor cd ~/floor
Crea un archivo de texto con el nombre de archivo
app.py
que contenga el siguiente código de Python:En el mismo directorio, crea un
Dockerfile
con el siguiente contenido:Crea un repositorio estándar de Artifact Registry en el que puedas almacenar la imagen de contenedor de Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
Reemplaza
REPOSITORY
por un nombre único para el repositorio.Compila la imagen del contenedor:
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
Implementa la imagen de contenedor en Cloud Run y asegúrate de que solo acepte llamadas autenticadas:
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --no-allow-unauthenticated
Cuando veas la URL del servicio, se completará la implementación. Deberás especificar esa URL cuando actualices la definición del flujo de trabajo.
Conecta el servicio de Cloud Run en el flujo de trabajo
Actualiza tu flujo de trabajo existente y especifica la URL para el servicio de Cloud Run.
Regresa al directorio principal:
cd ~
Edita el archivo fuente de tu flujo de trabajo y reemplázalo por el siguiente contenido:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}
- Reemplaza
RANDOMGEN_FUNCTION_URL
por la URL de tu funciónrandomgen
. - Reemplaza
MULTIPLY_FUNCTION_URL
por la URL de tu funciónmultiply
. - Reemplaza
CLOUD_RUN_SERVICE_URL
por la URL de servicio de Cloud Run.
Esto conecta el servicio de Cloud Run en el flujo de trabajo. Ten en cuenta que la clave
auth
garantiza que se transmita un token de autenticación en la llamada al servicio de Cloud Run. Para obtener más información, consulta Realiza solicitudes autenticadas desde un flujo de trabajo.- Reemplaza
Implementa el flujo de trabajo modificado:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.
Ejecuta el flujo de trabajo final:
gcloud workflows run WORKFLOW_NAME
El resultado debe parecerse al siguiente:
result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
¡Felicitaciones! Implementaste y ejecutaste un flujo de trabajo que conecta una serie de servicios.
Para crear flujos de trabajo más complejos con expresiones, saltos condicionales, codificación y decodificación de Base64, subflujos de trabajo y más, consulta la página sobre la referencia de sintaxis de flujos de trabajo y la descripción general de la biblioteca estándar.