Как запустить задание Cloud Scheduler с App Engine HTTP при защите IAP

У меня есть приложение Python в стандарте Google App Engine, которое защищено с помощью прокси-сервера Google Cloud Identity Aware (IAP).

Я хочу запускать часть своего приложения каждый день с помощью Cloud Scheduler. (Он вызывает API, выполняет вычисления и сохраняет результаты в Google Cloud Storage.)

Для этого я попытался запустить запрос POST на HTTP-сервере App Engine. пример URL: / refresh_data

При запуске задания я получаю следующую ошибку:

jsonPayload: {
status: "FAILED_PRECONDITION"
relativeUrl: "/refresh_data"
jobName: "..."
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
targetType: "APP_ENGINE_HTTP"
}

Я не могу найти никакой документации, относящейся к ошибке FAILED_PRECONDITION, поэтому я чувствую себя здесь как бы застрявшим.

В качестве альтернативы я попытался инициировать запрос POST для простого HTTP и предоставить уровень доступа владельца в IAP учетной записи службы, которую я использую для Cloud Scheduler. На этот раз я получаю следующее сообщение об ошибке:

 jsonPayload: {
 status: "UNAUTHENTICATED"
 @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
 jobName: "..."
 targetType: "HTTP"
 url: "https:.../refresh_data"
 }

Я действительно не понимаю, как это сделать ... Документация по Cloud Scheduler почти не задокументирован параметр HTTP App Engine, и ничего не задокументировано относительно использования IAP ...

Любая помощь приветствуется :)




Ответы (3)


Это темная сторона IAP. Я отправил этот отзыв в Google несколько месяцев назад. То же самое и с Pubsub: вы не можете активировать и защитить App Engine IAP от этого бессерверного продукта, даже если вы используете учетную запись службы с правильной авторизацией.

person guillaume blaquiere    schedule 03.09.2020
comment
хорошо ... большое спасибо, это супер полезно! есть ли у вас какой-либо другой альтернативный метод, который, по вашему мнению, я мог бы использовать вместо облачного планировщика? - person tim; 04.09.2020
comment
Облачный планировщик - подходящий инструмент для этого, но не для прямого вызова App Engine. Вместо этого вызовите функции или Cloud Run. Оттуда вы можете вызвать конечную точку App Engine через IAP. Однако сколько времени занимает процесс refresh_data? - person guillaume blaquiere; 04.09.2020
comment
Идеально, потому что у вас есть 9 минут тайм-аута с облачными функциями. Будьте осторожны, тайм-аут функции по умолчанию составляет 60 секунд, измените это значение по умолчанию при развертывании функции! - person guillaume blaquiere; 04.09.2020
comment
Я переместил свой код в облачную функцию, запускаемую pub / sub, и синхронизировал ее с Cloud Scheduler. Мне пришлось кое-что изменить, чтобы он заработал, но теперь он работает отлично! Спасибо ! - person tim; 10.09.2020
comment
Нет проблем с запуском службы AppEngine за IAP из Cloud Scheduler. Вам просто нужно использовать для этого специальный тип триггера - AppEngine HTTP, и он должен работать. Я попробовал это в своем проекте GCP, и это сработало. Я вижу, tim @, у вас возникла странная проблема FAILED_PRECONDITION, которая, я считаю, может быть вызвана несоответствием требований заголовков между сервером и триггером, а не IAP (кстати, вы пытались отключить IAP, чтобы убедиться, что он работает?). Не могли бы вы подробнее рассказать, на какую конечную точку вы пытались позвонить? @Тим - person Shrike; 09.04.2021

Вы можете проверить соответствующую документацию от IAP о том, как аутентифицироваться с помощью Учетная запись службы.

Всякий раз, когда вы используете Cloud Scheduler, запросы будут выполняться с его учетной записью службы, поэтому руководство, которому следует следовать, должно быть тем, которое указано выше, поскольку вы в основном пытаетесь аутентифицироваться программно, а не с помощью входа в Google.

При этом вам нужно будет сгенерировать токен OIDC перед отправкой запроса на конечную точку, защищенную IAP. Когда у вас есть токен OIDC, его необходимо включить в заголовок Authorization: Bearer.

person bhito    schedule 03.09.2020
comment
благодарю вас! Я видел эту документацию, но, поскольку она казалась довольно сложной для реализации (в отличие от крайней простоты IAP), я думал, что App Engine справится с подобными вещами за меня. Я попробую это реализовать. Вы пробовали это на своей стороне, и это сработало? - person tim; 04.09.2020

У меня была аналогичная проблема при обновлении моего приложения GAE с python 2.7 до python3 (стандарт). У меня такое же сообщение об ошибке, что и у вас (статус: FAILED_PRECONDITION), при выполнении моих предыдущих заданий cron.yaml, настроенных как задания облачного планировщика. И загрузка предыдущих файлов cron.yaml также не работала. Затем я обнаружил, что простое добавление конца '/' к URL-адресу исправляет это. Итак, cron вроде:

cron:
- description: competition participants pilot list update
  url: /daily1/
  schedule: every 8 hours from 05:00 to 21:00

работал после загрузки с облачным SDK:

gcloud app deploy cron.yaml --project my-gae-project

(и я забыл об этом) мне также пришлось:

gcloud services enable cloudscheduler.googleapis.com --project my-gae-project
person StaffanRolfsson    schedule 28.02.2021
comment
вау, хорошо. Я не тестировал это, потому что ответ от @guillaume blaquiere решил мою проблему, но защищено ли ваше приложение IAP? - person tim; 01.03.2021
comment
Нет простите. У меня было такое же сообщение об ошибке. И я редактировал выше, что мне также пришлось включить службу планировщика ... - person StaffanRolfsson; 01.03.2021