Cómo usar las funciones de Cloud Run y Gemini para resumir un archivo de texto subido a un bucket de Cloud Storage

1. Introducción

Descripción general

Cloud Run Functions es una nueva forma de implementar cargas de trabajo con los paradigmas de eventos y la firma de función conocidos de GCF. En lugar de usar nuestro proceso de compilación y configuraciones de implementación opinados, Cloud Run Functions te brinda control directo sobre el servicio subyacente creado en Cloud Run.

En esta sección, aprenderás a implementar una función basada en eventos en Python que usa Gemini para resumir un archivo de texto sin formato subido a un bucket de Cloud Storage.

Qué aprenderás

  • Cómo implementar una función de Cloud Run basada en eventos que se activa cada vez que se sube un objeto a un bucket de GCS
  • Cómo crear una cuenta de servicio con los roles adecuados para recibir un evento de Cloud Storage y, luego, invocar la función de Cloud Run
  • Cómo usar Gemini para resumir un documento de texto sin formato subido a Cloud Storage

2. Configura variables de entorno y habilita APIs

Actualiza la CLI de gcloud

Este codelab requiere una versión reciente de la CLI de gcloud instalada. Para actualizar la CLI, ejecuta

gcloud components update

Habilita las APIs

Antes de comenzar a usar este codelab, deberás habilitar varias APIs. Este codelab requiere el uso de las siguientes APIs. Para habilitar esas APIs, ejecuta el siguiente comando:

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

Configura variables de entorno

Puedes establecer variables de entorno que se usarán en este codelab.

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. Crea un bucket de almacenamiento y una cuenta de servicio

Crea un bucket de almacenamiento

Para crear un bucket de Cloud Storage, ejecuta el siguiente comando:

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

Crea una cuenta de servicio

En este ejemplo, crearás una cuenta de servicio con los permisos de Eventarc necesarios y el rol de invocador de Cloud Run para recibir un evento de Cloud Storage y, luego, invocar la función de Cloud Run.

Primero, crea la cuenta de servicio.

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"

Luego, otorga el rol de receptor de eventos de Eventarc (roles/eventarc.eventReceiver) en el proyecto a la cuenta de servicio asociada con tu activador de Eventarc para que el activador pueda recibir eventos de los proveedores de eventos.

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

Luego, otorga a la cuenta de servicio el rol de invocador de Cloud Run para que pueda invocar la función.

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

Ahora, otorga a la cuenta de servicio el rol de usuario de AI Platform para que pueda realizar llamadas a Gemini.

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

Además, otorga a la cuenta de servicio el rol de visualizador de objetos de almacenamiento para que pueda acceder al archivo.

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

Cloud Pub/Sub necesita el rol roles/iam.serviceAccountTokenCreator en tu proyecto para crear tokens de identidad.

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

Tu activador necesita el rol roles/pubsub.publisher otorgado a la cuenta de servicio de Google Cloud Storage para recibir eventos a través de 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. Crea y, luego, implementa la función

Primero, crea un directorio para el código fuente y cambia a ese directorio.

mkdir $SERVICE_NAME && cd $_

Luego, crea un archivo requirements.txt con el siguiente contenido:

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

A continuación, crea un archivo main.py con el siguiente contenido:

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

Ahora puedes implementar la función de Cloud Run ejecutando el siguiente comando:

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

Ten en cuenta lo siguiente:

  • La marca --source se usa para indicarle a Cloud Run que compile la función en un servicio basado en contenedores ejecutables.
  • La marca --function (nueva) se usa para establecer el punto de entrada del nuevo servicio como la firma de función que deseas invocar.
  • (opcional) --no-allow-unauthenticated para evitar que tu función se pueda invocar públicamente.

Es posible que se te pregunte: "Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [<YOUR_REGION>] will be created" (La implementación desde la fuente requiere un repositorio de Docker de Artifact Registry para almacenar contenedores compilados. Se creará un repositorio llamado [cloud-run-source-deploy] en la región [<YOUR_REGION>]).

Puedes ver tu nuevo servicio crf-vertexai-codelab si ejecutas el siguiente comando:

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

Para ver tu nuevo servicio `crf-vertexai-codelab`, ejecuta el siguiente comando: 5.

Crea el evento

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

Tenga en cuenta que para la marca --event-filters, no utilice el prefijo gs:// en el nombre de su bucket.

Si ves el error If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent., espera unos minutos antes de volver a intentarlo.

Puedes encontrar un tutorial detallado sobre cómo configurar el servicio de activación desde Cloud Storage con Eventarc en la documentación de Cloud Run aquí: https://cloud.google.com/run/docs/tutorials/eventarc

Puedes encontrar un instructivo detallado para configurar el servicio de activador desde Cloud Storage con Eventarc en la documentación de Cloud Run aquí: https://cloud.google.com/run/docs/tutorials/eventarc 6.

Prueba la función

Con nuestra función implementada y un activador creado, ya podemos invocar la función. Crea un archivo y súbelo a tu bucket de Cloud Storage.

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

Puedes hacerlo a través de la interfaz web de Cloud Console o con la herramienta de la CLI de gsutil, por ejemplo: Cuando el archivo se suba correctamente, se generará un evento y tu función llamará a Gemini para resumir el archivo de texto sin formato.

El resumen se imprimirá en los registros.

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

Puedes ver los registros en Cloud Console para el servicio de Cloud Run o ejecutar el siguiente comando:

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

¡Felicitaciones!

Le recomendamos que revise la documentación de Cloud Run functions

Te recomendamos que revises la documentación de Cloud Run Functions.

  • **Temas abordados**
  • Cómo implementar una función de Cloud Run basada en eventos que se activa cada vez que se sube un objeto a un bucket de GCS
  • Cómo crear una cuenta de servicio con los roles adecuados para recibir un evento de Cloud Storage y, luego, invocar la función de Cloud Run

Cómo usar Gemini para resumir un documento de texto sin formato subido a Cloud Storage 8.

Para evitar cargos involuntarios (por ejemplo, si este servicio de Cloud Run se invoca de forma involuntaria más veces de lo que permite tu asignación mensual de invocaciones de Cloud Run en el nivel gratuito), puedes borrar el servicio de Cloud Run o el proyecto que creaste en el paso 2.

Para borrar los servicios de Cloud Run, ve a la consola de Cloud Run en https://console.cloud.google.com/run/ y borra el servicio crf-vertexai-codelab que creaste en este codelab.

Si decides borrar todo el proyecto, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si decides borrar todo el proyecto, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Puedes ver la lista de todos los proyectos disponibles ejecutando gcloud projects list.