Развертывание в Cloud Run с пользовательской учетной записью службы завершилось неудачно с ошибкой iam.serviceaccounts.actAs

Я создал пользовательский сервисный аккаунт travisci-deployer@PROJECT_ID.iam.gserviceaccount.com на мой проект и дал ему роль администратора Cloud Run:

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
   --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
   --role="roles/run.admin"

Затем я устанавливаю эту учетную запись службы в качестве идентификатора для моих команд gcloud:

gcloud auth activate-service-account --key-file=google-key.json

Но когда я побежал gcloud beta run deploy я получил сообщение об ошибке "Учетная запись службы по умолчанию Compute Engine" не iam.serviceAccounts.actAs разрешение:

gcloud beta run deploy -q "${SERVICE_NAME}" \
  --image="${CONTAINER_IMAGE}" \
  --allow-unauthenticated
Deploying container to Cloud Run service [$APP_NAME] in project [$PROJECT_ID] region [us-central1]
Deploying...
Deployment failed
ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs'
denied on service account 1075231960084-compute@developer.gserviceaccount.com

Мне это кажется странным (поскольку я не использую учетную запись службы GCE по умолчанию, хотя она используется приложением Cloud Run после развертывания приложения).

Итак 1075231960084-compute@developer.gserviceaccount.com учетная запись используется для вызова API, а не мой travisci-deployer@PROJECT_ID.iam.gserviceacount учетная запись службы настроена на gcloud?

Как я могу решить это?

6 ответов

Решение

Если мы подробно прочитаем документы для справочной страницы IAM для Cloud Run, которая находится здесь, мы найдем следующий текст:

Пользователю требуются следующие разрешения для развертывания новых служб или версий Cloud Run:

  • run.services.create а также run.services.update на уровне проекта. Обычно назначается через roles/run.admin роль. Это можно изменить на странице администрирования разрешений проекта.
  • iam.serviceAccounts.actAs для учетной записи службы времени выполнения Cloud. По умолчанию это PROJECT_NUMBER-compute@developer.gserviceaccount.com, Разрешение обычно назначается через roles/iam.serviceAccountUser роль.

Я думаю, что эти дополнительные шаги объясняют историю так, как вы ее видите.

Добавление ролей администратора Cloud Run и пользователей учетной записи службы в мою учетную запись службы решило эту проблему. См. Шаг 2 в документации здесь:https://cloud.google.com/run/docs/continuous-deployment

В соответствии с передовой практикой вы должны разрешать только определенные разрешения для запускаемого в облаке экземпляра.

Ссылка: https://cloud.google.com/run/docs/reference/iam/roles#additional-configuration .

Предположим, что у вас есть два сервисных аккаунта в GCP.

Один из них - Clound Runidentity service account/runtime service account.

Пусть это какidentity-cloudrun@project-id.iam.gserviceaccount.comи этой учетной записи службы не нужно назначать ей какое-либо разрешение, потому что это всего лишь идентификатор для запуска в облаке. Если вам нужен доступ этого облачного экземпляра к другому ресурсу GCP, вы можете добавить некоторые разрешения для этой учетной записи службы.

Другой — тот, который используется для развертывания вашего Cloud Run.

Пусть это какdeploy-cloudrun@project-id.iam.gserviceaccount.com

ДляDeployment Service account, вам нужно предоставитьCloud Run Admin permissionsк нему конкретноyour-cloudrun-instance. Таким образом, он не может получить доступ к другому экземпляру облачного запуска.

      gcloud run services add-iam-policy-binding your-cloudrun-instance \
--member="serviceAccount:deploy-cloudrun@project-id.iam.gserviceaccount.com" \
--role="roles/run.admin" \
--region=europe-west1

Кроме того, вам необходимо предоставитьiam.serviceAccounts.actAsразрешениеidentity service accountна ваш . Об этом говорится в документации.

      gcloud iam service-accounts add-iam-policy-binding \
identity-cloudrun@project-id.iam.gserviceaccount.com \
--member="serviceAccount:deploy-cloudrun@project-id.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"

Таким образом, вы можете развернуть свой облачный запуск, как показано ниже, с помощью вашего .

Примечание. На практике следует использовать федерацию удостоверений рабочей нагрузки вместо deployment service accountнапрямую.

      gcloud run deploy your-cloudrun-instance \
--image="us-docker.pkg.dev/cloudrun/container/hello" \
--service-account="identity-cloudrun@project-id.iam.gserviceaccount.com"

Вам необходимо добавить роль «Пользователь учетной записи службы» в свою учетную запись службы :

Хотя вы можете устранить эту конкретную ошибку, предоставив учетной записи разрешение действовать в качестве служебной учетной записи Compute Engine по умолчанию, это противоречит рекомендациям «лучших практик» :

По умолчанию службы Cloud Run запускаются как учетная запись службы Compute Engine по умолчанию. Однако Google рекомендует использовать управляемую пользователем учетную запись службы с минимальным набором разрешений. Узнайте, как развернуть службы Cloud Run с управляемыми пользователями учетными записями служб, в документации по удостоверению службы Cloud Run.

Вы можете указать, какое удостоверение учетной записи службы будет использовать развертывание Cloud Run, например:

      gcloud run deploy -q "${SERVICE_NAME}" \
  --image="${CONTAINER_IMAGE}" \
  --allow-unauthenticated \
  --service-account "${SERVICE_ACCOUNT_EMAIL}"

В настоящее время в бета-версии все службы Cloud Run работают в качестве учетной записи по умолчанию для вычислений (так же, как учетная запись службы по умолчанию для Google Compute Engine).

Возможность запуска служб в качестве другой учетной записи службы будет доступна в следующем выпуске.

Другие вопросы по тегам