7

我想将 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 AccountCloud Run Admin. 我还没有运行第二个命令。

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

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

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

这会更改项目中所有服务以及 Compute Engine 和 Google Kubernetes Engine 实例的权限。因此,最低权限集必须包含项目中 Cloud Run、Compute Engine 和 Google Kubernetes Engine 所需的权限。

不幸的是,文档没有说明这些权限是什么或哪些预定义角色涵盖了它们。

到目前为止我所做的:

  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 Registry→<code>Settings→<code>Container Analysis API
  4. 创建示例应用程序并Dockerfile按照快速入门文档的说明
  5. 运行gcloud builds submit --tag gcr.io/[PROJECT-ID]/helloworld
    ...由于缺少云构建权限而失败
  6. Cloud Build Editor角色添加到服务帐户并重新提交构建
    ...由于缺少存储权限而失败。我没有仔细注意丢失的内容。
  7. Storage Object Admin角色添加到服务帐户并重新提交构建
    ...由于缺少存储权限而失败
  8. 将服务帐户的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角色具有“对所有资源的编辑权限”。
  2. 从服务帐户中删除Cloud Build EditorStorage Admin角色
  3. Cloud Build Service Account角色添加到服务帐户并重新提交构建
    ...失败并出现相同的HTTP 403错误(缺少获取日志文件的访问权限)
  4. 在开发控制台中检查Cloud Build→<code>History;找到成功的构建!
  5. 在开发控制台中检查Container Registry→<code>Images;找图片!

至此,我想我可以完成 Google Cloud Run快速入门:构建和部署。但我不想在构建过程中继续处理(看似虚假的)错误消息。

4

2 回答 2

10

Cloud Run PM 在这里:

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

# 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. 按照附加部署说明授予该服务帐户部署您的服务帐户的能力
#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而不是 Editor。我们还在研究每个服务的身份,因此您可以创建一个服务帐户并用具有最低权限的东西“覆盖”默认值。

于 2019-04-11T14:57:33.363 回答
-2

根据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 Editor”和“Viewer”您开始构建的服务帐户,这是由于当前的Cloud Build授权模型。

带来不便敬请谅解。

于 2019-04-10T16:30:18.450 回答