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
来查看所有可用项目的列表。