【问题标题】:Cloud build permission denied when deploy to cloud run with "--set-sql-instance" argument使用“--set-sql-instance”参数部署到云运行时,云构建权限被拒绝
【发布时间】:2025-11-29 11:30:01
【问题描述】:

我正在尝试配置构建 ma​​ven springboot 项目然后部署到云运行的云构建触发器。当我没有指定要连接的云 sql 实例时,我遇到了一个问题,但是当我添加 "--set-cloudsql-instances", "${_DATABASE_CONNECTION_NAME}" 作为参数之一时,它会在云构建中引发错误,如下所示:

Step #1: ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: The caller does not have permission
Finished Step #1
ERROR
ERROR: build step 1 "gcr.io/cloud-builders/gcloud" failed: exit status 1

以下是我的cloudbuild.yml

steps:
  - name: 'gcr.io/kaniko-project/executor:latest'
    args:
      - --destination=gcr.io/$PROJECT_ID/${_IMAGE_NAME}
      - --cache=true
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      "beta", "run",
      "deploy", "${_SERVICE_NAME}-${_PROFILE}",
      "--image", "gcr.io/${PROJECT_ID}/${_IMAGE_NAME}",
      "--region", "${_REGION}",
      "--platform", "managed",
      "--set-cloudsql-instances", "${_DATABASE_CONNECTION_NAME}",
      "--allow-unauthenticated",
      "--set-env-vars", "SPRING_PROFILES_ACTIVE=${_SPRING_PROFILE},DATABASE_CONNECTION_NAME=${_DATABASE_CONNECTION_NAME},DATABASE_NAME=${_DATABASE_NAME},DATABASE_USERNAME=${_DATABASE_USERNAME},DATABASE_PASSWORD=${_DATABASE_PASSWORD},MINIO_ACCESS_KEY=${_MINIO_ACCESS_KEY},MINIO_SECRET_KEY=${_MINIO_SECRET_KEY},MINIO_HOSTNAME=${_MINIO_HOSTNAME},MINIO_PORT=${_MINIO_PORT}"
    ]
images:
  - gcr.io/${PROJECT_ID}/${_IMAGE_NAME}

我已经为服务帐户设置了角色/权限如下:

  • {PROJECT_ID}-compute@developer.gserviceaccount.com:编辑,Cloud Sql 客户端
  • <Cloud run service agent>:Cloud Run 服务代理,Cloud SQL 客户端
  • <Cloud Build SA>:Cloud Build SA,Cloud Run 管理员

My Cloud Run 服务也使用默认服务帐户作为其 SA

【问题讨论】:

  • 手动运行命令是否有效?
  • @guillaumeblaquiere 我不确定本地,但使用云运行控制台页面进行部署,它可以工作
  • @guillaumeblaquiere 更新:我也可以在本地部署它,也可以从云运行控制台手动部署
  • @JohnHanley 1) 我应该授予什么云 sql 权限? (我试过 Cloud SQL Admin 还是不行) 2) 只是为了确保默认的云运行 SA 只有Cloud Run Service Agent 角色对吗?
  • 1) 您需要cloudsql.instances.connectcloudsql.instances.get 角色roles/cloudsql.client(Cloud SQL 客户端)的权限。 2) 我不记得默认情况下将 Cloud Run 服务代理角色设置为什么。 3) 您没有说明您正在使用 Cloud SQL 做什么,因此您可能需要更多权限。从roles/cloudsql.editor 开始,然后在一切正常后向下调整。查看文档以了解 Cloud SQL 权限:cloud.google.com/sql/docs/mysql/project-access-control

标签: google-cloud-platform google-cloud-sql google-cloud-build google-cloud-run


【解决方案1】:

我正在使用服务帐户来部署带有 sql 连接的云运行功能。我发现服务帐号需要以下权限:

  • serviceusage.quotas.get
  • serviceusage.services.get
  • serviceusage.services.list

【讨论】:

    【解决方案2】:

    确保您还为 Cloud Build 服务帐号指定了 iam.serviceAccountUser 角色,允许它在构建期间模拟 Cloud Run 运行时服务帐号。

    gcloud iam service-accounts add-iam-policy-binding
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      --member="serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com"
      --role="roles/iam.serviceAccountUser"
    

    请参阅Cloud Run deployment permissions 了解更多信息。

    【讨论】:

    • 我遇到了这个异常:Policy modification failed. For a binding with condition, run "gcloud alpha iam policies lint-condition" to identify issues in condition. ERROR: (gcloud.iam.service-accounts.add-iam-policy-binding) INVALID_ARGUMENT: The member 158882674634@cloudbuild.gserviceaccount.com is of an unknown type. Please set a valid type prefix for the member.
    • 我现在不确定,请尝试关注我链接的文档,它包含更多信息,我不想尝试将整个内容复制/粘贴到答案中。
    • @hackineachk - 该错误表示 Cloud Build SA 中的拼写错误。需要在前面加上serviceAccount:--member=serviceAccount:158882674634@cloudbuild.gserviceaccount.com
    • Travis - 您的答案中缺少serviceAccount:。除此之外,您的答案是正确的。 --member=serviceAccount:158882674634@cloudbuild.gserviceaccount.com
    • @TravisWebb 对我仍然不起作用。同样的错误:ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: The caller does not have permission