Mit Cloud Run-Funktionen und Gemini eine Textdatei zusammenfassen, die in einen Cloud Storage-Bucket hochgeladen wurde

1. Einführung

Übersicht

Cloud Run-Funktionen bieten eine neue Möglichkeit, Arbeitslasten mit den bekannten GCF-Ereignismodellen und der Funktionssignatur bereitzustellen. Anstatt unseren Buildprozess und unsere Bereitstellungskonfigurationen zu verwenden, erhalten Sie mit Cloud Run Functions eine direkte Kontrolle über den zugrunde liegenden Dienst, der in Cloud Run erstellt wurde.

In diesem Abschnitt erfahren Sie, wie Sie eine ereignisgesteuerte Funktion in Python bereitstellen, die mit Gemini eine in einen Cloud Storage-Bucket hochgeladene Nur-Textdatei zusammenfasst.

Aufgaben in diesem Lab

  • Ereignisgesteuerte Cloud Run-Funktion bereitstellen, die ausgelöst wird, wenn ein Objekt in einen GCS-Bucket hochgeladen wird
  • Dienstkonto mit den richtigen Rollen erstellen, um ein Ereignis aus Cloud Storage zu empfangen und die Cloud Run-Funktion aufzurufen
  • Gemini verwenden, um ein in Cloud Storage hochgeladenes Nur-Text-Dokument zusammenzufassen

2. Umgebungsvariablen einrichten und APIs aktivieren

gcloud CLI aktualisieren

Für dieses Codelab muss eine aktuelle Version der gcloud CLI installiert sein. Sie können die Befehlszeile mit dem Befehl

gcloud components update

APIs aktivieren

Bevor Sie dieses Codelab verwenden können, müssen Sie mehrere APIs aktivieren. Für dieses Codelab sind die folgenden APIs erforderlich. Sie können diese APIs aktivieren, indem Sie den folgenden Befehl ausführen:

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

Umgebungsvariablen einrichten

Sie können Umgebungsvariablen festlegen, die in diesem Codelab verwendet werden.

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. Speicher-Bucket und Dienstkonto erstellen

Storage-Bucket erstellen

Sie können einen Cloud Storage-Bucket mit dem folgenden Befehl erstellen:

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

Dienstkonto erstellen

In diesem Beispiel erstellen Sie ein Dienstkonto mit den erforderlichen EventArc-Berechtigungen und der Rolle „Cloud Run-Aufrufer“, um ein Ereignis aus Cloud Storage zu empfangen und die Cloud Run-Funktion aufzurufen.

Erstellen Sie zuerst das Dienstkonto.

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"

Weisen Sie dem Dienstkonto, das Ihrem Eventarc-Trigger zugeordnet ist, die Rolle „Eventarc-Ereignisempfänger“ (roles/eventarc.eventReceiver) für das Projekt zu, damit der Trigger Ereignisse vom Ereignisanbieter empfangen kann.

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

Weisen Sie dem Dienstkonto dann die Rolle „Cloud Run-Aufrufer“ zu, damit es die Funktion aufrufen kann.

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

Weisen Sie dem Dienstkonto nun die Rolle „AI Platform User“ zu, damit es Gemini aufrufen kann.

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

Weisen Sie dem Dienstkonto außerdem die Rolle „Storage Object Viewer“ zu, damit es auf die Datei zugreifen kann.

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

Cloud Pub/Sub benötigt die Rolle „roles/iam.serviceAccountTokenCreator“ für Ihr Projekt, um Identitätstoken zu erstellen.

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

Damit Ihr Trigger Ereignisse über Cloud Storage empfangen kann, muss dem Google Cloud Storage-Dienstkonto die Rolle „roles/pubsub.publisher“ zugewiesen sein.

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

4. Funktion erstellen und bereitstellen

Erstellen Sie zunächst ein Verzeichnis für den Quellcode und speichern Sie das Verzeichnis mit cd.

mkdir $SERVICE_NAME && cd $_

Erstellen Sie dann eine requirements.txt-Datei mit folgendem Inhalt:

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

Erstellen Sie als Nächstes eine main.py-Datei mit folgendem Inhalt:

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}")

Sie können die Cloud Run-Funktion jetzt mit dem folgenden Befehl bereitstellen:

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

Hinweis:

  • Mit dem Flag --source wird Cloud Run angewiesen, die Funktion in einem ausführbaren containerbasierten Dienst zu erstellen.
  • Mit dem Flag --function (neu) wird der Einstiegspunkt des neuen Dienstes auf die Funktionssignatur festgelegt, die aufgerufen werden soll.
  • (Optional) --no-allow-unauthenticated, um zu verhindern, dass die Funktion öffentlich aufgerufen werden kann

Möglicherweise werden Sie gefragt: „Für die Bereitstellung aus der Quelle ist ein Artifact Registry-Docker-Repository erforderlich, um erstellte Container zu speichern. Das Repository [cloud-run-source-deploy] wird in der Region [<YOUR_REGION>] erstellt.“ Übernehmen Sie den Standardwert „Ja“, um das Repository zu erstellen.

Sie können sich Ihren neuen Dienst crf-vertexai-codelab mit dem folgenden Befehl ansehen:

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

5. Ereignis erstellen

Wir können einen Eventarc-Trigger erstellen, um jedes Mal Nachrichten an unsere Funktion zu senden, wenn ein Objekt in Google Cloud Storage abgeschlossen wird:

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

Verwenden Sie für das Flag --event-filters kein gs://-Präfix im Bucket-Namen.

Wenn der Fehler If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. angezeigt wird, warten Sie einige Minuten und versuchen Sie es dann noch einmal.

Eine ausführliche Anleitung zum Einrichten eines Trigger-Dienstes aus Cloud Storage mithilfe von Eventarc finden Sie in der Cloud Run-Dokumentation unter https://cloud.google.com/run/docs/tutorials/eventarc.

6. Funktion testen

Nachdem die Funktion bereitgestellt und ein Trigger erstellt wurde, können Sie die Funktion aufrufen.

Erstellen Sie eine Datei und laden Sie sie in Ihren Cloud Storage-Bucket hoch. Sie können dies über die Weboberfläche der Cloud Console oder mit dem Befehlszeilentool gsutil tun, z.B.

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Wenn die Datei hochgeladen wurde, wird ein Ereignis generiert und Ihre Funktion ruft Gemini auf, um die Nur-Text-Datei zusammenzufassen. Die Zusammenfassung wird in die Protokolle ausgegeben.

Sie können sich die Protokolle entweder in der Cloud Console für den Cloud Run-Dienst ansehen oder den folgenden Befehl ausführen:

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

Wenn Sie beispielsweise eine Nur-Text-Datei des Nutzerhandbuchs für Cloud Run-Funktionen für eine private Vorschau hochladen, wird Folgendes in die Logs geschrieben:

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. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Weitere Informationen finden Sie in der Dokumentation zu Cloud Run-Funktionen.

Behandelte Themen

  • Ereignisbasierte Cloud Run-Funktion bereitstellen, die ausgelöst wird, wenn ein Objekt in einen GCS-Bucket hochgeladen wird
  • Dienstkonto mit den richtigen Rollen erstellen, um ein Ereignis aus Cloud Storage zu empfangen und die Cloud Run-Funktion aufzurufen
  • Mit Gemini ein in Cloud Storage hochgeladenes Nur-Text-Dokument zusammenfassen

8. Bereinigen

Wenn Sie versehentliche Kosten vermeiden möchten, z. B. wenn dieser Cloud Run-Dienst versehentlich mehrmals aufgerufen wird als Ihre monatliche Cloud Run-Aufrufzuweisung in der kostenlosen Stufe, können Sie entweder den Cloud Run-Dienst oder das in Schritt 2 erstellte Projekt löschen.

Wenn Sie die Cloud Run-Dienste löschen möchten, rufen Sie die Cloud Run-Cloud Console unter https://console.cloud.google.com/run/ auf und löschen Sie den Dienst crf-vertexai-codelab, den Sie in diesem Codelab erstellt haben.

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können eine Liste aller verfügbaren Projekte aufrufen, indem Sie gcloud projects list ausführen.