1. 简介
概览
Cloud Run functions 是一种使用熟悉的 GCF 事件处理范式和函数签名来部署工作负载的新方式。Cloud Run functions 不会使用我们主观的构建流程和部署配置,而是让您直接控制在 Cloud Run 上创建的底层服务。
借助 Cloud Run functions,我们提供简单的 Cloud Run 源代码部署用户体验,让开发者能够使用 Cloud Run 配置完全控制其工作负载。
在本部分中,您将学习如何在 Node.js 中部署事件驱动型函数。您将部署一个函数,该函数会在 Google Cloud Storage 存储分区中的对象最终确定时触发。
此 Codelab 使用了以下示例中的 Node.js 示例。不过,您可以使用所选语言的 Cloud Functions 第 2 代代码示例:
学习内容
- 如何部署一个事件驱动型 Cloud Run functions 函数,该函数会在对象上传到 GCS 存储分区时触发
- 如何创建具有适当角色的服务账号,以接收来自 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 调用者角色的服务账号,以接收来自 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-event-codelab:
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=$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
请注意以下事项:
- gcs-function-trigger 是触发器的名称
- crf-event-codelab 是部署函数的 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 $SERVICE_NAME --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 控制台 Web 界面或使用 gsutil CLI 工具(例如)来执行此操作。
echo "hello world" > test.txt gsutil cp test.txt gs://$BUCKET_NAME
文件成功上传后,系统会生成一个事件,您的函数会打印一些有关该对象的基本信息,例如文件名。您可以在 Cloud 控制台中找到该函数的日志条目中的相应输出。或者,您也可以使用 gcloud CLI 查询此输出:
gcloud logging read "resource.labels.service_name=$SERVICE_NAME AND textPayload: File" --format=json
您应该会看到以下输出内容
"textPayload": "File: test.txt"
7. 恭喜!
恭喜您完成此 Codelab!
建议您查看 Cloud Run functions 文档
所学内容
- 如何部署一个事件驱动型 Cloud Run functions 函数,该函数会在对象上传到 GCS 存储分区时触发
- 如何创建具有适当角色的服务账号,以接收来自 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 查看所有可用项目的列表。