本教程介绍如何通过 Pub/Sub 推送订阅编写、部署和调用 Cloud Run 服务。
目标
- 编写、构建服务并将其部署到 Cloud Run
- 通过向 Pub/Sub 主题发布消息来调用该服务。
费用
在本文档中,您将使用 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Pub/Sub and Cloud Run APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 安装并初始化 gcloud CLI。
- 更新组件:
gcloud components update
-
Cloud Build Editor (
roles/cloudbuild.builds.editor) -
Cloud Run Admin (
roles/run.admin) -
Create Service Accounts (
roles/iam.serviceAccountCreator) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin) -
Pub/Sub Editor (
roles/pubsub.editor) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) -
Storage Admin (
roles/storage.admin)
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
设置 gcloud 默认值
要配置您的 Cloud Run 服务的 gcloud 默认值,请执行以下操作:
设置默认项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您在本教程中创建的项目的名称。
为您选择的区域配置 gcloud:
gcloud config set run/region REGION
将 REGION 替换为您选择的受支持的 Cloud Run 区域。
Cloud Run 位置
Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。
选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。
Cloud Run 可在以下区域使用:
基于层级 1 价格
asia-east1(台湾)asia-northeast1(东京)asia-northeast2(大阪)asia-south1(印度孟买)europe-north1(芬兰)二氧化碳排放量低
europe-north2(斯德哥尔摩)二氧化碳排放量低
europe-southwest1(马德里)二氧化碳排放量低
europe-west1(比利时)二氧化碳排放量低
europe-west4(荷兰)二氧化碳排放量低
europe-west8(米兰)europe-west9(巴黎)二氧化碳排放量低
me-west1(特拉维夫)northamerica-south1(墨西哥)us-central1(爱荷华)二氧化碳排放量低
us-east1(南卡罗来纳)us-east4(北弗吉尼亚)us-east5(哥伦布)us-south1(达拉斯)二氧化碳排放量低
us-west1(俄勒冈)二氧化碳排放量低
基于层级 2 价格
africa-south1(约翰内斯堡)asia-east2(香港)asia-northeast3(韩国首尔)asia-southeast1(新加坡)asia-southeast2(雅加达)asia-south2(印度德里)australia-southeast1(悉尼)australia-southeast2(墨尔本)europe-central2(波兰,华沙)europe-west10(柏林)europe-west12(都灵)europe-west2(英国伦敦)二氧化碳排放量低
europe-west3(德国法兰克福)europe-west6(瑞士苏黎世)二氧化碳排放量低
me-central1(多哈)me-central2(达曼)northamerica-northeast1(蒙特利尔)二氧化碳排放量低
northamerica-northeast2(多伦多)二氧化碳排放量低
southamerica-east1(巴西圣保罗)二氧化碳排放量低
southamerica-west1(智利圣地亚哥)二氧化碳排放量低
us-west2(洛杉矶)us-west3(盐湖城)us-west4(拉斯维加斯)
如果您已创建 Cloud Run 服务,可在Google Cloud 控制台的 Cloud Run 信息中心内查看区域。
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
您需要进行如下替换:
- 将 REPOSITORY 替换为制品库的唯一名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
创建 Pub/Sub 主题
示例服务由发布到 Pub/Sub 主题的消息触发,因此您需要在 Pub/Sub 中创建主题。
gcloud
如需创建新的 Pub/Sub 主题,请使用以下命令:
gcloud pubsub topics create myRunTopic
您可以使用 myRunTopic 或将其替换为 Google Cloud 项目中唯一的主题名称。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
要创建 Pub/Sub 主题,请将以下内容添加到现有的 main.tf 文件中:
您可以使用 Cloud 项目中唯一的主题名称。
检索代码示例
如需检索可用的代码示例,请执行以下操作:
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run 示例代码的目录:
Node.js
cd nodejs-docs-samples/run/pubsub/
Python
cd python-docs-samples/run/pubsub/
Go
cd golang-samples/run/pubsub/
Java
cd java-docs-samples/run/pubsub/
C#
cd dotnet-docs-samples/run/Run.Samples.Pubsub.MinimalApi/
查看代码
本教程中使用的代码包含以下部分:
处理传入请求的服务器。
Node.js
为了便于测试 Node.js 服务,服务器配置与服务器启动是相互独立的。
Node.js Web 服务器在
app.js中设置。网络服务器在
index.js中启动:Python
Go
Java
C#
用于处理 Pub/Sub 消息并记录问候语的处理程序。
Node.js
Python
Go
Java
C#
您必须对该服务进行编码,使其返回准确的 HTTP 响应代码。如果返回成功代码(例如 HTTP
200或204),则指示 Pub/Sub 消息处理已完成。如果返回错误代码(如 HTTP400或500),则指示将重试该消息(请参阅“通过推送方式接收消息”指南。与使用 Cloud Functions v2 API 创建的函数不同,您无法为使用 Cloud Run Admin API 创建的函数停用重试功能。如需了解详情,请参阅配置事件驱动型函数重试。用于定义服务的操作环境的
Dockerfile。Dockerfile的内容因语言而异。Node.js
Python
Go
Java
此示例使用 Jib 利用常见 Java 工具构建 Docker 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 Jib 构建 Java 容器。
C#
如需详细了解如何对 Pub/Sub 请求的来源进行身份验证,请参阅与 Pub/Sub 集成。
交付代码
交付代码包括三个步骤:使用 Cloud Build 构建容器映像、将容器映像上传到 Artifact Registry,以及将容器映像部署到 Cloud Run。
如需交付代码,请执行以下操作:
-
构建容器并将其发布到 Artifact Registry 上:
Node.js
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Python
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Go
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Java
-
使用 gcloud CLI 凭据帮助程序,授权 Docker 推送到您的 Artifact Registry。
gcloud auth configure-docker
-
使用 Jib Maven 插件来构建容器并将其推送到 Artifact Registry。
您需要进行如下替换:mvn compile jib:build -D image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称。成功后,您会看到一条 BUILD SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
C#
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
-
部署应用:
命令行
-
运行以下命令来部署您的应用:
您需要进行如下替换:gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub --no-allow-unauthenticated
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub是映像名称,pubsub-tutorial是服务名称。请注意,容器映像会部署到您之前在设置 gcloud 下配置的服务和区域--no-allow-unauthenticated标志限制对服务未经身份验证的访问。通过将该服务保留为不公开状态,您可以依赖 Cloud Run 的自动 Pub/Sub 集成功能对请求进行身份验证。如需详细了解如何进行此项配置,请参阅与 Pub/Sub 集成。如需详细了解基于 Identity and Access Management (IAM) 的身份验证,请参阅使用 IAM 管理访问权限。等待部署完成,这可能需要半分钟左右的时间。 成功完成时,命令行会显示服务网址。此网址用于配置 Pub/Sub 订阅。
-
如果要将代码更新部署到该服务,请重复执行上述步骤。向服务执行的每次部署都会创建一个新的修订版本,该修订版本准备就绪后会自动开始处理流量。
Terraform
如需创建 Cloud Run 服务,请将以下内容添加到现有
.tf文件中。 您需要进行如下替换:resource "google_project_service" "cloudrun_api" { service = "run.googleapis.com" disable_on_destroy = false } resource "google_cloud_run_v2_service" "default" { name = "pubsub-tutorial" location = "REGION" template { containers { image = "IMAGE_URL" } } depends_on = [google_project_service.cloudrun_api] }
- 将 IMAGE_URL 替换为您的图片网址:
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
-
与 Pub/Sub 集成
如需将该服务与 Pub/Sub 集成,请执行以下操作:
gcloud
创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。
gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"
您可以使用
cloud-run-pubsub-invoker,或将其替换为 Google Cloud 项目内唯一的名称。使用该服务账号创建 Pub/Sub 订阅:
为调用方服务账号授予调用您的
pubsub-tutorial服务的权限:gcloud run services add-iam-policy-binding pubsub-tutorial \ --member=serviceAccount:cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
IAM 更改可能需要几分钟时间才能完成传播。在此期间,您可能会在服务日志中看到
HTTP 403错误。允许 Pub/Sub 在您的项目中创建身份验证令牌:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
您需要进行如下替换:
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
Google Cloud 控制台中与您项目对应的“项目信息”面板中列出了项目 ID 和项目编号。
使用该服务账号创建 Pub/Sub 订阅:
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
您需要进行如下替换:
- 将 myRunTopic 替换为之前创建的主题。
- 将 SERVICE-URL 替换为在部署服务时提供的 HTTPS 网址。即使您还添加了网域映射,此网址仍然有效。
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
--push-auth-service-account标志激活 Pub/Sub 推送功能,以进行身份验证和授权。您的 Cloud Run 服务网域会自动注册用于 Pub/Sub 订阅。
仅适用于 Cloud Run,可以对令牌是否有效进行内置身份验证检查,以及对服务账号是否有权调用 Cloud Run 服务进行授权检查。
您的服务现已与 Pub/Sub 全面集成。
Terraform
创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。
使用该服务账号创建 Pub/Sub 订阅:
为调用方服务账号授予调用您的
pubsub-tutorial服务的权限:允许 Pub/Sub 在您的项目中创建身份验证令牌:
使用该服务账号创建 Pub/Sub 订阅:
您的服务现已与 Pub/Sub 全面集成。
试试看
如需测试端到端解决方案,请按如下所述操作:
向该主题发送一条 Pub/Sub 消息:
gcloud pubsub topics publish myRunTopic --message "Runner"
除了使用命令行(如本教程中所示),您还可以编程方式发布消息。如需了解详情,请参阅发布消息。
进入服务日志:
- 前往 Google Cloud 控制台
- 点击
pubsub-tutorial服务。 选择日志标签页。
您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻再检查一次。
查找“Hello Runner!”消息。
清理
如需浏览有关如何将 Cloud Run 与 Pub/Sub 搭配使用的更深层用例,请暂时跳过清理,继续阅读教程:使用 Cloud Run 处理图片。
为避免您的 Google Cloud 账号产生额外费用,请删除您在本教程中部署的所有资源。
删除项目
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是某个现有项目,并且需要保留此项目但不保留在本教程中所做的更改,请删除为本教程创建的资源。
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 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 服务。Cloud Run 服务在收到请求之前不会产生费用。
如需删除 Cloud Run 服务,请运行以下命令:
gcloud run services delete SERVICE-NAME
将 SERVICE-NAME 替换为服务的名称。
您还可以通过Google Cloud 控制台删除 Cloud Run 服务。
移除您在教程设置过程中添加的
gcloud默认区域配置:gcloud config unset run/region移除项目配置:
gcloud config unset project删除在本教程中创建的其他 Google Cloud 资源:
- 删除 Pub/Sub 主题
myRunTopic - 删除 Pub/Sub 订阅
myRunSubscription - 从 Artifact Registry 中删除容器映像(名为
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub)。 - 删除调用方服务账号
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
- 删除 Pub/Sub 主题
后续步骤
- 了解如何配置重试。
- 如需了解如何使用内部入站流量控制来限制入站流量,请参阅限制入站流量。
- 展开本教程中部署的示例服务,以添加用于修改上传到 Cloud Storage 的图片的图片处理功能。
- 详细了解如何将主题整合到 Pub/Sub 架构中以及如何管理主题
- 如需详细了解 Pub/Sub 订阅,请参阅管理订阅。
- 探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud 架构中心。