Я пытаюсь вызвать службу Cloud Run с использованием облачных задач, как описано в документации здесь .
У меня работает служба Cloud Run. Если я делаю сервис общедоступным, он ведет себя как положено.
Я создал облачную очередь и планирую облачную задачу с помощью локального сценария. Этот использует мой собственный аккаунт. Сценарий выглядит следующим образом:
from google.cloud import tasks_v2
client = tasks_v2.CloudTasksClient()
project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'
parent = client.queue_path(project, location, queue)
task = {
'http_request': {
'http_method': 'GET',
'url': url,
'oidc_token': {
'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
}
}
}
response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
Я вижу, что задача появляется в очереди, но она не выполняется и сразу же повторяется. Причина этого (путем проверки журналов) заключается в том, что служба Cloud Run возвращает ответ 401.
Мой собственный пользователь имеет роли «Создатель токена учетной записи службы» и «Пользователь учетной записи службы». У него нет явного «Cloud Tasks Enqueuer», но, поскольку я могу создать задачу в очереди, я предполагаю, что унаследовал необходимые разрешения. Учетная запись службы "my-service-account@my-project.iam.gserviceaccount.com" (которую я использую в задаче для получения токена OID C), помимо прочего, выполняет следующие роли:
- Enqueuer Cloud Tasks (хотя я не Не думаю, что это нужно, так как я создаю задачу со своей учетной записью)
- Cloud Tasks Runner Task *
- Cloud Tasks Viewer
- Service Token Creator (я) я не уверен, следует ли добавить это в мою учетную запись - ту, которая планирует задачу - или в учетную запись службы, которая должна выполнять вызов в Cloud Run)
- Пользователь учетной записи службы (здесь тоже)
- Cloud Run Invoker
Итак, я сделал подвох: я создал файл ключа для служебной учетной записи, загрузил его локально и олицетворял локально, добавив учетную запись в конфигурацию gcloud с файлом ключа. , Затем я запускаю
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://url_to_my_service
Это работает! (Кстати, это также работает, когда я переключаюсь обратно на свою учетную запись)
Финальные тесты: если я удаляю oidc_token
из задачи при создании задачи, я получаю ответ 403 от Cloud Run! Не 401 ... Если я удалю роль «Cloud Run Invoker» из служебной учетной записи и попытаюсь снова локально с помощью curl, я также получу 403 вместо 401.
Если я наконец сделаю Cloud Run служба общедоступна, все работает.
Итак, похоже, что облачной задаче не удается сгенерировать токен для учетной записи службы для правильной аутентификации в службе Cloud Run.
Чего мне не хватает?