Как использовать функции Cloud Run и Gemini для создания сводки текстового файла, загруженного в контейнер Cloud Storage

1. Введение

Обзор

Cloud Run Functions — это новый способ развертывания рабочих нагрузок с использованием привычных парадигм обработки событий GCF и сигнатур функций. Вместо использования нашего жестко регламентированного процесса сборки и конфигураций развертывания, Cloud Run Functions предоставляет вам прямой контроль над базовой службой, созданной в Cloud Run.

В этом разделе вы узнаете, как развернуть на Python функцию, управляемую событиями, которая использует Gemini для суммирования содержимого текстового файла, загруженного в хранилище Cloud Storage.

Что вы узнаете

  • Как развернуть управляемую событиями функцию Cloud Run, которая запускается всякий раз, когда объект загружается в хранилище GCS.
  • Как создать сервисный аккаунт с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run?
  • Как использовать Gemini для создания краткого содержания текстового документа, загруженного в облачное хранилище.

2. Настройте переменные среды и включите API.

Обновить интерфейс командной строки gcloud

Для выполнения этого практического задания требуется установленная последняя версия интерфейса командной строки gcloud. Обновить интерфейс можно, выполнив команду:

gcloud components update

Включить API

Прежде чем начать использовать этот практический пример, вам потребуется включить несколько API. Для работы с этим практическим примером необходимы следующие API. Вы можете включить эти API, выполнив следующую команду:

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

Настройка переменных среды

Вы можете установить переменные окружения, которые будут использоваться на протяжении всего этого практического занятия.

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. Создайте сегмент хранения и учетную запись службы.

Создайте хранилище (сумку для хранения).

Создать сегмент Cloud Storage можно, выполнив следующую команду:

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

Создайте учетную запись службы

В этом примере вам потребуется создать учетную запись службы с необходимыми разрешениями EventArc и ролью вызывающего пользователя Cloud Run, чтобы получать события из Cloud Storage и вызывать функцию Cloud Run.

Сначала создайте учетную запись службы.

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"

Далее предоставьте учетной записи службы, связанной с вашим триггером Eventarc, роль Eventarc Event Receiver (roles/eventarc.eventReceiver) в проекте, чтобы триггер мог получать события от поставщиков событий.

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

Затем предоставьте учетной записи службы роль вызывающего пользователя Cloud Run, чтобы она могла вызывать функцию.

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

Теперь предоставьте учетной записи службы роль «Пользователь платформы ИИ», чтобы она могла совершать звонки в Gemini.

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

И предоставьте учетной записи службы роль «Просмотрщик объектов хранилища», чтобы она могла получить доступ к файлу.

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

Для создания токенов идентификации в Cloud Pub/Sub требуется роль 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

Для того чтобы ваш триггер получал события через Cloud Storage, ему необходима роль roles/pubsub.publisher, предоставленная учетной записи службы 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. Создайте и разверните функцию.

Сначала создайте директорию для исходного кода и перейдите в неё с помощью команды `cd`.

mkdir $SERVICE_NAME && cd $_

Затем создайте файл requirements.txt со следующим содержимым:

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

Далее создайте файл main.py со следующим содержимым:

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

Теперь вы можете развернуть функцию Cloud Run, выполнив следующую команду:

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

Обратите внимание на следующее:

  • Флаг --source используется для того, чтобы указать Cloud Run на необходимость встроить функцию в исполняемый контейнерный сервис.
  • Флаг --function (новый) используется для установки точки входа нового сервиса в качестве сигнатуры функции, которую вы хотите вызвать.
  • (необязательно) параметр --no-allow-unauthenticated , чтобы предотвратить публичный вызов вашей функции.

Вам может быть задан вопрос: «Для развертывания из исходного кода требуется репозиторий Docker в реестре артефактов для хранения собранных контейнеров. Будет создан репозиторий с именем [cloud-run-source-deploy] в регионе [<ВАШ_РЕГИОН>]». Примите значение по умолчанию «да», чтобы создать репозиторий.

Вы можете просмотреть свой новый сервис crf-vertexai-codelab , выполнив следующую команду:

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

5. Создайте событие.

Мы можем создать триггер Eventarc для отправки сообщений нашей функции каждый раз, когда объект завершает свою работу в 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

Обратите внимание: для флага --event-filters не используйте префикс gs:// в имени вашего хранилища.

Если вы видите ошибку If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Пожалуйста, подождите несколько минут, прежде чем повторить попытку.

Подробное руководство по настройке службы триггеров из Cloud Storage с использованием Eventarc можно найти в документации Cloud Run здесь: https://cloud.google.com/run/docs/tutorials/eventarc

6. Проверьте функцию

После развертывания функции и создания триггера мы готовы ее вызвать.

Создайте файл и загрузите его в свой сегмент Cloud Storage. Это можно сделать через веб-интерфейс Cloud Console или с помощью инструмента командной строки gsutil, например.

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

После успешной загрузки файла будет сгенерировано событие, и ваша функция вызовет Gemini для составления краткого описания файла в формате обычного текста. Краткое описание будет выведено в логи.

Вы можете просмотреть журналы службы Cloud Run в консоли Cloud Console или выполнить следующую команду:

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

Например, загрузка текстового файла с руководством пользователя по функциям Cloud Run для предварительного просмотра приводит к следующему выводу в журналы:

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. Поздравляем!

Поздравляем с завершением практического занятия!

Мы рекомендуем ознакомиться с документацией по функциям Cloud Run.

Что мы рассмотрели

  • Как развернуть управляемую событиями функцию Cloud Run, которая запускается всякий раз, когда объект загружается в хранилище GCS.
  • Как создать сервисный аккаунт с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run?
  • Как использовать Gemini для создания краткого содержания текстового документа, загруженного в облачное хранилище.

8. Уборка

Чтобы избежать непреднамеренных списаний средств (например, если эта служба Cloud Run будет случайно запущена больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов Cloud Run в бесплатном тарифе ), вы можете либо удалить службу Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить службы Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/run/ и удалите службу crf-vertexai-codelab созданную вами в этом практическом задании.

Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .