本页面介绍如何使用 Pub/Sub 将消息推送到 Cloud Run 服务的端点,随后这些消息会作为 HTTP 请求传送到容器。本页面介绍如何在同一 Google Cloud 项目中让您的服务安全地处理由 Pub/Sub 订阅推送的消息。
利用服务账号和 IAM 权限,您可以安全、私密地将 Pub/Sub 与 Cloud Run 搭配使用,而无需公开 Cloud Run 服务。只有您设置的 Pub/Sub 订阅才能调用您的服务。
Cloud Run 的确认时限
请务必将 Pub/Sub 订阅确认时限 (ackDeadlineSeconds
) 设置为允许的 600 秒上限。您的 Cloud Run 服务必须在 600 秒内返回响应以确认 Pub/Sub 消息,否则 Pub/Sub 将重新传送该消息,从而导致 Cloud Run 服务重复触发。
使用场景
可能的使用场景包括:
- 在有文件上传到 Cloud Storage 存储分区时收到事件,然后对数据进行转换。
- 将 Google Cloud 的运维套件日志导出到 Pub/Sub,以通过 Cloud Run 处理这些日志
- 从 Cloud Run 服务中发布和处理您自己的自定义事件。
集成概览
要将您的服务与 Pub/Sub 集成,请执行以下操作:
- 创建 Pub/Sub 主题。
- 在 Cloud Run 服务中添加代码,以响应发送到您创建的主题的 Pub/Sub 消息。
- 创建具有所需权限的服务账号。
- 创建 Pub/Sub 订阅并将其与服务账号相关联。此订阅将向您的服务发送已发布到该主题的任何消息。
前期准备
- 按照 Cloud Run 设置页面中的说明设置您的环境(如果尚未设置)。
- 本指南假定您已拥有 Cloud Run 服务,并希望添加代码以将该服务与 Pub/Sub 集成。如果您没有此类服务,请考虑使用 Pub/Sub 的 Cloud Run 教程,而不是按照本页面的说明操作。
添加代码以处理来自 Pub/Sub 的消息
修改现有服务代码以添加支持 Pub/Sub 所需的代码。您的服务必须从请求中提取消息并返回预期的成功代码。以下所选语言(您可以使用任何语言)的代码段显示如何针对简单的“Hello World”消息执行此操作:
Node.js
Python
Go
Java
您必须对该服务进行编码,使其返回准确的 HTTP 响应代码。如果返回成功代码(例如 HTTP 200
或 204
),则指示 Pub/Sub 消息处理已完成。如果返回错误代码(如 HTTP 400
或 500
),则指示将重试该消息(请参阅通过推送方式接收消息。
构建您的 Cloud Run 服务,然后使用上述 Pub/Sub 代码更新该服务,最后部署该服务。
为订阅创建服务账号
您需要创建一个服务账号来与您的 Pub/Sub 订阅相关联,并为其授予调用 Cloud Run 服务的权限。推送到您的 Cloud Run 服务的 Pub/Sub 消息将采用此服务账号的身份。
您可以使用现有服务账号来表示 Pub/Sub 订阅身份,也可以创建新账号。
要创建新服务账号并向其授予调用 Cloud Run 服务的权限,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到服务账号页面。
选择一个项目。
输入要在 Google Cloud 控制台中显示的服务账号名称。
Google Cloud 控制台会根据此名称生成服务账号 ID。如有必要,请修改 ID。此 ID 创建后便无法更改。
可选:输入服务账号的说明。
点击创建并继续。
可选:点击选择角色字段。
选择 Cloud Run > Cloud Run Invoker。
点击完成。
命令行
创建服务账号:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"
注意替换如下内容:
- 将 SERVICE_ACCOUNT_NAME 替换为 Google Cloud 项目中唯一的小写名称,例如
my-invoker-service-account-name
。 - 将 DISPLAYED_SERVICE_ACCOUNT_NAME 替换为您要在控制台等界面中为此服务账号显示的名称,例如
My Invoker Service Account
。
- 将 SERVICE_ACCOUNT_NAME 替换为 Google Cloud 项目中唯一的小写名称,例如
对于 Cloud Run,请向您的服务账号授予调用服务的权限:
gcloud run services add-iam-policy-binding SERVICE \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
替换
- 将 SERVICE 替换为您希望 Pub/Sub 调用的服务的名称。
- 将 SERVICE_ACCOUNT_NAME 替换为服务账号的名称。
- 将 PROJECT_ID 替换为 Google Cloud 项目 ID。
向服务账号授予对项目的访问权限,以便其能够完成对项目中资源的特定操作:
gcloud projects add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL --role=roles/run.invoker
替换
RESOURCE_ID:您的 Google Cloud 项目 ID。
PRINCIPAL:主账号(成员)的标识符,通常具有以下格式:PRINCIPAL_TYPE:ID,例如
user:my-user@example.com
。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
如需创建服务账号,请将以下内容添加到现有
.tf
文件中:如需向您的服务账号授予调用服务的权限,请将以下内容添加到现有
.tf
文件中:
创建 Pub/Sub 主题
对您的服务的请求由发布到 Pub/Sub 主题的消息触发,因此您需要创建一个主题:
控制台
访问 Google Cloud 控制台中的 Pub/Sub 主题页面。
点击创建主题。
为您的主题输入一个独一无二的名称,例如 MyTopic。
命令行
gcloud pubsub topics create TOPIC-NAME
将 TOPIC-NAME 替换为 Google Cloud 项目中唯一的主题名称。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
本部分介绍如何使用 Terraform 和 Google Cloud Platform 提供商提供的 google_pubsub_topic
资源在 Terraform 配置中定义服务。
将以下内容添加到现有的 .tf
文件中:
创建推送订阅并将其与服务账号相关联
创建 Pub/Sub 主题之后,您必须订阅服务以接收发送到主题的消息,并且必须将订阅与您为服务创建的服务账号相关联。 您可以使用 Google Cloud 控制台或 gcloud 命令行:
控制台
转到 Pub/Sub 主题页面。
点击您要订阅的主题。
点击创建订阅以显示订阅表单:
在此表单中执行以下操作:
订阅已完成。发布到该主题的消息现在会推送到您的服务中。
命令行
允许 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 SUBSCRIPTION-ID --topic TOPIC-NAME \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=SERVICE-ACCOUNT-NAME@PROJECT-ID.iam.gserviceaccount.com
替换
- 将 TOPIC-NAME 替换为之前创建的主题。
- 将 SERVICE-URL 替换为您在部署服务时提供的 HTTPS 网址。您可以使用
gcloud run services describe
命令并指定服务名称找到该网址:查找以domain
开头的返回行。 - 将 PROJECT-ID 替换为您的 Google Cloud 项目 ID。
--push-auth-service-account
标志激活 Pub/Sub 推送功能,以进行身份验证和授权请注意,确认时限设置为上限(600 秒)。
订阅已完成。发布到该主题的消息现在会推送到您的服务中。您可以使用以下命令将测试消息推送到主题:
gcloud pubsub topics publish TOPIC --message "hello"
将 TOPIC 替换为您创建的主题的名称。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
后续步骤
- 如需了解如何使用内部入站流量控制来限制入站流量,请参阅限制入站流量。
- 如需查看完整的示例应用,请参阅有关将 Pub/Sub 与 Cloud Run 搭配使用的教程。
- 如需查看使用 Pub/Sub 来驱动异步图片处理的示例,请参阅有关将 Cloud Storage 与 Cloud Run 搭配使用的教程。
- 如需详细了解 Pub/Sub,请参阅 Pub/Sub 文档。