GCloud AppEngine 任务执行 returns 403
GCloud AppEngine Task execution returns 403
在 Google AppEngine 上使用推送队列和灵活的环境 当使用 default
服务创建的任务(将在 backend
服务上执行)时出现 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 响应而苦苦挣扎,请确保您设置了正确的目标服务。在上面的示例中,我在 queue.yaml
:
中缺少 target: backend
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
在 Google AppEngine 上使用推送队列和灵活的环境 当使用 default
服务创建的任务(将在 backend
服务上执行)时出现 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 响应而苦苦挣扎,请确保您设置了正确的目标服务。在上面的示例中,我在 queue.yaml
:
target: backend
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