Я пытаюсь развернуть облачную функцию, запускаемую хранилищем, и хотя этот процесс обычно отлично работает во многих проектах в тех же организациях и с аналогичными настройками, со вчерашнего дня у меня возникли проблемы с этим.
Я могу наблюдать следующую картину в во всех проектах GCP в нескольких организациях :
Категория A Если хотя бы одна функция, вызванная хранением, была развернута в проекте до вчерашнего дня, Я могу просто снова развернуть ту же самую функцию или новую функцию для этот проект, без проблем.
Категория B Если до вчерашнего дня в проекте не были развернуты функции, запускаемые из хранилища, Я не могу развернуть функцию, запускаемую из хранилища , независимо от того, развертываю ли я функции через Cloud Build или если я создаю простую функцию корзины через консоль GCP, даже если я просто использую пример кода, предложенный пользовательским интерфейсом, как есть, и ссылку на корзину по умолчанию в проекте.
Я не могу найти никаких других существенных различий в настройках между двумя категориями, в частности IAM и ACL, включенными API, и я убедился, что функция всегда создается в том же проекте, что и корзина, которая является ресурс триггера.
Ошибка при использовании gcloud functions deploy
$ - убранные имена
gcloud functions deploy $FUNCTION_NAME --region=us-central1 --source=https://source.developers.google.com/projects/$PROJECT_ID/repos/$REPO_NAME/moveable-aliases/$BRANCH_NAME/paths/$FUNCTION_NAME/src --trigger-resource=$API_PROJECT_ID-input --trigger-event=google.storage.object.finalize --timeout=540 --runtime=python37 --entry-point=main --memory=128MB --project=$API_PROJECT_ID --retry
покажет эту ошибку для проекта, попадающего в категорию B.
ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Failed to configure trigger GCS Bucket: $API_PROJECT_ID-input
То же самое в проектах категории А., как и ожидалось, работает нормально.
Ошибка при использовании Google Cloud Console
На странице Создать функцию ,
- Я выбираю
Cloud Storage
как Триггер
- Тип события : `Завершить / Создать *
- Как Bucket Я выбираю контейнер по умолчанию, например,
$API_PROJECT_ID.appspot.com
- Все остальное по умолчанию, включая предложенный пример кода
- SAVE
Развертывание не удастся для всех проектов категории B, но будет успешным для проектов категории A.
Сообщение о состоянии развертывания в пользовательском интерфейсе показывает следующую ошибку:
Deployment failure:
Failed to configure trigger GCS Bucket: $API_PROJECT_ID
Ошибка: учетная запись службы облачного хранилища не создана
Затем я начал сравнивать настройки и заметил, что в консоли GCP в разделе «Облачное хранилище»> «Настройки» только проект категории A имеет учетную запись службы облачного хранилища. Проекты категории B не имеют учетной записи службы облачного хранилища. Поэтому я попытался получить учетную запись из API:
https://cloud.google.com/storage/docs/json_api/v1/projects/serviceAccount/get
Как вы можете догадаться, я получу 200 OK
с соответствующим именем учетной записи службы облачного хранилища только для проектов в категории A , но для всех проектов в категории B I увидит эту ошибку с кодом 503
:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error"
}
],
"code": 503,
"message": "Backend Error"
}
}
Со вчерашнего дня я несколько раз пробовал разные проекты, ничего не изменилось.
Дополнительная информация и попытки решить проблему
Я следовал инструкциям на:
https://cloud.google.com/storage/docs/getting-service-account с помощью API Explorer на этой странице: https://cloud.google.com/storage/docs/json_api/v1/projects/serviceAccount/get
Я не уверен на 100%, связаны ли ошибки 503, отсутствие учетной записи службы и ошибки развертывания (код 13). Но IIRC, триггер хранилища GCF фактически основан на Pub / Sub, и для этого потребуется учетная запись службы, как указано в справочном тексте в консоли GCP в разделе Хранение> Настройки :
У каждого проекта есть связанная учетная запись службы облачного хранилища. Это используется для выполнения определенных фоновых действий: получение уведомлений PubSub и шифрование / дешифрование зашифрованных объектов KMS.
Я также прочитал совет относительно этой учетной записи службы здесь: https://cloud.google.com/storage/docs/projects#service-accounts
Я также пробовал следующие обходные пути:
- сравнил IAM между проектами категорий A и B, используя gsutil iam и консоль GCP
- сравнил ACL между проектами категорий A и B, используя gsutil acl
- развертывается вручную через API других тестовых корзин с отличающимися предопределенными Acl
- удалил корзину
$API_PROJECT_ID-input
и развернул снова без предопределенного Acl
- использовали стандартные группы проектов, которые были созданы автоматически, например,
$API_PROJECT_ID.appspot.com
- обновлены конфигурации развертывания Cloud Deployment Manager для проектов в категории B
- пытался отключить и включить несколько API-интерфейсов, но не сделал этого для большинства API-интерфейсов, чтобы избежать возникновения других проблем
- включил API Cloud Build для проектов в категории B (что интересно, только после этого унаследованные разрешения IAM другой учетной записи службы Cloud Build были добавлены в IAM корзины
$API_PROJECT_ID-input
)
- добавлена
Storage Object Creator
роль к учетной записи службы по умолчанию ($API_PROJECT_ID@appspot.gserviceaccount.com)