事件驱动型 Cloud Run 函数使用入门

1. 简介

概览

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

借助 Cloud Run functions,我们提供了 Cloud Run 源代码部署的简单用户体验,让开发者能够使用 Cloud Run 配置完全控制其工作负载。

在本部分中,您将学习如何在 Node 中部署事件驱动型函数。您将部署一个函数,每当有对象在 Google Cloud Storage 存储分区中最终确定时,该函数都会触发。

此 Codelab 在以下示例中使用了 nodejs 示例。不过,您可以使用 Cloud Functions(第 2 代)代码示例,并选择所需的语言:

学习内容

  • 如何部署一个事件驱动的 Cloud Run 函数,以便在有对象上传到 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 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 控制台 Web 界面或使用 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 函数相关文档

所学内容

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

8. 清理

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

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

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