1. 简介
概览
Cloud Run functions 是一种使用熟悉的 GCF 事件范式和函数签名来部署工作负载的新方式。Cloud Run functions 不会使用我们主观的构建流程和部署配置,而是让您直接控制在 Cloud Run 上创建的底层服务。
在本部分中,您将学习如何部署一个 Python 事件驱动型函数,该函数使用 Gemini 总结上传到 Cloud Storage 存储分区的纯文本文件。
学习内容
- 如何部署一个事件驱动型 Cloud Run functions 函数,该函数会在对象上传到 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 调用者角色的服务账号,以接收来自 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 Run 服务在 Cloud 控制台中的日志,也可以运行以下命令:
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 functions 文档
所学内容
- 如何部署一个事件驱动型 Cloud Run functions 函数,该函数会在对象上传到 GCS 存储分区时触发
- 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
- 如何使用 Gemini 总结上传到 Cloud Storage 的纯文本文件
8. 清理
为避免产生意外费用(例如,如果此 Cloud Run 服务被意外调用多次,超过了免费层级中每月 Cloud Run 调用次数的分配额),您可以删除 Cloud Run 服务或删除您在第 2 步中创建的项目。
如需删除 Cloud Run 服务,请前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run/),然后删除您在本 Codelab 中创建的 crf-vertexai-codelab 服务。
如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除项目,则需要在 Cloud SDK 中更改项目。您可以运行 gcloud projects list 查看所有可用项目的列表。