Ce tutoriel explique comment utiliser Workflows pour associer une série de services. En connectant deux services HTTP publics (à l'aide de Cloud Run Functions), une API REST externe et un service Cloud Run privé, vous pouvez créer une application sans serveur flexible.
Déployer le premier service Cloud Run Functions
Après avoir reçu une requête HTTP, cette fonction HTTP génère un nombre aléatoire compris entre 1 et 100, puis renvoie le nombre au format JSON.
Créez un répertoire nommé
randomgen
et remplacez les éléments par ce qui suit :mkdir ~/randomgen cd ~/randomgen
Créez un fichier texte avec le nom de fichier
main.py
contenant le code Python suivant :Pour permettre une dépendance sur Flask pour le traitement HTTP, créez un fichier texte pour le gestionnaire de paquets pip. Attribuez-lui le nom de fichier
requirements.txt
et ajoutez les éléments suivants :Déployez la fonction avec un déclencheur HTTP et autorisez les accès non authentifiés :
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Le déploiement de la fonction peut prendre quelques minutes. Vous pouvez également utiliser l'interface Cloud Run Functions dans la console Google Cloud pour déployer la fonction.
Une fois la fonction déployée, vous pouvez confirmer la propriété
httpsTrigger.url
:gcloud functions describe randomgen
Vous pouvez essayer la fonction à l'aide de la commande curl suivante :
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
Un nombre est généré de manière aléatoire et renvoyé.
Déployer le deuxième service Cloud Run Functions
Après avoir reçu une requête HTTP, cette fonction HTTP extrait le paramètre input
du corps JSON, le multiplie par 2 et renvoie le résultat au format JSON.
Créez un répertoire nommé
multiply
et remplacez les éléments par ce qui suit :mkdir ~/multiply cd ~/multiply
Créez un fichier texte avec le nom de fichier
main.py
contenant le code Python suivant :Pour permettre une dépendance sur Flask pour le traitement HTTP, créez un fichier texte pour le gestionnaire de paquets pip. Attribuez-lui le nom de fichier
requirements.txt
et ajoutez les éléments suivants :Déployez la fonction avec un déclencheur HTTP et autorisez les accès non authentifiés :
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Le déploiement de la fonction peut prendre quelques minutes. Vous pouvez également utiliser l'interface Cloud Run Functions dans la console Google Cloud pour déployer la fonction.
Une fois la fonction déployée, vous pouvez confirmer la propriété
httpsTrigger.url
:gcloud functions describe multiply
Vous pouvez essayer la fonction à l'aide de la commande curl suivante :
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
Le nombre 10 doit être renvoyé.
Connecter les deux services Cloud Run Functions dans un workflow
Un workflow est constitué d'une série d'étapes décrites à l'aide de la syntaxe Workflows, qui peut être écrite au format YAML ou JSON. Il s'agit de la définition du workflow. Pour une explication détaillée, consultez la page de documentation de référence sur la syntaxe.
Revenez à votre répertoire d'accueil :
cd ~
Créez un fichier texte portant le nom de fichier
workflow.yaml
avec le contenu suivant :- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
Cela a pour effet d'associer les deux fonctions HTTP et de renvoyer un résultat final.
Une fois le workflow créé, vous pouvez le déployer afin qu'il soit prêt à être exécuté.
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
Remplacez
WORKFLOW_NAME
par le nom que vous souhaitez donner à votre workflow.Exécutez le workflow :
gcloud workflows run WORKFLOW_NAME
Il s'agit d'une exécution unique de la logique contenue dans la définition d'un workflow. Toutes les exécutions de workflow sont indépendantes, et le scaling rapide de Workflows permet d'effectuer un grand nombre d'exécutions simultanées.
Une fois le workflow exécuté, le résultat devrait ressembler à ceci :
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
Connecter un service REST public dans le workflow
Mettez à jour votre workflow existant et connectez une API REST publique (math.js) capable d'évaluer des expressions mathématiques. Exemple : curl https://api.mathjs.org/v4/?'expr=log(56)'
.
Notez que dans la mesure où vous avez déployé votre workflow, vous pouvez également le modifier sur la page Workflows de la console Google Cloud .
Modifiez le fichier source de votre workflow et remplacez-le par le contenu suivant :
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply 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}
Cela a pour effet d'associer le service REST externe aux services Cloud Run Functions et de renvoyer un résultat final.
Déployez le workflow modifié :
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
Déployer un service Cloud Run
Déployez un service Cloud Run qui, après avoir reçu une requête HTTP, extrait le paramètre input
du corps JSON, calcule sa valeur math.floor
et renvoie le résultat.
Créez un répertoire nommé
floor
et remplacez les éléments par ce qui suit :mkdir ~/floor cd ~/floor
Créez un fichier texte avec le nom de fichier
app.py
contenant le code Python suivant :Dans le même répertoire, créez un
Dockerfile
avec le contenu suivant :Créez un dépôt standard Artifact Registry dans lequel vous pouvez stocker votre image de conteneur Docker :
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
Remplacez
REPOSITORY
par un nom unique pour le dépôt.Créez l'image de conteneur :
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
Déployez l'image de conteneur dans Cloud Run, en veillant à ce qu'elle n'accepte que les appels authentifiés :
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --platform managed \ --no-allow-unauthenticated
Lorsque l'URL du service s'affiche, cela signifie que le déploiement est terminé. Vous devrez spécifier cette URL lors de la mise à jour de la définition du workflow.
Connecter le service Cloud Run dans le workflow
Mettez à jour votre workflow existant et spécifiez l'URL du service Cloud Run.
Modifiez le fichier source de votre workflow et remplacez-le par le contenu suivant :
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply 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}
Remplacez
CLOUD_RUN_SERVICE_URL
par l'URL de votre service Cloud Run.Cela permet de connecter le service Cloud Run dans le workflow. Notez que la clé
auth
garantit qu'un jeton d'authentification est transmis dans l'appel au service Cloud Run. Pour plus d'informations, consultez la page Effectuer des requêtes authentifiées à partir d'un workflow.Déployez le workflow modifié :
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
Exécutez le workflow final :
gcloud workflows run WORKFLOW_NAME
La sortie doit ressembler à ceci :
result: '{"Floor":{"body":"4","code":200 ... "Log":{"body":"4.02535169073515","code":200 ... "Multiply":{"body":{"multiplied":56},"code":200 ... "Random":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
Félicitations ! Vous avez déployé et exécuté un workflow qui connecte une série de services.
Consultez la documentation de référence sur la syntaxe de Workflows et la page Présentation de la bibliothèque standard pour créer des workflows plus complexes à l'aide d'expressions, de sauts conditionnels, de l'encodage ou du décodage en Base64, de sous-workflows, etc.