本教程演示了如何使用 Pub/Sub 触发器编写和触发事件驱动的 Cloud Run 函数。
您可以为 Eventarc 触发器指定过滤条件,以配置事件的路由(包括事件来源和事件目标)。对于本教程中的示例,向 Pub/Sub 主题发布消息会触发事件,系统会以 HTTP 请求的形式向函数发送请求。
如果您刚接触 Pub/Sub,并且希望了解详情,请参阅 Pub/Sub 文档,了解快速入门和关键参考信息。
目标
在此教程中,您将学习以下操作:
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- 如果您没有使用 Cloud Shell,请更新 Google Cloud CLI 组件并使用您的账号登录:
gcloud components update gcloud auth login
- 启用 API:
gcloud services enable artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
- 设置本教程中使用的配置变量:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
- 创建服务账号:
SERVICE_ACCOUNT=eventarc-trigger-sa gcloud iam service-accounts create $SERVICE_ACCOUNT
所需的角色
-
如果您是项目创建者,则会被授予基本 Owner 角色 (
roles/owner
)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。
所需权限
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
Cloud Run Source Developer (
roles/run.sourceDeveloper
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
) -
Logs View Accessor (
roles/logging.viewAccessor
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
Cloud Run Source Developer (
记下 Compute Engine 默认服务账号,因为您将把它附加到 Eventarc 触发器以代表触发器的身份信息进行测试。启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建此服务账号,其电子邮件地址格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
将
PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
对于生产环境,我们强烈建议创建新的服务账号,并为其授予一个或多个 IAM 角色,这些角色包含所需的最小权限并遵循最小权限原则。
- 默认情况下,只有 Project Owner、Project Editor 以及 Cloud Run Admin 和 Invoker 才能调用 Cloud Run 服务。您可以按服务控制访问权限;但是,出于测试目的,请向 Compute Engine 服务账号授予 Google Cloud 项目的 Cloud Run Invoker 角色 (
run.invoker
)。此操作会授予项目中所有 Cloud Run 服务和作业的角色。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.invoker
请注意,如果您在未授予 Cloud Run Invoker 角色的情况下为经过身份验证的 Cloud Run 服务创建触发器,则触发器会成功创建且处于活动状态。但是,触发器将无法按预期运行,并且日志中会显示类似于以下内容的消息:
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
- 将项目的 Eventarc Event Receiver 角色 (
roles/eventarc.eventReceiver
) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以接收来自事件提供程序的事件。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
- 在为来自 Cloud Storage 的直接事件创建触发器之前,请向 Cloud Storage 服务代理授予 Pub/Sub Publisher 角色 (
roles/pubsub.publisher
):SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
- 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向该服务代理授予 Service Account Token Creator 角色 (
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
创建 Pub/Sub 主题
在 Cloud Run functions 中,部署函数时不会自动创建 Pub/Sub 主题。在部署函数之前,请向此 Pub/Sub 主题发布消息以触发函数:
gcloud pubsub topics create YOUR_TOPIC_NAME
准备应用
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
PHP
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
切换到包含用于访问 Pub/Sub 的 Cloud Run functions 示例代码的目录:
Node.js
cd nodejs-docs-samples/functions/v2/helloPubSub/
Python
cd python-docs-samples/functions/v2/pubsub/
Go
cd golang-samples/functions/functionsv2/hellopubsub/
Java
cd java-docs-samples/functions/v2/pubsub/
.NET
cd dotnet-docs-samples/functions/helloworld/HelloPubSub/
Ruby
cd ruby-docs-samples/functions/helloworld/pubsub/
PHP
cd php-docs-samples/functions/helloworld_pubsub/
查看示例代码:
Node.js
Python
Go
Java
.NET
Ruby
PHP
部署事件驱动的函数
如需部署该函数,请在包含示例代码的目录中运行以下命令:
Node.js
gcloud beta run deploy FUNCTION \
--source . \
--function helloPubSub \
--base-image nodejs22 \
Python
gcloud beta run deploy FUNCTION \
--source . \
--function subscribe \
--base-image python312 \
Go
gcloud beta run deploy FUNCTION \
--source . \
--function HelloPubSub \
--base-image go122 \
Java
gcloud beta run deploy FUNCTION \
--source . \
--function functions.SubscribeToTopic \
--base-image java21 \
.NET
gcloud beta run deploy FUNCTION \
--source . \
--function HelloPubSub.Function \
--base-image dotnet8 \
Ruby
gcloud beta run deploy FUNCTION \
--source . \
--function hello_pubsub \
--base-image ruby33 \
PHP
gcloud beta run deploy FUNCTION \
--source . \
--function helloworldPubsub \
--base-image php83 \
将 FUNCTION 替换为要部署的函数的名称。如果您省略此参数,则在运行该命令时系统会提示您输入名称。
BASE_IMAGE 是函数的基础映像环境。如需详细了解基础映像以及每个映像中包含的软件包,请参阅运行时基础映像。
如果系统提示您在指定区域中创建仓库,请按 y
进行响应。部署完成后,Google Cloud CLI 会显示一个运行服务的网址。
创建 Eventarc 触发器
如需部署带有 Pub/Sub 触发器的函数,请在包含示例代码的目录中运行以下命令:
创建 Eventarc Pub/Sub 触发器:
gcloud eventarc triggers create TRIGGER_NAME \ --location=${REGION} \ --destination-run-service=FUNCTION \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
您需要进行如下替换:
- 将 TRIGGER_NAME 替换为触发器的名称。
- 将 FUNCTION 替换为函数的名称。
- 将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
请注意,首次在 Google Cloud 项目中创建 Eventarc 触发器时,预配 Eventarc 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅权限遭拒错误。
确认触发器已成功创建。请注意,尽管触发器会立即创建,但它最长可能需要两分钟才能完全正常运行。
gcloud eventarc triggers list --location=${REGION}
输出应类似如下所示:
NAME: helloworld-events TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: helloworld-events ACTIVE: Yes LOCATION: us-central1
触发函数
如需测试 Pub/Sub 函数,请执行以下操作:
将主题分配给变量:
TOPIC_ID=$(gcloud eventarc triggers describe TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')
向主题发布消息:
gcloud pubsub topics publish $TOPIC_ID --message="Hello World"
Cloud Run 服务会记录传入消息的正文。您可以在 Cloud Run 实例的“日志”部分查看此信息:
- 前往 Google Cloud 控制台。
- 点击相应函数。
选择日志标签页。
您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻再检查一次。
查找“Hello World!”消息。
清理
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除教程资源
删除您在本教程中部署的 Cloud Run 服务:
gcloud run services delete SERVICE_NAME
其中,
SERVICE_NAME
是您选择的服务名称。您还可以从 Google Cloud 控制台中删除 Cloud Run 服务。
移除您在教程设置过程中添加的任何 gcloud CLI 默认配置。
例如:
gcloud config unset run/region
或
gcloud config unset project
删除在本教程中创建的其他 Google Cloud 资源:
- 删除 Eventarc 触发器:
将gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
替换为您的触发器的名称。
- 删除 Eventarc 触发器: