Я хочу сравнить Google Cloud Run с Google App Engine и Google Cloud Functions. Cloud Run Краткое руководство: сборка и развертывание кажется хорошей отправной точкой.
Учетные данные моего приложения по умолчанию слишком широки, чтобы их можно было использовать во время разработки. Я хотел бы использовать учетную запись службы, но не могу настроить учетную запись, позволяющую выполнить быстрый запуск без ошибок.
Какой наименее привилегированный набор предопределенных ролей я могу назначить учетной записи службы, которая должна выполнять эти команды без ошибок:
gcloud builds submit --tag gcr.io/{PROJECT-ID}/helloworld
gcloud beta run deploy --image gcr.io/{PROJECT-ID}/helloworld
Первая команда завершается с ошибкой (на первый взгляд ложной) при запуске через учетную запись службы с двумя ролями: Cloud Build Service Account
и Cloud Run Admin
. Я не запускал вторую команду.
Обновлено: ошибка не является ложной. Команда создает образ и копирует его в реестр контейнеров проекта, а затем не может распечатать журнал сборки на консоли (недостаточно прав).
Обновлено: я выполнил вторую команду. Это не удается с Permission 'iam.serviceaccounts.actAs' denied on {service-account}
. Я мог бы решить эту проблему, назначив роль Service Account User
. Но это позволяет команде развертывания действовать как учетная запись службы времени выполнения проекта, которая имеет роль по умолчанию. Создание служебной учетной записи с (фактически) ролями Editor
и Viewer
не намного лучше, чем использование моих учетных данных приложения по умолчанию.
Поэтому я должен изменить разрешения учетной записи службы времени выполнения. В документах Editor
Идентификация службы говорится о конфигурации наименее привилегированного доступа:
This changes the permissions for all services in a project, as well as Compute Engine and Google Kubernetes Engine instances. Therefore, the minimum set of permissions must contain the permissions required for Cloud Run, Compute Engine, and Google Kubernetes Engine in a project.
К сожалению, в документах не говорится, что это за разрешения или какой набор предопределенных ролей их охватывает.
Cloud Run
.Cloud Run Admin
для проекта$ gcloud config list
[core]
account = {service-account-name}@{project-id}.iam.gserviceaccount.com
disable_usage_reporting = True
project = {project-id}
[run]
region = us-central1
gcloud
Cloud Run API
→Container Registry
→Settings
Container Analysis API
в соответствии с инструкциями в документации по быстрому запуску.Dockerfile
gcloud builds submit --tag gcr.io/[PROJECT-ID]/helloworld
в сервисный аккаунт и повторно отправьте сборкуCloud Build Editor
в сервисный аккаунт и повторно отправьте сборкуStorage Object Admin
сервисного аккаунта на роль Storage Object Admin
и повторно отправьте сборкуError: (gcloud.builds.submit) HTTPError 403:
<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>
{service-account-name} does not have storage.objects.get access to
{number}.cloudbuild-logs.googleusercontent.com/log-{uuid}.txt.</Details>
</Error>
Storage Admin
имеет гораздо больше разрешений, чем роль Cloud Build Service Account
. Это меня удивило; устаревшая роль Cloud Build Editor
имеет «Редактировать доступ ко всем ресурсам».Editor
и Cloud Build Editor
из сервисного аккаунтаStorage Admin
в сервисный аккаунт и повторно отправьте сборкуCloud Build Service Account
(отсутствует доступ к файлу журнала)HTTP 403
→Cloud Build
в консоли разработчика; найти удачные сборки!History
→Container Registry
в консоли разработчика; найти изображения!На этом я думаю, что могу закончить Google Cloud Run Краткое руководство: сборка и развертывание. Но я не хочу продолжать с (кажущимися ложными) сообщениями об ошибках в моем процессе сборки.
Согласно https://cloud.google.com/cloud-build/docs/securing-builds/set-service-account-permissions
«Учетная запись службы Cloud Build» — Cloud Build выполняет ваши сборки, используя учетную запись службы, специальную учетную запись Google, которая выполняет сборки от вашего имени.
Чтобы вызвать отправить сборку gcloud --tag gcr.io/path
Редактировать: Пожалуйста, «Редактор Cloud Build» и «Просмотр» вашей служебной учетной записи, которая запускает сборку, это связано с текущей моделью авторизации Cloud Build.
Простите за неудобства.
После проб и ошибок я, наконец, обнаружил, что нам также нужен «Просмотрщик». Пожалуйста, попробуйте.
Я изменил набор ролей сервисного аккаунта на Cloud Build Editor
, Viewer
и Cloud Run Admin
. Не удалось выполнить команду сборки: gcloud builds submit --tag gcr.io/{project-id}/helloworld Creating temporary tarball [...] Uploading tarball of [...] ERROR: (gcloud.builds.submit) 403 Could not upload file [...] {service-account}.iam.gserviceaccount.com does not have storage.objects.create access to {project-id}_cloudbuild/source/1554944244.93-6c6779bcbc0744e28e36c9047542e6c4.tgz.
Команда не инициировала сборку.
Я вернулся к Cloud Build Service Account
и Cloud Run Admin
. Не удалось выполнить команду сборки: gcloud builds submit --tag gcr.io/try-cloud-run-237202/helloworld Creating temporary tarball [...] Uploading tarball of [...] Created [..] Logs are available at [...] ERROR: (gcloud.builds.submit) HTTPError 403: [...] {service-account}.iam.gserviceaccount.com does not have storage.objects.get access to {number}.cloudbuild-logs.googleusercontent.com/log-{uuid}.txt. [...]
С этими ролями сборка была запущена и выполнена успешно. Новый образ Docker находится в реестре контейнеров.
Наконец, я изменил набор ролей сервисных учетных записей на Cloud Build Service Account
, Viewer
и Cloud Run Admin
. Команда сборки выполнена успешно, распечатав журнал сборки, а не сообщение об ошибке.
Я удивлен, что «Редактор Cloud Build» + «Просмотрщик» не создали изображение? Я полагаю, что для развертывания в Cloud Run вам также нужны «Администратор Cloud Run» и «Пользователь учетной записи службы».
Cloud Run PM здесь:
Мы можем разбить это на два набора необходимых разрешений:
# build a container image
gcloud builds submit --tag gcr.io/{PROJECT_ID}/helloworld
Тебе понадобиться:
Cloud Build Editor
и Cloud Build Viewer
(согласно @wlhee)# deploy a container image
gcloud beta run deploy --image gcr.io/{PROJECT_ID}/helloworld
Вам нужно сделать две вещи:
Cloud Run Deployer
(если вы хотите изменить политику IAM, скажем, для публичного развертывания службы, вам понадобится Cloud Run Admin
).#1
gcloud projects add-iam-policy-binding PROJECT_ID \
--member = "serviceAccount:{service-account-name}@{project-id}.iam.gserviceaccount.com" \
--role = "roles/run.developer"
#2
gcloud iam service-accounts add-iam-policy-binding \
[email protected] \
--member = "serviceAccount:{service-account-name}@{project-id}.iam.gserviceaccount.com" \
--role = "roles/iam.serviceAccountUser"
Обновлено: Как уже отмечалось, последний предоставляет вашей учетной записи службы возможность actAs
учетной записи службы среды выполнения. Какая роль у этой служебной учетной записи, зависит от того, к чему ей нужно получить доступ: если единственная вещь, к которой имеет доступ Run/GKE/GCE, — это GCS, тогда дайте ей что-то вроде Storage Object Viewer
вместо Editor. Мы также работаем над удостоверениями для каждой службы, поэтому вы можете создать учетную запись службы и «переопределить» значение по умолчанию чем-то, что имеет наименьшие привилегии.
Как объяснялось выше, на этапе сборки регистрировались сообщения об ошибках, когда учетная запись службы имела роль
Cloud Build Editor
. Кроме того, 19 разрешений, назначенных ролиCloud Build Service Account
, включают в себя все 6 разрешений, назначенных ролиCloud Build Edtior
.