如何使用 Cloud Run 函数和 Gemini 汇总上传到 Cloud Storage 存储分区的文本文件

1. 简介

概览

Cloud Run 函数是一种使用熟悉的 GCF 事件范式和函数签名部署工作负载的新方式。借助 Cloud Run functions,您可以直接控制在 Cloud Run 上创建的底层服务,而无需使用我们的强制性构建流程和部署配置。

在本部分中,您将学习如何使用 Python 部署事件驱动型函数,该函数使用 Gemini 对上传到 Cloud Storage 存储分区的纯文本文件进行总结。

学习内容

  • 如何部署一个事件驱动的 Cloud Run 函数,以便在有对象上传到 GCS 存储分区时触发该函数
  • 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
  • 如何使用 Gemini 总结上传到 Cloud Storage 的纯文本文档

2. 设置环境变量并启用 API

更新 gcloud CLI

本 Codelab 要求安装较新版本的 gcloud CLI。您可以通过运行以下命令来更新 CLI

gcloud components update

启用 API

在开始使用此 Codelab 之前,您需要先启用几个 API。此 Codelab 需要使用以下 API。您可以通过运行以下命令来启用这些 API:

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

设置环境变量

您可以设置将在此 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. 创建存储分区和服务账号

创建存储桶

您可以通过运行以下命令创建 Cloud Storage 存储分区:

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

创建服务账号

在本例中,您将创建一个具有所需 Eventarc 权限和 Cloud Run Invoker 角色的服务账号,以便从 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 Event Receiver 角色 (roles/eventarc.eventReceiver) 授予与您的 Eventarc 触发器关联的服务账号,以便该触发器可以接收来自事件提供程序的事件。

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

然后,向服务账号授予 Cloud Run Invoker 角色,以便其可以调用函数。

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

现在,向服务账号授予 AI Platform User 角色,以便它可以调用 Gemini。

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

并向服务账号授予 Storage Object Viewer 角色,以便其访问文件。

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

您的触发器需要向 Google Cloud Storage 服务账号授予 roles/pubsub.publisher 角色,才能通过 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,用于防止函数被公开调用

系统可能会提示您“从源代码部署需要有 Artifact Registry Docker 代码库来存储构建的容器。系统将在区域 [<YOUR_REGION>] 中创建一个名为 [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.,请等待几分钟,然后重试。

如需有关使用 Eventarc 从 Cloud Storage 设置触发器服务的详细教程,请参阅以下 Cloud Run 文档:https://cloud.google.com/run/docs/tutorials/eventarc

6. 测试函数

函数已部署,触发器已创建,现在我们可以调用函数了。

创建文件并将其上传到您的 Cloud Storage 存储分区。您可以通过 Cloud 控制台 Web 界面或使用 gsutil CLI 工具执行此操作,例如:

gsutil cp <YOUR_PLAIN_TEXT_FILE> gs://$BUCKET_NAME

文件成功上传后,系统会生成一个事件,您的函数将调用 Gemini 来对纯文本文件进行总结。摘要将输出到日志。

您可以在 Cloud 控制台中查看 Cloud Run 服务的日志,也可以运行以下命令:

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

例如,上传 Cloud Run functions 非公开预览版用户指南的纯文本文件会导致以下内容输出到日志:

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. 恭喜!

恭喜您完成此 Codelab!

建议您查看 Cloud Run 函数文档

所学内容

  • 如何部署一个事件驱动的 Cloud Run 函数,以便在有对象上传到 GCS 存储分区时触发该函数
  • 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
  • 如何使用 Gemini 对上传到 Cloud Storage 的纯文本文档进行总结

8. 清理

为避免意外产生费用(例如,如果此 Cloud Run 服务的意外调用次数超出了免费层级的 Cloud Run 调用月度配额),您可以删除该 Cloud Run 服务,也可以删除您在第 2 步中创建的项目。

如需删除 Cloud Run 服务,请前往 https://console.cloud.google.com/run/ 访问 Cloud Run Cloud 控制台,然后删除您在此 Codelab 中创建的 crf-vertexai-codelab 服务。

如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除该项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 来查看所有可用项目的列表。