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énement et de la signature de fonction GCF que vous connaissez déjà. Au lieu d'utiliser notre processus de compilation et nos configurations de déploiement prédéfinis, 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 les é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 est déclenchée 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 en texte brut importé dans Cloud Storage

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

Mettre à jour gcloud CLI

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

gcloud components update

Activer les API

Avant de commencer 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 \
    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 de stockage 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 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.

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"

Ensuite, attribuez le rôle Récepteur d'é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 le rôle Demandeur Cloud Run au compte de service 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 le rôle Utilisateur AI Platform au compte de service afin qu'il puisse effectuer des appels à Gemini.

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

Attribuez également le rôle Lecteur des objets de l'espace de stockage au compte de service afin 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é, le compte de service doit détenir le rôle roles/iam.serviceAccountTokenCreator sur votre projet.

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, le rôle roles/pubsub.publisher doit être accordé au compte de service Google Cloud Storage associé à votre déclencheur.

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

Commencez par créer un répertoire pour le code source, puis accédez-y.

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

Créez ensuite 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 à Cloud Run de compiler la fonction dans un service basé sur un conteneur exécutable.
  • L'option --function (nouvelle) 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 empêche 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] sera créé dans la région [<YOUR_REGION>]." Acceptez la valeur par défaut "yes" 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

Veuillez noter que pour l'option --event-filters, n'utilisez pas le préfixe gs:// dans le nom de votre bucket.

Si l'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 : 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 à appeler la fonction.

Créez un fichier et importez-le dans votre bucket Cloud Storage. Vous pouvez le faire via l'interface Web Cloud Console ou à l'aide de l'outil de ligne de commande 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 texte brut. Le résumé est imprimé dans les journaux.

Vous pouvez afficher les journaux dans Cloud Console pour le 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, l'importation d'un fichier texte brut du guide de l'utilisateur des fonctions Cloud Run pour la version Preview privée génère les éléments suivants 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 !

Bravo ! 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 est déclenchée 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 en texte brut importé dans Cloud Storage

8. Effectuer un nettoyage

Pour éviter des frais involontaires (par exemple, si ce service Cloud Run est appelé par inadvertance plus de fois que votre allocation mensuelle 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 à Cloud Run dans Cloud Console à l'adresse https://console.cloud.google.com/run/, puis supprimez le crf-vertexai-codelab service que vous avez créé dans cet atelier de programmation.

Si vous choisissez de supprimer l'intégralité du projet, accédez à https://console.cloud.google.com/cloud-resource-manager, sélectionnez le projet que vous avez créé à l'étape 2, puis cliquez sur "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.