为什么我的服务帐户无法访问 GCP 项目?
Why is my Service Account Unable to Access GCP Projects?
与 Bitbucket 集成的服务帐户无法 list
项目:
gcloud projects list
#=>
Listed 0 items.
或set
$MY_PROJECT
:
gcloud config set project $MY_PROJECT
#=>
Updated property [core/project].
因为上面的输出紧跟这个警告:
WARNING: You do not appear to have access to project [$MY_PROJECT] or it does not exist
上面的警告与下面的输出相矛盾:
gcloud config list --format="value(core.project)"
#=>
$MY_PROJECT
是否缺少任何步骤或先决条件才能将此服务帐户正确授权给 list
和 set
$MY_PROJECT
?
我的 bitbucket-pipelines.yaml
文件:
name: Test google auth
image: google/cloud-sdk:latest
script:
- echo $KEY_FILE | base64 --decode --ignore-garbage > ~/google-key.json
- gcloud auth activate-service-account --key-file ~/google-key.json
- gcloud projects list
- gcloud config set project $MY_PROJECT
- gcloud container clusters get-credentials $MY_CLUSTER --region $REGION
services:
- docker
您为服务帐户设置了什么权限?您是否添加了以下权限?
resourcemanager.projects.get
resourcemanager.projects.list
检查 gcloud auth list
正在使用您的 Cloud SDK 的活动帐户,然后检查它是否对您的项目具有适当的权限。
如果您成功激活服务账号如下:
gcloud auth activate-service-account --key-file service-account-key.json
执行以下命令后,您可以看到它是活动的:
gcloud auth list
而且,获得零个项目
Listed 0 items.
执行以下操作后:
gcloud projects list
然后
确保将您的服务帐户作为成员添加到项目旁边的 Organization 并为其分配 Viewer 角色。
WARNING: You do not appear to have access to project [$PROJECT_ID] or it does not exist.
警告将出现除非存在至少一个授予包含resourcemanager.projects.get
权限的服务帐户的角色。
Google 云帐户和权限之间有一个额外的抽象层:角色。您不能直接向用户或服务帐户授予权限;您可以 仅 link 具有角色的用户和具有权限的角色。有关 GCP 角色的更多信息 here.
您需要:
更新至少一个与具有上述权限的服务帐户关联的自定义角色:
gcloud iam roles update $ROLE \
--add-permissions=resourcemanager.projects.get \
--project=$PROJECT_ID
#=>
description: $ROLE_DESCRIPTION
etag: . . .
includedPermissions:
. . .
- resourcemanager.projects.get
. . .
name: projects/$PROJECT_ID/roles/$ROLE
stage: . . .
title: $ROLE_TITLE
警告:确保在更新时在这里使用--add-permissions
标志,因为--permissions
标志将删除 自定义角色过去拥有的任何其他权限。
创建自定义角色:
gcloud iam roles create $ROLE \
--description="$ROLE_DESCRIPTION" \
--permissions=resourcemanager.projects.get \
--project=$PROJECT_ID \
--title='$ROLE_TITLE'
#=>
Created role [$ROLE].
description: $ROLE_DESCRIPTION
etag: . . .
includedPermissions:
- resourcemanager.projects.get
name: projects/$PROJECT_ID/roles/$ROLE
stage: . . .
title: $ROLE_TITLE
并将其与服务帐户相关联:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:$SERVICE_ACCOUNT \
--role=projects/$PROJECT_ID/roles/$ROLE
#=>
Updated IAM policy for project [$PROJECT_ID].
auditConfigs:
. . .
将服务帐户与已包含 resourcemanager.projects.get
权限的策划角色相关联,这已在上面讨论过。
如果您想知道哪些精选角色已经包含 resourcemanager.projects.get
权限并且不想制作复杂的 shell 循环,则可能更容易进入 here 和按 Permission:resourcemanager.projects.get
.
过滤所有角色
注意:如果您运行遇到问题,请务必阅读授予资源访问权限的要求here。
注意:如果您想了解 resourcemanager.projects.list
权限,它只能授予 组织 级别的角色:
gcloud iam roles create $ROLE \
--description="$ROLE_DESCRIPTION" \
--permissions=resourcemanager.projects.list \
--project=$PROJECT_ID \
--title='$ROLE_TITLE'
#=>
ERROR: (gcloud.iam.roles.create) INVALID_ARGUMENT: Permission resourcemanager.projects.list is not valid.
有关此限制的更多信息 here。
在终端中将新的 sv 帐户设置为活动:
gcloud config set account cloud-sql-sv-account@xyz.iam.gserviceaccount.com
然后使用此 sv 帐户进行身份验证:
gcloud auth activate-service-account --key-file=<path to json sv key>
与 Bitbucket 集成的服务帐户无法 list
项目:
gcloud projects list
#=>
Listed 0 items.
或set
$MY_PROJECT
:
gcloud config set project $MY_PROJECT
#=>
Updated property [core/project].
因为上面的输出紧跟这个警告:
WARNING: You do not appear to have access to project [$MY_PROJECT] or it does not exist
上面的警告与下面的输出相矛盾:
gcloud config list --format="value(core.project)"
#=>
$MY_PROJECT
是否缺少任何步骤或先决条件才能将此服务帐户正确授权给 list
和 set
$MY_PROJECT
?
我的 bitbucket-pipelines.yaml
文件:
name: Test google auth
image: google/cloud-sdk:latest
script:
- echo $KEY_FILE | base64 --decode --ignore-garbage > ~/google-key.json
- gcloud auth activate-service-account --key-file ~/google-key.json
- gcloud projects list
- gcloud config set project $MY_PROJECT
- gcloud container clusters get-credentials $MY_CLUSTER --region $REGION
services:
- docker
您为服务帐户设置了什么权限?您是否添加了以下权限?
resourcemanager.projects.get
resourcemanager.projects.list
检查 gcloud auth list
正在使用您的 Cloud SDK 的活动帐户,然后检查它是否对您的项目具有适当的权限。
如果您成功激活服务账号如下:
gcloud auth activate-service-account --key-file service-account-key.json
执行以下命令后,您可以看到它是活动的:
gcloud auth list
而且,获得零个项目
Listed 0 items.
执行以下操作后:
gcloud projects list
然后
确保将您的服务帐户作为成员添加到项目旁边的 Organization 并为其分配 Viewer 角色。
WARNING: You do not appear to have access to project [$PROJECT_ID] or it does not exist.
警告将出现除非存在至少一个授予包含resourcemanager.projects.get
权限的服务帐户的角色。
Google 云帐户和权限之间有一个额外的抽象层:角色。您不能直接向用户或服务帐户授予权限;您可以 仅 link 具有角色的用户和具有权限的角色。有关 GCP 角色的更多信息 here.
您需要:
更新至少一个与具有上述权限的服务帐户关联的自定义角色:
gcloud iam roles update $ROLE \ --add-permissions=resourcemanager.projects.get \ --project=$PROJECT_ID #=> description: $ROLE_DESCRIPTION etag: . . . includedPermissions: . . . - resourcemanager.projects.get . . . name: projects/$PROJECT_ID/roles/$ROLE stage: . . . title: $ROLE_TITLE
警告:确保在更新时在这里使用
--add-permissions
标志,因为--permissions
标志将删除 自定义角色过去拥有的任何其他权限。创建自定义角色:
gcloud iam roles create $ROLE \ --description="$ROLE_DESCRIPTION" \ --permissions=resourcemanager.projects.get \ --project=$PROJECT_ID \ --title='$ROLE_TITLE' #=> Created role [$ROLE]. description: $ROLE_DESCRIPTION etag: . . . includedPermissions: - resourcemanager.projects.get name: projects/$PROJECT_ID/roles/$ROLE stage: . . . title: $ROLE_TITLE
并将其与服务帐户相关联:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:$SERVICE_ACCOUNT \ --role=projects/$PROJECT_ID/roles/$ROLE #=> Updated IAM policy for project [$PROJECT_ID]. auditConfigs: . . .
将服务帐户与已包含
resourcemanager.projects.get
权限的策划角色相关联,这已在上面讨论过。如果您想知道哪些精选角色已经包含
过滤所有角色resourcemanager.projects.get
权限并且不想制作复杂的 shell 循环,则可能更容易进入 here 和按Permission:resourcemanager.projects.get
.
注意:如果您运行遇到问题,请务必阅读授予资源访问权限的要求here。
注意:如果您想了解 resourcemanager.projects.list
权限,它只能授予 组织 级别的角色:
gcloud iam roles create $ROLE \
--description="$ROLE_DESCRIPTION" \
--permissions=resourcemanager.projects.list \
--project=$PROJECT_ID \
--title='$ROLE_TITLE'
#=>
ERROR: (gcloud.iam.roles.create) INVALID_ARGUMENT: Permission resourcemanager.projects.list is not valid.
有关此限制的更多信息 here。
在终端中将新的 sv 帐户设置为活动:
gcloud config set account cloud-sql-sv-account@xyz.iam.gserviceaccount.com
然后使用此 sv 帐户进行身份验证:
gcloud auth activate-service-account --key-file=<path to json sv key>