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.
Objectifs
Dans ce tutoriel, vous allez utiliser Google Cloud CLI pour créer un workflow unique, en connectant un service à la fois :
- Déployez deux services Cloud Run Functions : la première fonction génère un nombre aléatoire, puis le transmet à la deuxième fonction qui le multiplie.
- À l'aide de Workflows, connectez les deux fonctions HTTP. Exécutez le workflow afin de renvoyer un résultat qui est ensuite transmis à une API externe.
- À l'aide de Workflows, connectez une API HTTP externe qui renvoie
log
pour un nombre donné. Exécutez le workflow afin de renvoyer un résultat qui est ensuite transmis à un service Cloud Run. - Déployez un service Cloud Run qui n'autorise que les accès authentifiés. Le service renvoie le paramètre
math.floor
pour un nombre donné. - À l'aide de Workflows, connectez le service Cloud Run, exécutez l'intégralité du workflow, puis renvoyez un résultat final.
Le schéma suivant montre une vue d'ensemble du processus ainsi qu'une visualisation du workflow final :
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Avant de commencer
Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.
- Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
- 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 functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - 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 functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Mettez à jour les composants de la Google Cloud CLI :
gcloud components update
- Si vous exécutez des commandes dans Cloud Shell, vous êtes déjà authentifié auprès de la gcloud CLI. Dans le cas contraire, connectez-vous à l'aide de votre compte :
gcloud auth login
- Définissez l'emplacement par défaut utilisé dans ce tutoriel :
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
Remplacez
REGION
par l'emplacement Workflows compatible de votre choix. -
Si vous êtes le créateur du projet, vous disposez du rôle de base Propriétaire (
roles/owner
). Par défaut, ce rôle Identity and Access Management (IAM) inclut les autorisations nécessaires pour accéder à la plupart des ressources Google Cloud. Vous pouvez ignorer cette étape.Si vous n'êtes pas le créateur du projet, les autorisations requises doivent être accordées au compte principal approprié sur le projet. Par exemple, un compte principal peut être un compte Google (pour les utilisateurs finaux) ou un compte de service (pour les applications et les charges de travail de calcul). Pour en savoir plus, consultez la page Rôles et autorisations pour la destination de votre événement.
Autorisations requises
Pour obtenir les autorisations nécessaires pour suivre le tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :
-
Éditeur Cloud Build (
roles/cloudbuild.builds.editor
) -
Développeur Cloud Functions (
roles/cloudfunctions.developer
) -
Administrateur Cloud Run (
roles/run.admin
) -
Créateur de comptes de service (
roles/iam.serviceAccountCreator
) -
Administrateur de projet IAM (
roles/resourcemanager.projectIamAdmin
) -
Utilisateur du compte de service (
roles/iam.serviceAccountUser
) -
Consommateur Service Usage (
roles/serviceusage.serviceUsageConsumer
) -
Administrateur de l'espace de stockage (
roles/storage.admin
) -
Éditeur de workflows (
roles/workflows.editor
)
Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
-
Éditeur Cloud Build (
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 être compatible avec 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 :Créez un compte de service à utiliser avec Workflows :
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
Pour permettre au compte de service d'appeler des services Cloud Run authentifiés, accordez le rôle
run.invoker
au compte de service Workflows :gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Déployer la fonction avec un déclencheur HTTP et autoriser les accès non authentifiés :
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --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
randomgen
déployée, vous pouvez confirmer la propriétéhttpsTrigger.url
:gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
Enregistrez l'URL. Vous devrez l'ajouter à votre fichier source Workflows dans les exercices suivants.
Vous pouvez essayer la fonction à l'aide de la commande curl suivante :
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
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 input
du corps JSON, le multiplie par 2 et renvoie le résultat au format JSON.
Revenez à votre répertoire d'accueil :
cd ~
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 être compatible avec 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éployer la fonction avec un déclencheur HTTP et autoriser les accès non authentifiés :
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --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
multiply
déployée, vous pouvez confirmer la propriétéhttpsTrigger.url
:gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
Enregistrez l'URL. Vous devrez l'ajouter à votre fichier source Workflows dans les exercices suivants.
Vous pouvez essayer la fonction à l'aide de la commande curl suivante :
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -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: 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}
- Remplacez
RANDOMGEN_FUNCTION_URL
par l'URL de votre fonctionrandomgen
. - Remplacez
MULTIPLY_FUNCTION_URL
par l'URL de votre fonctionmultiply
.
Ce fichier source associe les deux fonctions HTTP et renvoie un résultat final.
- Remplacez
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: 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}
- Remplacez
RANDOMGEN_FUNCTION_URL
par l'URL de votre fonctionrandomgen
. - Remplacez
MULTIPLY_FUNCTION_URL
par l'URL de votre fonctionmultiply
.
Cela a pour effet d'associer le service REST externe aux services Cloud Run Functions et de renvoyer un résultat final.
- Remplacez
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 la valeur 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 du 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 \ --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: 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}
- Remplacez
RANDOMGEN_FUNCTION_URL
par l'URL de votre fonctionrandomgen
. - Remplacez
MULTIPLY_FUNCTION_URL
par l'URL de votre fonctionmultiply
. - 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.- Remplacez
Déployez le workflow modifié :
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
Exécutez le workflow final :
gcloud workflows run WORKFLOW_NAME
Le résultat 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.
Effectuer un nettoyage
Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.
Supprimer le projet
Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.
Pour supprimer le projet :
- 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.
Supprimer les ressources du tutoriel
Supprimez le service Cloud Run que vous avez déployé dans ce tutoriel.
Supprimez le workflow que vous avez créé dans ce tutoriel.
Supprimez l'image de conteneur d'Artifact Registry.
Supprimez les configurations Google Cloud CLI par défaut que vous avez ajoutées lors de la configuration du tutoriel:
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project