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

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