Google cloud platform 无法将作为服务帐户部署到google云运行

Google cloud platform 无法将作为服务帐户部署到google云运行,google-cloud-platform,google-cloud-run,Google Cloud Platform,Google Cloud Run,我正在努力为服务帐户启用部署到云运行。我的逻辑是这样的: gcloud身份验证激活服务帐户\ 云端-deployer@my-project.iam.gserviceaccount.com\ --key file=my-project-123213.json gcloud运行部署我的项目操作\ --图像“gcr.io/my project/my project action:dev”\ --计划我的计划\ --冗长调试\ --美国中部地区1\ --允许未经验证的\ --平台管理 这在以下情况下失

我正在努力为服务帐户启用部署到云运行。我的逻辑是这样的:

gcloud身份验证激活服务帐户\
云端-deployer@my-project.iam.gserviceaccount.com\
--key file=my-project-123213.json
gcloud运行部署我的项目操作\
--图像“gcr.io/my project/my project action:dev”\
--计划我的计划\
--冗长调试\
--美国中部地区1\
--允许未经验证的\
--平台管理
这在以下情况下失败:

HttpForbiddenError: HttpError accessing <https://us-central1-run.googleapis.com/apis/serving.knative.dev/v1/namespaces/my-project/services/my-project-action?alt=json>: response: <{'status': '403', 'content-length': '126', 'x-xss-protection': '0', 'x-content-type-options': 'nosniff', 'transfer-encoding': 'chunked', 'vary': 'Origin, X-Origin, Referer', 'server': 'ESF', '-content-encoding': 'gzip', 'cache-control': 'private', 'date': 'Wed, 01 Jan 2020 23:08:29 GMT', 'x-frame-options': 'SAMEORIGIN', 'alt-svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000', 'content-type': 'application/json; charset=UTF-8'}>, content <{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}
>
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission
HttpForbiddenError:HttpError访问:响应:,内容
错误:(gcloud.run.deploy)权限\u被拒绝:调用方没有权限
我已按照我的服务帐户的步骤操作。例如,它有项目级的
角色/run.admin
角色/iam.serviceAccountUser
。我也尝试过为项目提供
roles/editor
roles/owner
,但结果相同。我可以在我的
12321312123上看到-compute@developer.gserviceaccount.com
云计算运行的用户-deployer@my-project.iam.gserviceaccount.com是服务帐户用户

如果使用
gcloud auth login
进行身份验证,则可以使用相同的deploy命令进行部署

使用
云运行-deployer@my-project.iam.gserviceaccount.com
和相同的身份验证方法,我能够将新的docker映像推送到容器注册表,因此我认为身份验证过程可以工作,但我缺少一些权限或cloud run deploy的某些内容


顺便说一句,我是从
cloudsdk
docker image部署的。

我试图重现这个问题,我可以说这对我很有效。与谷歌云中的其他服务一样,谷歌云运行的问题在于它们使用服务标识

在执行过程中,云运行修订使用服务帐户作为其标识。这意味着,当您的代码使用Google云客户端库时,它会自动从当前云运行版本的运行时服务帐户获取并使用凭据。此策略称为“应用程序默认凭据”

如上所述,默认情况下:

云计算运行修订版正在使用计算引擎默认服务帐户(项目编号-compute@developer.gserviceaccount.com),它具有项目>编辑器IAM角色。这意味着默认情况下,您的云运行修订版具有对Google云项目中所有资源的读写访问权限

这意味着如果愿意,您可以使用计算引擎默认服务帐户进行部署。还建议通过使用更受限制的IAM角色向每个云运行服务授予更细粒度的权限

如果您想创建一个新的服务帐户并将其用作将容器部署到Google Cloud Run的帐户,您需要:

  • 使用您在问题中提到的创建服务帐户。一般来说,您需要:

    • 角色/run.admin提供
      run.services.create
      run.services.update
    • 角色/iam.serviceAccountUser提供
      iam.serviceAccounts.actAs
  • 最后一个是最重要的。由于您希望使用非默认服务标识,因此帐户或部署者必须对正在部署的服务帐户具有
    iam.servicecomports.actAs
    权限,如您所见

  • 一旦您的服务帐户具有此权限,您就可以使用提供的命令使用服务帐户(非默认标识)部署新服务,但要添加
    --service account
    标志,如图所示


  • 它应该与
    gcloud run deploy
    配合使用,但如果不能,您也可以尝试
    gcloud beta run deploy

    您可以查看有关
    --service account
    标志的更多信息,但概括起来:

    与服务修订相关联的IAM服务帐户的电子邮件地址。服务帐户表示正在运行的修订的标识,并确定该修订具有哪些权限如果未提供,修订版将使用项目的默认服务帐户。


    我希望能有所帮助。

    我想总结一下我在同一主题上的奋斗

    在我的例子中,这有点不同,因为我也使用云SQL。关键是错误是一样的

    用于部署的服务帐户需要具有所有必需的权限

    最基本的是在文档中,
    云运行管理
    服务帐户用户

    但是,在我使用云SQL的情况下,还需要
    云SQL查看器
    角色

    这个故事的难点在于,它总是显示为缺少
    gcloud.run.deploy

    Cloud-SQL-on-Cloud-run权限不足 在将Postgres数据库迁移到Google之后,我在构建过程中立即遇到了这个错误。鉴于@spicydog的回答给出了很好的建议,下面是我对这个问题的具体解决方案

    发生这种情况的原因是,我还没有向我们的云构建和云运行服务帐户授予使用谷歌新Postgres数据库的正确权限角色

    授予正确的
    IAM
    角色的步骤 该解决方案的要点是,如果您使用的是文档中建议的默认值,那么您需要向至少两个服务帐户添加角色

    1.将
    云SQL客户端
    角色添加到默认的云运行服务帐户 我的问题是,我的默认云运行服务帐户缺少相应的权限。从文档中:

    云运行(完全管理)使用服务帐户来授权您与云SQL的连接。此服务帐户必须具有正确的IAM权限才能成功连接。除非
      gcloud run deploy my-project-action \
      --image "gcr.io/my-project/my-project-action:dev" \
      --project my-project \
      --verbosity debug \
      --region us-central1 \
      --allow-unauthenticated \
      --platform managed \
      --service-account [SERVICE_ACCOUNT]