Cloud Tasks 处理程序可以在具有外部 IP 地址的任何 HTTP 端点上运行,例如 GKE、Compute Engine,甚至是本地 Web 服务器。您可以通过可靠的、可配置的方式在上述任何服务中执行您的任务。
本页面演示了如何以编程方式创建基本 HTTP 目标任务 并将它们放置到 Cloud Tasks 队列。
对于具有 HTTP 目标的任务(而非不太常见的显式 App Engine 目标),您可以通过以下两种方式创建任务:
BufferTask
方法:如果您的队列设置为 缓冲区任务。队列必须具有队列级路由。对于大多数使用场景,这是最好的方法。此方法使用BufferTask
方法。CreateTask
方法:该方法较复杂。您必须 明确创建一个任务对象。如果队列中的任务有 具有不同的路由配置。在这种情况下,您可以在 任务级别且不能使用队列级别路由。此方法使用CreateTask
方法。
创建基本任务(BufferTask
方法)
本部分介绍如何通过发送 HTTP 请求来创建任务。您使用的该方法名为 BufferTask
。
限制
BufferTask
方法存在以下限制:
客户端库:客户端不支持
BufferTask
方法 库。RPC API:RPC API 不支持
BufferTask
方法。任务级路由:此方法不支持任务级路由。开始时间 以这种方式创建任务时,没有地方添加路由信息, 必须使用队列级路由(否则任务没有路由信息)。 如果您的队列尚未使用队列级别路由,请参阅 为 HTTP 任务配置队列级路由。
调用 BufferTask
方法
以下示例展示了如何通过向 Cloud Tasks API buffer
端点发送 HTTP POST
请求来创建任务。
curl
以下代码段显示了使用
使用 curl
的 BufferTask
方法:
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \
替换以下内容:
HTTP_METHOD
:请求的 HTTP 方法;用于 示例GET
或POST
。PROJECT_ID
:您的 Google Cloud 项目的 ID。 您可以在终端中运行以下命令来获取此信息:gcloud config get-value project
LOCATION
:您的队列的位置。QUEUE_ID
:队列的 ID。
Python
高级任务创建(CreateTask
方法)
本部分介绍了如何通过构建任务对象来创建任务。您可以使用 CreateTask
方法。
使用 CreateTask
方法创建任务时,您需要明确创建和定义任务对象。您必须指定执行相应进程的服务和处理程序
任务。
(可选)您可以将特定于任务的数据传递给处理程序。您还可以 微调 配置 用于执行任务,例如安排在未来某个时间执行该任务 或者限制任务失败时重试的次数 (请参阅高级配置)。
以下示例会调用 CreateTask
方法,以使用
Cloud Tasks 客户端库。
C#
Go
Java
请注意 pom.xml
文件:
Node.js
请注意 package.json
文件:
PHP
请注意 composer.json
文件:
Python
请注意 requirements.txt
文件:
Ruby
为 HTTP Target 处理程序身份验证设置服务账号
如果您拥有具有相应凭据的服务账号来访问处理程序,Cloud Tasks 可以调用需要身份验证的 HTTP Target 处理程序。
如果您已经拥有想要使用的服务账号,那就可以了。只需为其授予适当的角色即可。这些说明涵盖了专门为此函数新创建的服务账号。 用于 Cloud Tasks 身份验证的现有服务账号或新服务账号必须与 Cloud Tasks 队列位于同一项目中。
在 Google Cloud 控制台中,转到服务账号页面。
如有必要,请选择适当的项目。
点击创建服务账号。
在服务账号详情部分,为账号命名。通过 控制台会为账号创建相关的电子邮件账号名称。这就是您 引用该账号。您还可以添加账号说明。点击创建并继续。
在向此服务账号授予对项目的访问权限部分中,点击选择角色。搜索并选择 Cloud Tasks 排入队列。 此角色将向服务账号授予将任务添加到队列的权限。
点击 + 添加其他角色。
点击选择角色 搜索并选择 Service Account User(服务账号用户)。这个 角色允许服务账号授权队列在 使用服务账号的凭据来代表它
如果您的处理程序是 Google Cloud 的一部分,请向服务账号授予一个角色,并且该角色与在处理程序运行时访问的服务相关联。 Google Cloud 中的每项服务都需要不同的角色。对于 例如,要在 Cloud Run 上访问处理程序, Cloud Run Invoker 角色。您可以使用服务账号 或任何其他服务账号。
点击完成以完成服务账号的创建过程。
Cloud Tasks 本身必须拥有自己的服务账号,且该账号已获得 Cloud Tasks Service Agent
角色。这样,它就可以根据与 Cloud Tasks 服务账号关联的凭据生成标头令牌,然后向处理程序目标进行身份验证。在您启用 Cloud Tasks API 时,系统会自动创建 Cloud Tasks 服务账号并授予此角色,除非您已在 2019 年 3 月 19 日之前启用此功能,在这种情况下,您必须手动添加此角色。
将 HTTP 目标任务与身份验证令牌搭配使用
在 Cloud Tasks 和 HTTP 目标之间进行身份验证
要求进行此类身份验证的处理程序,Cloud Tasks 会创建
标头标记。此令牌是基于 Cloud Tasks Enqueuer
服务账号的凭据,其标识为该电子邮件地址 用于身份验证的服务账号必须是您的 Cloud Tasks 队列所在的项目。该请求包含
标头令牌通过 HTTPS 从队列发送到处理程序。您可以使用
一个 ID 令牌
或访问令牌。
ID 令牌通常应该用于 Google Cloud 上运行的任何处理程序,
例如 Cloud Run 函数或 Cloud Run主要的例外情况是
对于 *.googleapis.com
上托管的 Google API:这些 API 需要访问令牌。
您可以在队列级别或任务级别配置身份验证。如需在队列级别配置身份验证,请参阅创建 Cloud Tasks 队列。如果在队列级别配置了身份验证,此配置会覆盖任务级别的配置。如需在任务级别配置身份验证,请执行以下操作: 指定 ID (OIDC) 令牌 或访问 (OAuth)令牌 在任务中 本身。
BufferTask
方法
以下示例使用应用默认凭据进行身份验证,
使用 BufferTask
方法创建任务。
curl
curl -X HTTP_METHOD\ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID/tasks:buffer" \ -H "Authorization: Bearer ACCESS_TOKEN"
替换以下内容:
HTTP_METHOD
:请求的 HTTP 方法;用于 示例GET
或POST
。PROJECT_ID
:您的 Google Cloud 项目的 ID。 您可以在终端中运行以下命令来获取此信息:gcloud config get-value project
LOCATION
:您的队列的位置。QUEUE_ID
:队列的 ID。ACCESS_TOKEN
:您的访问令牌。您可以通过以下方式获取 在终端中运行以下命令:gcloud auth application-default login
gcloud auth application-default print-access-token
Python
在以下代码示例中,请提供您的身份验证令牌值。
CreateTask
方法
以下示例将 CreateTask
方法与
使用 Cloud Tasks 客户端库创建任务
包括创建标头令牌示例中使用了 ID 令牌。如需使用访问令牌,请将 OIDC 参数替换为适当的语言
OAuth 参数。
Go
Java
请注意 pom.xml
文件:
Node.js
请注意 package.json
文件:
Python
请注意 requirements.txt
文件:
提供您自己的 HTTP 目标任务处理程序
HTTP Target 任务处理程序与 App Engine 任务处理程序非常相似,但以下几项除外:
- 超时:对于所有 HTTP 目标任务处理程序,默认的超时值为 10 分钟,上限为 30 分钟。
- 身份验证逻辑:如果您要在目标服务中编写自己的代码来验证令牌,则应使用 ID 令牌。如需详细了解此方面信息,请参阅 OpenID Connect,尤其是验证 ID 令牌。
标头:HTTP 目标请求具有由队列设置的标头,其中包含 您的处理程序可以使用的任务特定信息。这些标头与在App Engine 任务请求中设置的标头类似但不同。 这些标题仅提供信息。它们不应该用作身份来源。
如果应用的外部用户请求中包含这些标头,则请将其替换为内部标头。唯一的例外情况是来自应用的已登录管理员的请求,管理员可以出于测试目的而设置标头。
HTTP 目标请求始终包含以下标头:
标题 说明 X-CloudTasks-QueueName
队列名称。 X-CloudTasks-TaskName
任务的“短”名称,或者系统为任务生成的唯一 ID(如果在创建时未指定任务名称)。这是整个任务名称中的 my-task-id
值,即 task_name =projects/my-project-id/locations/my-location/queues/my-queue-id/tasks/my-task-id
。X-CloudTasks-TaskRetryCount
此任务已经重试的次数。对于第一次尝试,该值为 0
。此数字包括由于 5XX 错误代码导致任务失败而从未到达执行阶段的尝试次数。X-CloudTasks-TaskExecutionCount
任务从处理程序收到响应的总次数。由于 Cloud Tasks 在收到成功响应后会删除任务,因此所有先前的处理程序响应都是失败的。此数字不包括由于 5XX 错误代码而导致的失败。 X-CloudTasks-TaskETA
任务的计划运行时间,以 1970 年 1 月 1 日以来的秒数指定。 此外,来自 Cloud Tasks 的请求可能包含以下标头:
标头 说明 X-CloudTasks-TaskPreviousResponse
来自上一次重试的 HTTP 响应代码。 X-CloudTasks-TaskRetryReason
重试任务的原因。
手动将 Cloud Tasks Service Agent 角色添加到 Cloud Tasks 服务账号
仅当您在 2019 年 3 月 19 日之前启用 Cloud Tasks API 的情况下,才需要执行此操作。
控制台
- 在 Google Cloud 项目设置页面上找到您的项目编号。
- 复制该编号。
- 打开 IAM 管理控制台页面。
- 点击授予使用权限。系统会打开授予访问权限屏幕。
在添加主账号部分,添加以下格式的电子邮件地址:
service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com
将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
在分配角色部分,搜索并选择 Cloud Tasks Service Agent。
点击保存。
gcloud
查找您的项目编号:
gcloud projects describe PROJECT_ID --format='table(projectNumber)'
将 PROJECT_ID 替换为您的项目 ID。
复制该编号。
使用您复制的项目编号向 Cloud Tasks 服务账号授予
Cloud Tasks Service Agent
角色:gcloud projects add-iam-policy-binding PROJECT_ID --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com --role roles/cloudtasks.serviceAgent
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 ID。PROJECT_NUMBER
:您的 Google Cloud 项目编号。
高级配置
您可以在任务中配置多个属性。有关 请查看任务列表 资源定义。
可自定义的属性示例:
- 命名:如果您选择为任务指定名称,则 Cloud Tasks 可以使用该名称来确保任务重复信息删除,但必要的处理可能会增加延迟时间。
- 安排:您可以将任务安排在未来某个时间执行。仅支持
对于
CreateTask
(不支持BufferTask
) - 重试配置:配置任务在失败时的重试行为。仅适用于
CreateTask
(不适用于BufferTask
)
后续步骤
- 参阅 RPC API 参考文档,详细了解 HTTP 目标任务。
- 如需详细了解 HTTP 目标任务,请参阅 REST API 参考文档。