Для предотвращения внешнего неаутентифицированного вызова вы можете назначить свою функцию частной. Это очень легко сделать, разверните его с помощью --no-allow-unauthenticated
param
gcloud functions deploy my-function --no-allow-unauthenticated --trigger... -- region... --runtime...
Но теперь планировщик не может вызвать его. Теперь вам нужно выполнить 2 вещи
- Создать учетную запись службы с правильными ролями. Вы можете сделать это с помощью GUI или с помощью командной строки
# Create the service account
gcloud iam service-accounts create your-service-account-name
# Grant the role for calling the function
gcloud functions add-iam-policy-binding \
--member=serviceAccount:your-service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.com \
--role=roles/cloudfunctions.invoker your-function-name
С помощью GUI, если вы предоставите роль cloudfunctions.invoker
на уровне проекта, ваша учетная запись службы будет быть в состоянии получить доступ ко всем функциям в вашем проекте. С моей командной строкой я предоставляю роль только для определенной функции c. Вы можете сделать это через консоль, перейдя в список функций, выберите функцию (флажок) и нажмите show info panel
. Здесь у вас есть вкладка прав доступа
- Затем создайте планировщик с учетной записью службы
gcloud scheduler jobs create http your-job name --schedule="0 0 * * *" \
--uri=your-function-URI \
--oidc-service-account-email=your-service-account-name@YOUR_PROJECT_ID.iam.gserviceaccount.com
Если это не работает, это потому, что агент службы облачного планировщика не авторизован для создания токена с учетной записью службы.
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member=serviceAccount:service-[project-number]@gcp-sa-cloudscheduler.iam.gserviceaccount.com \
--role roles/cloudscheduler.serviceAgent