Используя push-очереди и гибкую среду в Google AppEngine, я получаю ошибку 403 (Forbidden) при выполнении задачи (для выполнения в службе backend
), созданной с помощью службы default
. Задача успешно помещается в очередь, подтверждается локально, но выполнение задачи (задач) завершается с ошибкой с журналом:
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, выполнение работает нормально. Я использую dev_appserver.py
с Go 1.11 со следующими .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
Любые идеи, почему я получаю статусы 403 (Запрещено) при выполнении задачи, если задача не создается с помощью задания cron? Документация и существующие ресурсы по этому вопросу мало помогают :/
Точно, используя dev_appserver.py
, задача помещается в очередь, и при выполнении я получаю ответ 403.
Удалось заставить работать. Если кто-то борется с получением ответов 403 при выполнении задачи для очередей push в Google AppEngine, убедитесь, что вы установили правильный целевой сервис. В моем примере выше мне не хватало 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
Что вы имеете в виду под «То же самое происходит и локально, и на производстве». вы получаете 403, если вы выполняете это на своем локальном компьютере, когда он не развернут в механизме приложения?