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

1. Introduction

Présentation

Les fonctions Cloud Run sont une nouvelle façon de déployer des charges de travail à l'aide des paradigmes d'événements et de signature de fonction familiers de GCF. Au lieu d'utiliser notre processus de compilation et nos configurations de déploiement, les fonctions Cloud Run vous permettent de contrôler directement le service sous-jacent créé sur Cloud Run.

Avec les fonctions Cloud Run, nous proposons l'expérience utilisateur simple du déploiement de source Cloud Run, ce qui permet aux développeurs de contrôler entièrement leurs charges de travail à l'aide de configurations Cloud Run.

Dans cette section, vous allez apprendre à déployer une fonction événementielle 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 nodejs 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 des API

Mettre à jour la CLI gcloud

Cet atelier de programmation nécessite une version récente de la CLI gcloud installée. Vous pouvez mettre à jour la CLI en exécutant

gcloud components update

Activer les API

Avant de pouvoir utiliser cet atelier de programmation, vous devez activer plusieurs API. Cet atelier de programmation nécessite d'utiliser les 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 des 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

Pour cet exemple, vous allez créer un compte de service avec les autorisations Eventarc requises et le rôle de demandeur Cloud Run afin de recevoir un événement de Cloud Storage et d'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"

Ensuite, attribuez le rôle Destinataire des événements Eventarc (roles/eventarc.eventReceiver) sur le projet au compte de service associé à votre déclencheur Eventarc afin qu'il puisse recevoir des événements de fournisseurs d'événements.

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

Ensuite, attribuez 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

Commencez par créer un répertoire pour le code source et accédez-y avec la commande cd.

mkdir ../$SERVICE_NAME && cd $_

Créez ensuite 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'indicateur -source permet d'indiquer à Cloud Run de créer la fonction dans un service basé sur des conteneurs exécutables.
  • L'indicateur –function (nouveau) permet de définir le point d'entrée du nouveau service sur la signature de fonction que vous souhaitez appeler.
  • (facultatif) l'option –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 où notre fonction est déployée.
  • Pour l'indicateur –event-filters, n'utilisez pas le préfixe gs:// dans le nom de votre bucket.

Pour obtenir un tutoriel détaillé sur la configuration du service de déclencheur à partir de Cloud Storage à l'aide d'Eventarc, consultez la documentation Cloud Run à l'adresse suivante: 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 celui d'un compte principal disposant 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 a été créé, nous sommes prêts à l'appeler.

Créez un fichier et importez-le dans votre bucket Cloud Storage. Pour ce faire, utilisez l'interface Web de la console Cloud ou l'outil CLI gsutil, 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 cette sortie dans les entrées de journal de la fonction dans Cloud Console. Vous pouvez également effectuer une requête pour obtenir cette sortie à l'aide de la gcloud CLI:

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

Vous devriez obtenir la sortie suivante :

"textPayload": "File: test.txt"

7. Félicitations !

Félicitations ! Vous avez terminé cet 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 les frais involontaires (par exemple, si ce service Cloud Run est appelé par inadvertance plus de fois que votre quota mensuel d'appels Cloud Run dans le niveau 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'ensemble du projet, accédez à https://console.cloud.google.com/cloud-resource-manager, sélectionnez le projet que vous avez créé à l'étape 2, puis choisissez "Supprimer". Si vous supprimez le projet, vous devrez modifier les projets dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.