GCloud AppEngine 任务执行返回 403

问题描述

在 Google AppEngine 上使用推送队列和灵活环境,当执行使用 backend 服务创建的任务(将在 default 服务上执行)时,我收到 403(禁止错误。任务被成功推入队列,在本地确认,但任务执行失败并记录:

INFO     2020-12-24 13:42:39,897 module.py:865] default: "POST /tasks/test-handler HTTP/1.1" 403 31
WARNING  2020-12-24 13:42:39,897 taskqueue_stub.py:2158] Task task2 Failed to execute. The task has no remaining retries. Failing permanently after 1 retries and 0 seconds

在本地和生产中都会发生同样的情况。但是,如果使用 cron 作业创建任务,则执行工作正常。我在 Go 1.11 中使用 dev_appserver.py 并具有以下 .yaml 定义:

# backend service
service: backend
runtime: go111
instance_class: F2

inbound_services:
- warmup
- default

handlers:
- url: /tasks/.*
  login: admin
  redirect_http_response_code: 301

# default app service
service: default
runtime: go111
instance_class: F2

inbound_services:
- warmup

handlers:
- url: /api/.*
  script: auto
  secure: always
  redirect_http_response_code: 301

初始 API 请求到达 /api 端点,然后使用以下方法成功推送队列消息:

t := taskqueue.NewPOSTTask(taskURL,url.Values{
    "testParam": {strconv.Itoa(testParam)},})

if _,err := taskqueue.Add(ctx,t,"test-queue"); err != nil {
    return ErrPublishingTaskToQueue
}

我的 queue.yaml 定义(实际上我还有更多):

total_storage_limit: 120M
queue:
- name: test-queue
  rate: 1/s
  bucket_size: 100
  max_concurrent_requests: 10
  retry_parameters:
      task_retry_limit: 1

如果任务不是通过 cron 作业创建的,为什么我会在任务执行时获得 403(禁止)状态的任何想法?关于这个问题的文档和现有资源没有多大帮助:/

解决方法

设法让它发挥作用。如果有人在 Google AppEngine 上的推送队列的任务执行中遇到 403 响应,请确保您设置了正确的目标服务。在上面的示例中,我在 target: backend 中缺少 queue.yaml

total_storage_limit: 120M
queue:
- name: test-queue
  rate: 1/s
  bucket_size: 100
  max_concurrent_requests: 10
  target: backend
  retry_parameters:
      task_retry_limit: 1

问题是任务是使用 default 服务创建的,默认情况下意味着它们命中 default 服务,但应该命中 backend 服务。不幸的是,default 服务也部署了所需的端点,所以我得到的是 403 而不是 404。

有关 target 字段的更多详细信息: https://cloud.google.com/appengine/docs/standard/python/config/queueref#target

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...