Развертывание в 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).
Возможность запуска служб в качестве другой учетной записи службы будет доступна в следующем выпуске.