1. 简介
概览
Cloud Run 函数是一种使用熟悉的 GCF 事件范例和函数签名部署工作负载的新方式。借助 Cloud Run 函数,您可以直接控制在 Cloud Run 上创建的底层 Service,而不必使用我们专业的构建流程和部署配置。
借助 Cloud Run 函数,我们为 Cloud Run 源代码部署提供简单的用户体验,让开发者能够使用 Cloud Run 配置完全控制其工作负载。
在本部分,您将了解如何在 Node 中部署事件驱动型函数。您将部署一个函数,每当 Google Cloud Storage 存储分区中有对象被终结而触发。
此 Codelab 在下面的示例中使用了 nodejs 示例。不过,您可以选择以自己偏好的语言使用 Cloud Functions(第 2 代)代码示例:
学习内容
- 如何部署在有对象上传到 GCS 存储分区时触发的事件驱动型 Cloud Run 函数
- 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
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
设置环境变量
您可以设置要在整个 Codelab 中使用的环境变量。
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> gcloud config set project $PROJECT_ID SERVICE_NAME=crf-event-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 函数。
首先,创建服务账号。
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') SERVICE_ACCOUNT="cloud-run-functions" 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
4. 创建和部署函数
首先,为源代码创建一个目录,然后通过 cd 命令进入该目录。
mkdir ../$SERVICE_NAME && cd $_
然后,创建一个包含以下内容的 package.json
文件:
{ "dependencies": { "@google-cloud/functions-framework": "^3.0.0" } }
接下来,创建一个包含以下内容的 index.js
文件:
const functions = require("@google-cloud/functions-framework"); // Register a CloudEvent callback with the Functions Framework that will // be triggered by Cloud Storage. functions.cloudEvent("helloGCS", (cloudEvent) => { console.log(`Event ID: ${cloudEvent.id}`); console.log(`Event Type: ${cloudEvent.type}`); const file = cloudEvent.data; console.log(`Bucket: ${file.bucket}`); console.log(`File: ${file.name}`); console.log(`Metageneration: ${file.metageneration}`); console.log(`Created: ${file.timeCreated}`); console.log(`Updated: ${file.updated}`); });
现在,您可以通过运行以下命令来部署 Cloud Run 函数:
gcloud beta run deploy $SERVICE_NAME \ --source . \ --function helloGCS \ --region $REGION \ --no-allow-unauthenticated
请注意以下事项:
- -source 标志用于指示 Cloud Run 将函数构建为基于可运行容器的服务
- –function 标志(新)用于将新服务的入口点设置为您要调用的函数签名
- (可选)-no-allow-unauthenticated,以防止您的函数可公开调用
您可以通过运行以下命令来查看新服务 crf-nodejs-event
:
gcloud beta run services describe $SERVICE_NAME
5. 创建活动
我们可以创建一个 Eventarc 触发器,以便在每次在 Google Cloud Storage 中完成对象时向我们的函数发送消息:
BUCKET_REGION=$REGION gcloud eventarc triggers create $TRIGGER_NAME \ --location=$REGION \ --destination-run-service=crf-nodejs-event \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
请注意以下事项:
- gcs-function-trigger 是触发器的名称
- crf-nodejs-event 是部署函数的 Cloud Run 服务的名称
- 对于 –event-filters 标志,请勿在存储分区名称中使用 gs:// 前缀。
如需查看使用 Eventarc 从 Cloud Storage 设置触发器服务的详细教程,请参阅 Cloud Run 文档:https://cloud.google.com/run/docs/tutorials/eventarc
6. 测试函数
部署完成后,您将看到服务网址。如需调用该函数,您需要发送经过身份验证的请求,其中包含您的身份令牌或具有 Cloud Run Invoker 角色的原则的身份令牌,如下所示:
# get the Service URL SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
部署函数并创建触发器后,我们现在可以调用函数了。
创建文件并将其上传到您的 Cloud Storage 存储分区。您可以通过 Cloud 控制台网页界面或 gsutil CLI 工具执行此操作,例如
echo "hello world" > test.txt gsutil cp test gs://$BUCKET_NAME
文件成功上传后,系统会生成一个事件,而您的函数会输出有关该对象的一些基本信息,例如文件名。您可以在 Cloud 控制台中函数的日志条目中找到此输出内容。或者,您可以使用 gcloud CLI 查询此输出:
gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json
您应该会看到以下输出
"textPayload": "File: test.txt"
7. 恭喜!
恭喜您完成此 Codelab!
建议您查看有关 Cloud Run 函数的文档
所学内容
- 如何部署在有对象上传到 GCS 存储分区时触发的事件驱动型 Cloud Run 函数
- 如何创建具有适当角色的服务账号,以接收来自 Cloud Storage 的事件并调用 Cloud Run 函数
8. 清理
为避免产生意外费用(例如,如果此 Cloud Run 服务被意外调用的次数超过免费层级中的每月 Cloud Run 调用次数),您可以删除该 Cloud Run 服务或删除您在第 2 步中创建的项目。
如需删除 Cloud Run 服务,请前往 Cloud Run Cloud 控制台(网址为 https://console.cloud.google.com/run/),并删除您在此 Codelab 中创建的 crf-event-codelab
服务。
如果您选择删除整个项目,可以前往 https://console.cloud.google.com/cloud-resource-manager,选择您在第 2 步中创建的项目,然后选择“删除”。如果删除项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list
来查看所有可用项目的列表。