1. Introducción
Descripción general
Las funciones de Cloud Run son una nueva forma de implementar cargas de trabajo con los paradigmas de eventos y la firma de funciones conocidos de GCF. En lugar de usar nuestro proceso de compilación y configuraciones de implementación definidos, las funciones de Cloud Run te brindan 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 use 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 las APIs
Actualiza gcloud CLI
Este codelab requiere que tengas instalada una versión reciente de la CLI de gcloud. Para actualizar la CLI, ejecuta
gcloud components update
Habilita las APIs
Antes de comenzar a usar este codelab, debes habilitar varias APIs. Para este codelab, debes usar 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 configurar las 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
Cree una cuenta de servicio
En este ejemplo, crearás una cuenta de servicio con los permisos necesarios de EventArc y el rol de invocador de Cloud Run para recibir un evento de Cloud Storage e 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"
A continuación, 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 ábrelo con el comando cd.
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 ejecutable basado en contenedores. - La marca
--function
(new) se usa para establecer el punto de entrada del servicio nuevo de modo que sea la firma de la función que quieres que se invoque. - (opcional)
--no-allow-unauthenticated
para evitar que tu función se pueda invocar públicamente
Es posible que se te pregunte si deseas implementar desde el origen. Para ello, se requiere un repositorio de Docker de Artifact Registry para almacenar los contenedores compilados. Se creará un repositorio llamado [cloud-run-source-deploy] en la región [<YOUR_REGION>]”. Acepta el “yes” predeterminado para crear el repositorio.
Para ver tu nuevo servicio crf-vertexai-codelab
, ejecuta el siguiente comando:
gcloud beta run services describe $SERVICE_NAME --region $REGION
5. Crea el evento
Podemos crear un activador de Eventarc para enviar mensajes a nuestra función cada vez que se finalice un objeto en 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
Ten en cuenta que, para la marca --event-filters
, no debes usar el prefijo gs:// en el nombre del bucket.
Si ves un 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 y vuelve a intentarlo.
En la documentación de Cloud Run, puedes encontrar un instructivo detallado para configurar el servicio de activadores desde Cloud Storage con Eventarc: https://cloud.google.com/run/docs/tutorials/eventarc
6. Prueba la función
Con nuestra función implementada y un activador creado, ya está todo listo para invocar la función.
Crea un archivo y súbelo a tu bucket de Cloud Storage. Puedes hacer esto a través de la interfaz web de la consola de Cloud o con la herramienta de la CLI de gsutil, p.ej.,
gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME
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.
Puedes visualizar los registros del servicio de Cloud Run en la consola de Cloud o ejecutar el siguiente comando:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME AND textPayload: Response"
Por ejemplo, si subes un archivo de texto sin formato de la guía del usuario de Cloud Run Functions para obtener una vista previa privada, se imprimirá lo siguiente en los registros:
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. ¡Felicitaciones!
¡Felicitaciones por completar el codelab!
Te recomendamos que revises la documentación de funciones de Cloud Run.
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. Limpia
Para evitar cargos imprevistos (por ejemplo, si este servicio de Cloud Run se invoca por error más veces que 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 borras el proyecto, deberás cambiar los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list
.