服务帐户需要哪些预定义 IAM 角色才能完成 Google 云 运行 快速入门:构建和部署?

What predefined IAM roles does a service account need to complete the Google Cloud Run Quickstart: Build and Deploy?

我想比较 Google Cloud 运行 Google App Engine 和 Google Cloud Functions。云 运行 Quickstart: Build and Deploy 似乎是一个很好的起点。

我的应用程序默认凭据过于宽泛,无法在开发过程中使用。我想使用服务帐户,但我很难配置一个可以无误地完成快速入门的帐户。

问题:

我可以分配给必须无错执行这些命令的服务帐户的最低权限的预定义角色集是什么:

gcloud builds submit --tag gcr.io/{PROJECT-ID}/helloworld
gcloud beta run deploy --image gcr.io/{PROJECT-ID}/helloworld

当 运行 通过具有两个角色的服务帐户时,第一个命令失败并出现(看似虚假的)错误:Cloud Build Service AccountCloud Run Admin。我没有运行第二个命令。

编辑:错误不是虚假的。该命令构建镜像并将其复制到项目的容器注册表,然后无法将构建日志打印到控制台(权限不足)。

编辑:我运行第二个命令。它失败并显示 Permission 'iam.serviceaccounts.actAs' denied on {service-account}。我可以通过分配 Service Account User 角色来解决这个问题。但这允许部署命令充当项目的 运行 时间服务帐户,该帐户具有 Editor 角色 by default。使用 ViewerEditor 角色(有效地)创建服务帐户并不比使用我的应用程序默认凭据好多少。

所以我应该更改 运行时间服务帐户权限。 Cloud Run Service Identity 文档对最低权限访问配置有这样的说法:

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.

遗憾的是,文档没有说明这些权限是什么,也没有说明哪些预定义角色涵盖了这些权限。

到目前为止我做了什么:

  1. 使用开发控制台创建新的 GCP 项目
  2. 使用开发控制台创建具有 Cloud Run Admin 角色的新服务帐户
  3. 使用开发控制台为服务帐户创建(并下载)密钥
  4. 为项目创建(并激活)gcloud 配置
$ gcloud config list
[core]
account = {service-account-name}@{project-id}.iam.gserviceaccount.com
disable_usage_reporting = True
project = {project-id}
[run]
region = us-central1
  1. 使用下载的密钥激活服务帐户
  2. 使用开发控制台启用 Cloud Run API
  3. 使用开发控制台启用Container RegistrySettingsContainer Analysis API
  4. 创建示例应用程序并Dockerfile 按照快速入门文档的说明
  5. 运行gcloud builds submit --tag gcr.io/[PROJECT-ID]/helloworld
    ...由于缺少云构建权限而失败
  6. Cloud Build Editor 角色添加到服务帐户并重新提交构建
    ...由于缺少存储权限而失败。没仔细看漏了什么
  7. Storage Object Admin 角色添加到服务帐户并重新提交构建
    ...由于缺少存储 存储桶 权限
  8. 而失败
  9. 将服务帐户的 Storage Object Admin 角色替换为 Storage 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>
  1. 检查可用角色集和项目自动创建的服务帐户。意识到 Cloud Build Service Account 角色比 Cloud Build Editor 拥有更多的权限。这让我很吃惊;遗留 Editor 角色有 "Edit access to all resources".
  2. 从服务帐户中删除 Cloud Build EditorStorage Admin 角色
  3. Cloud Build Service Account 角色添加到服务帐户并重新提交构建
    ...失败并出现相同的 HTTP 403 错误(缺少对日志文件的访问权限)
  4. 在开发控制台勾选Cloud BuildHistory;找到成功的构建!
  5. 在开发控制台勾选Container RegistryImages;查找图片!

至此我想我可以完成Google云运行Quickstart: Build and Deploy。但我不想在我的构建过程中继续处理(看似虚假的)错误消息。

根据https://cloud.google.com/cloud-build/docs/securing-builds/set-service-account-permissions

"Cloud Build Service Account" - Cloud Build 使用服务帐户执行您的构建,这是一个代表您执行构建的特殊 Google 帐户。

为了调用 gcloud 构建提交 --tag gcr.io/path

编辑: 请 "Cloud Build Editor" 和 "Viewer" 启动构建的服务帐户,这是由于当前的 Cloud Build 授权模型。

对于给您带来的不便,我们深表歉意。

云 运行 在这里私信:

我们可以将其分解为所需的两组权限:

# build a container image
gcloud builds submit --tag gcr.io/{PROJECT_ID}/helloworld

你需要:

  1. Cloud Build EditorCloud Build Viewer(根据@wlhee)
# deploy a container image
gcloud beta run deploy --image gcr.io/{PROJECT_ID}/helloworld

你需要做两件事:

  1. 授予您的服务帐户 Cloud Run Deployer 角色(如果您想更改 IAM 策略,比如公开部署服务,您需要 Cloud Run Admin)。
  2. 按照 Additional Deployment Instructions 授予该服务帐户部署您的服务帐户的能力
#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 \
  PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --member="serviceAccount:{service-account-name}@{project-id}.iam.gserviceaccount.com" \
  --role="roles/iam.serviceAccountUser"

编辑:如前所述,后者授予您的服务帐户actAs 运行时服务帐户的能力。该服务帐户的角色取决于它需要访问的内容:如果 Run/GKE/GCE 唯一访问的是 GCS,则给它类似 Storage Object Viewer 的东西,而不是编辑器。我们还在研究每个服务的身份,因此您可以创建一个服务帐户和 "override" 默认的具有最小权限的帐户。