Я хочу развернуть облачную функцию Google без публичного доступа. Учетная запись службы должна иметь возможность вызывать функцию с наименьшими разрешениями - для использования внешним сервером.
Я создал учетную запись службы, добавил привязки и загруженные ключи:
gcloud iam service-accounts create <NAME> --project <PROJECT> --description <DESCRIPTION>
gcloud beta functions add-iam-policy-binding <FUNCTION> --region europe-west1 --member serviceAccount:<EMAIL> --role roles/cloudfunctions.invoker
gcloud iam service-accounts keys create --iam-account <EMAIL> <KEYFILE>
Когда я вызываю функцию с ролью invoker, происходит сбой:
gcloud auth activate-service-account <EMAIL> --key-file <KEYFILE>
gcloud beta functions call <FUNCTION> --region=europe-west1 --data '{}'
ERROR: (gcloud.beta.functions.call) ResponseError: status=[403], code=[Forbidden], message=[The caller does not have permission]
Однако, когда я переключаюсь на своего пользователя, добавляю роль roles/cloudfunctions.developer
, переключаюсь обратно на учетную запись службы, вышеописанное работает:
gcloud config set account <USER>
gcloud beta functions add-iam-policy-binding <FUNCTION> --region europe-west1 --member serviceAccount:<EMAIL> --role roles/cloudfunctions.developer
gcloud auth activate-service-account <EMAIL> --key-file <KEYFILE>
gcloud beta functions call <FUNCTION> --region=europe-west1 --data '{}'
Success!
- Это действительно удивляет меня, я думал, что роль призывателя должна быть достаточной. Чего мне здесь не хватает?
Я хотел использовать токен для доступа к функции через curl, но это вообще не работает, ни как вызывающий, ни как разработчик:
echo $(GOOGLE_APPLICATION_CREDENTIALS=<KEYFILE> gcloud auth application-default print-access-token) > <TOKENFILE>
curl -H "Authorization: Bearer $(cat <TOKENFILE>" <FUNCTIONURL>
→ 401 Unauthorized as HTML page
В чем здесь проблема?
Спасибо за любую помощь! Бест Борис