Utiliser les fonctions Cloud Run et Gemini pour résumer un fichier texte importé dans un bucket Cloud Storage

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 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.

Dans cette section, vous allez apprendre à déployer une fonction basée sur des événements en Python qui utilise Gemini pour résumer un fichier texte brut importé dans un bucket Cloud Storage.

Points abordés

  • Déployer une fonction Cloud Run basée sur les é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
  • Utiliser Gemini pour résumer un document texte brut importé dans Cloud Storage

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

Mettre à jour la CLI gcloud

Cet atelier de programmation nécessite une version récente de la CLI gcloud. 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 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 \
    eventarc.googleapis.com \
    aiplatform.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
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
SERVICE_NAME=crf-vertexai-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.

SERVICE_ACCOUNT="crf-vertexai-codelab"
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

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

Attribuez maintenant au compte de service le rôle d'utilisateur AI Platform afin qu'il puisse appeler Gemini.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/aiplatform.user"

Attribuez également au compte de service le rôle "Lecteur des objets Storage" pour qu'il puisse accéder au fichier.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --role="roles/storage.objectViewer"

Pour que Cloud Pub/Sub puisse créer des jetons d'identité, votre projet doit disposer du rôle roles/iam.serviceAccountTokenCreator.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator

Pour recevoir des événements via Cloud Storage, votre déclencheur doit disposer du rôle roles/pubsub.publisher accordé au compte de service Google Cloud Storage.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com \
  --role=roles/pubsub.publisher

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 $_

Créez ensuite un fichier requirements.txt avec le contenu suivant:

functions-framework==3.*
google-cloud-aiplatform==1.63.*
google-cloud-storage==2.16.*

Ensuite, créez un fichier main.py avec le contenu suivant:

import functions_framework
import vertexai
from vertexai.generative_models import GenerativeModel
from google.cloud import storage

vertexai.init(project="<YOUR_PROJECT_ID>", location="us-central1")

model = GenerativeModel(
    model_name="gemini-1.5-pro-001",
    system_instruction=[
        "Summarize the following document in a single sentence. Do not respond with more than one sentence.",
    ],
)

# Triggered by a change in a storage bucket
@functions_framework.cloud_event
def hello_gcs(cloud_event):
    data = cloud_event.data

    # download the file
    storage_client = storage.Client()
    blob = storage_client.bucket(data["bucket"]).get_blob(data["name"])
    #print(blob)

    doc = blob.download_as_text()
    contents = [doc]

    response = model.generate_content(contents)
    print(response.text)

    print(f"Response from Model: {response.text}")

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

gcloud beta run deploy $SERVICE_NAME \
      --source . \
      --function hello_gcs \
      --region $REGION \
      --no-allow-unauthenticated \
      --service-account $SERVICE_ACCOUNT_ADDRESS

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 (nouvelle) permet de définir le point d'entrée du nouveau service comme signature de la fonction que vous souhaitez appeler.
  • (Facultatif) --no-allow-unauthenticated pour empêcher l'appel public de votre fonction

Le message suivant peut s'afficher : "Le déploiement à partir de la source nécessite un dépôt Docker Artifact Registry pour stocker les conteneurs créés. Un dépôt nommé [cloud-run-source-deploy] dans la région [<YOUR_REGION>] sera créé." Acceptez la valeur par défaut "yes" (Oui) pour créer le dépôt.

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

gcloud beta run services describe $SERVICE_NAME --region $REGION

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=$SERVICE_NAME \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Pour l'option --event-filters, n'utilisez pas le préfixe gs:// dans le nom du bucket.

Si une erreur If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. s'affiche, veuillez patienter quelques minutes avant de réessayer.

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 https://cloud.google.com/run/docs/tutorials/eventarc.

6. Tester la fonction

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 :

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Une fois le fichier importé, un événement est généré et votre fonction appelle Gemini pour résumer le fichier au format texte brut. Le résumé est imprimé dans les journaux.

Vous pouvez afficher les journaux dans la console Cloud du service Cloud Run ou exécuter la commande suivante:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"

Par exemple, si vous importez un fichier texte brut du guide de l'utilisateur des fonctions Cloud Run pour la version bêta privée, le résultat suivant s'affiche dans les journaux:

Response from Model: Cloud Run functions offer a new way to deploy serverless workloads with familiar Google Cloud Functions paradigms while providing control over the underlying Cloud Run service. 

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 les é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
  • Utiliser Gemini pour résumer un document texte brut importé dans Cloud Storage

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-vertexai-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 le modifier dans Cloud SDK. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.