我正在努力为服务帐户启用到云运行的部署。我的逻辑看起来像:
gcloud auth activate-service-account \
cloud-run-deployer@my-project.iam.gserviceaccount.com \
--key-file=my-project-123123213.json
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
此操作失败:
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
我已经为我的服务帐户执行了https://cloud.google.com/run/docs/reference/iam/roles#additional-configuration步骤。例如。它具有项目级别roles/run.admin
和roles/iam.serviceAccountUser
。我也尝试为项目提供roles/editor
或roles/owner
,但结果相同。我可以在123213123123-compute@developer.gserviceaccount.com
用户上看到cloud-run-deployer@my-project.iam.gserviceaccount.com
是服务帐户用户。
如果我使用gcloud auth login
进行身份验证,则可以使用相同的deploy命令进行部署。
使用cloud-run-deployer@my-project.iam.gserviceaccount.com
和相同的auth方法,我能够将新的docker映像推送到容器注册表,因此我认为auth进程有效,但是我缺少一些权限或某些用于云运行部署的权限。 / p>
顺便说一句,我正在从cloud-sdk
Docker映像进行部署。
答案 0 :(得分:2)
我试图重现该问题,可以说这对我有用。与Google Cloud中的其他服务一样,Google Cloud Run的问题在于它们使用服务身份。
在执行期间,Cloud Run修订版使用服务帐户作为其标识。这意味着,当您的代码使用Google Cloud客户端库时,它将自动从当前Cloud Run修订版的运行时服务帐户获取和使用凭据。此策略称为“应用程序默认凭据”。
如here所述,默认情况下:
Cloud Run修订版使用 Compute Engine默认服务帐户(PROJECT_NUMBER-compute@developer.gserviceaccount.com),该帐户具有“项目”>“编辑器” IAM角色。这意味着默认情况下,您的Cloud Run修订版具有对Google Cloud项目中所有资源的读写访问权限。
这意味着如果需要,您可以使用计算引擎默认服务帐户进行部署。还建议通过assigning dedicated service accounts使用受限制的IAM角色为每个Cloud Run服务授予更精细的权限。
如果您想创建一个新的服务帐户并将其用作将容器部署到Google Cloud Run的帐户,则需要:
使用您在问题中提到的permissions necessary to do deployments创建一个服务帐户。通常,您将需要:
run.services.create
和run.services.update
。iam.serviceAccounts.actAs
最后一个是最重要的。由于您要使用非默认服务身份,因此帐户或部署者必须对正在部署的服务帐户具有iam.serviceAccounts.actAs
权限,如您所见here. >
--service-account
标志,如图{{3}所示} 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]
它应该与gcloud run deploy
一起使用,但如果不行,您也可以尝试gcloud beta run deploy
。
您可能会看到有关--service-account
标志here:的更多信息,但总而言之:
与服务修订版关联的IAM服务帐户的电子邮件地址。服务帐户代表正在运行的修订的身份,并确定该修订具有什么权限。 如果未提供,则修订将使用项目的默认服务帐户。
我希望这会有所帮助。
答案 1 :(得分:1)
我想总结一下我在同一主题上的努力。
就我而言,这有点不同,因为我也使用Cloud SQL。关键是错误是相同的。
用于部署的服务帐户必须具有所有必需的权限。
最基本的文档在文档Cloud Run Admin
和Service Account User
中。
但是,在我使用Cloud SQL的情况下,Cloud SQL Viewer
角色也是必需的。
这个故事的难点在于,它总是显示为缺少gcloud.run.deploy
答案 2 :(得分:0)
将Postgres数据库迁移到Google之后,我在构建过程中立即遇到了此错误。鉴于@spicydog的回答给出了出色的建议,这是我针对该问题的具体解决方案。
之所以发生这种情况,是因为我尚未将使用Google上新的Postgres数据库的正确权限角色授予我们的云构建和云运行服务帐户。
IAM
角色的步骤该解决方案的要点是,如果您使用的是文档建议的默认设置,则至少需要向两个服务帐户中添加角色。
Cloud SQL Client
个角色添加到您的默认云运行服务帐户中我的问题是我缺少默认云运行服务帐户的适当权限。从文档中:
Cloud Run(完全托管)使用服务帐户来授权您与Cloud SQL的连接。此服务帐户必须具有正确的IAM权限才能成功连接。除非另行配置,否则默认服务帐户的格式为PROJECT_NUMBER-compute@developer.gserviceaccount.com。
在两个不同项目中连接资源时,请确保两个项目都启用了正确的IAM角色,并为服务帐户赋予了正确的权限。
确保您的服务的服务帐户具有以下IAM角色之一:
- Cloud SQL Client(首选)
- Cloud SQL编辑器
- Cloud SQL管理员
因此,我按照他们的指示,将Cloud SQL Client
角色添加到了我的${PROJECT_NUMBER}-compute@developer.gservice.com
服务帐户中。
Cloud SQL Admin
个角色添加到您的云构建服务帐户中手指越过,建立前进,没有estábien!由于@spicydog似乎指示两个服务帐户需要角色,因此我将Cloud SQL Admin
角色添加到了我的云构建服务帐户${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com
此处docs介绍了如何向用户添加角色。他们的前端是卓越的恕我直言。
其他利用的东西: