Premiers pas avec les fonctions Cloud Run basées sur des événements

1. Introduction

Présentation

Les fonctions Cloud Run constituent une nouvelle façon de déployer des charges de travail à l'aide des paradigmes d'événements GCF connus et de la signature des fonctions. Au lieu d'utiliser nos configurations de déploiement et de compilation avisées, Cloud Run vous donne un contrôle direct sur le service sous-jacent créé dans Cloud Run.

Avec les fonctions Cloud Run, nous fournissons l'expérience utilisateur simple du déploiement source Cloud Run, ce qui donne aux développeurs un contrôle total sur leurs charges de travail à l'aide de configurations Cloud Run.

Dans cette section, vous allez apprendre à déployer une fonction basée sur des événements dans Node. Vous allez déployer une fonction qui se déclenche chaque fois qu'un objet est finalisé dans un bucket Google Cloud Storage.

Cet atelier de programmation utilise des exemples Node.js dans les exemples ci-dessous. Toutefois, vous pouvez utiliser les exemples de code Cloud Functions 2e génération dans le langage de votre choix:

Points abordés

  • Déployer une fonction Cloud Run basée sur des événements qui se déclenche chaque fois qu'un objet est importé dans un bucket GCS
  • Créer un compte de service avec les rôles appropriés pour recevoir un événement de Cloud Storage et appeler la fonction Cloud Run

2. Configurer des variables d'environnement et activer les API

Mettre à jour la gcloud CLI

Cet atelier de programmation nécessite l'installation d'une version récente de gcloud CLI. Vous pouvez mettre à jour la CLI en exécutant

gcloud components update

Activer les API

Avant de commencer à utiliser cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite l'utilisation des API suivantes. Vous pouvez activer ces API en exécutant la commande suivante:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Configurer des variables d'environnement

Vous pouvez définir les variables d'environnement qui seront utilisées tout au long de cet atelier de programmation.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Créer un bucket Storage et un compte de service

Créer un bucket de stockage

Vous pouvez créer un bucket Cloud Storage en exécutant la commande suivante:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Créer un compte de service

Dans cet exemple, vous allez créer un compte de service avec les autorisations EventArc requises et le rôle de demandeur Cloud Run pour recevoir un événement de Cloud Storage et appeler la fonction Cloud Run.

Commencez par créer le compte de service.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Attribuez ensuite le rôle "Récepteur d'événements Eventarc" (roles/eventarc.eventReceiver) au compte de service associé à votre déclencheur Eventarc sur le projet afin qu'il puisse recevoir des événements des fournisseurs d'événements.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Attribuez ensuite au compte de service le rôle de demandeur Cloud Run afin qu'il puisse appeler la fonction.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. Créer et déployer la fonction

Tout d'abord, créez un répertoire pour le code source et utilisez la commande cd pour y accéder.

mkdir ../$SERVICE_NAME && cd $_

Ensuite, créez un fichier package.json avec le contenu suivant:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Ensuite, créez un fichier index.js avec le contenu suivant:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Vous pouvez maintenant déployer la fonction Cloud Run en exécutant la commande suivante:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

Remarques :

  • L'option "-source" permet d'indiquer à Cloud Run de créer la fonction dans un service exécutable basé sur des conteneurs.
  • L'option –function (new) est utilisée pour définir le point d'entrée du nouveau service comme signature de la fonction que vous souhaitez appeler
  • (facultatif) l'attribut –no-allow-unauthenticated pour empêcher l'appel public de votre fonction

Vous pouvez afficher votre nouveau service crf-nodejs-event en exécutant la commande suivante:

gcloud beta run services describe $SERVICE_NAME

5. Créer l'événement

Nous pouvons créer un déclencheur Eventarc pour envoyer des messages à notre fonction chaque fois qu'un objet est finalisé dans Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Remarques :

  • gcs-function-trigger est le nom du déclencheur
  • crf-nodejs-event est le nom du service Cloud Run sur lequel notre fonction est déployée
  • Pour l'option –event-filters, n'utilisez pas le préfixe gs:// dans le nom de votre bucket.

Vous trouverez un tutoriel détaillé sur la configuration du service de déclencheur depuis Cloud Storage à l'aide d'Eventarc dans la documentation Cloud Run: https://cloud.google.com/run/docs/tutorials/eventarc

6. Tester la fonction

Une fois le déploiement terminé, l'URL du service s'affiche. Pour appeler la fonction, vous devez envoyer une requête authentifiée avec votre jeton d'identité ou le jeton d'identité d'un principe doté du rôle Demandeur Cloud Run, comme indiqué ci-dessous:

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Maintenant que notre fonction est déployée et qu'un déclencheur est créé, nous pouvons l'appeler.

Créez un fichier et importez-le dans votre bucket Cloud Storage. Pour ce faire, vous pouvez utiliser l'interface Web de la console Cloud ou l'outil gsutil CLI, par exemple

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

Une fois le fichier importé, un événement est généré et votre fonction imprime des informations de base sur l'objet, par exemple le nom du fichier. Vous trouverez ce résultat dans les entrées de journal de la fonction dans la console Cloud. Vous pouvez également interroger ce résultat à l'aide de la gcloud CLI:

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

Le résultat suivant doit s'afficher :

"textPayload": "File: test.txt"

7. Félicitations !

Félicitations, vous avez terminé l'atelier de programmation.

Nous vous recommandons de consulter la documentation sur les fonctions Cloud Run.

Points abordés

  • Déployer une fonction Cloud Run basée sur des événements qui se déclenche chaque fois qu'un objet est importé dans un bucket GCS
  • Créer un compte de service avec les rôles appropriés pour recevoir un événement de Cloud Storage et appeler la fonction Cloud Run

8. Effectuer un nettoyage

Pour éviter des frais accidentels (par exemple, si ce service Cloud Run est appelé par inadvertance plus de fois que l'allocation mensuelle des appels Cloud Run dans la version sans frais), vous pouvez supprimer le service Cloud Run ou le projet que vous avez créé à l'étape 2.

Pour supprimer les services Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run/ et supprimez le service crf-event-codelab que vous avez créé dans cet atelier de programmation.

Si vous choisissez de supprimer l'intégralité du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis cliquer sur "Supprimer". Si vous supprimez le projet, vous devrez le modifier dans Cloud SDK. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.