您可以使用 Cloud Tasks 安全地将任务加入队列,由 Cloud Run 服务对其进行异步处理。典型用例包括:
- 通过意外生产突发事件保留请求
- 通过延迟工作来缓解流量高峰不对用户产生影响
- 通过将缓慢的后台操作委派给其他服务(如数据库更新或批处理)来加快用户响应速度
- 将调用率限制为支持数据库和第三方 API 等服务
本页介绍了如何将通过 HTTPS 协议安全推送的任务加入到私有 Cloud Run 服务队列。其中介绍了私有 Cloud Run 服务所需的行为、所需服务账号权限、任务队列创建和任务创建。
前期准备
在您使用的项目上启用 Cloud Tasks API。
部署 Cloud Run 服务以处理任务
要部署接受发送到任务队列的任务的服务,其部署服务的方式与任何其他 Cloud Run 服务相同。Cloud Run 服务必须返回 HTTP 200
代码,以在任务处理完成后确认任务已成功执行。
Cloud Tasks 会将任务作为 HTTPS 请求推送到此 Cloud Run 服务。
必须在配置的超时时间内获得对 Cloud Tasks 的响应结果。对于运行时间超过 Cloud Tasks 超时上限的工作负载,请考虑使用 Cloud Run 作业。
使用 Terraform 进行部署
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
要创建服务,请将以下内容添加到 .tf
文件:
创建任务队列
命令行
要创建任务队列,请使用以下命令:
gcloud tasks queues create QUEUE-ID
将 QUEUE-ID 替换为您要为任务队列指定的名称:该名称在您的项目中必须是独一无二的。如果系统提示您在项目中创建 App Engine 应用,请回复 y
来创建它。Cloud Tasks 将此用于队列:请确保您选择的位置与 Cloud Run 服务所用的位置相同。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
要创建任务队列,请将以下内容添加到 .tf
文件:
输入 terraform apply
以应用更改。
创建服务账号以与任务相关联
您必须创建一个与加入队列的任务相关联的服务账号。此服务账号必须具有 Cloud Run Invoker IAM 角色才能允许任务队列将任务推送到 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 替换为您希望 Cloud Tasks 调用的服务的名称。
- 将 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
文件:
创建服务账号:
对于 Cloud Run,请向您的服务账号授予调用服务的权限:
输入 terraform apply
以应用更改。
使用身份验证令牌创建 HTTP 任务
创建要发送到任务队列的任务时,请指定项目、位置、队列名称、之前创建并且要与任务相关联的服务账号的电子邮件地址、将运行该任务的私有 Cloud Run 服务的网址,以及您需要发送的任何其他数据。 您可以选择硬编码这些值,但项目 ID、位置和服务账号电子邮件地址等值可以从Cloud Run 元数据服务器动态检索。
如需详细了解任务请求正文,请参阅 Cloud Tasks API 文档。请注意,包含数据负载的请求必须使用 HTTP PUT
或 POST
方法。
将任务加入队列的代码必须具有执行此操作所需的 IAM 权限,例如 Cloud Tasks Enqueuer 角色。如果您在 Cloud Run 上使用默认服务账号,您的代码将拥有必要的 IAM 权限。
以下示例创建任务请求,其中还包括标头令牌的创建。示例中使用了 OIDC 令牌。要使用 OAuth 令牌,请在构造请求时将 OIDC 参数替换为相应语言的 OAuth 参数。
Python
请注意 requirements.txt
文件:
Java
请注意 pom.xml
文件:
Go
Node.js
请注意 package.json
文件: