谷歌云平台服务帐号无法访问项目

Posted

技术标签:

【中文标题】谷歌云平台服务帐号无法访问项目【英文标题】:Google Cloud Platform Service Account is Unable to Access Project 【发布时间】:2020-03-03 03:16:15 【问题描述】:

我遇到以下警告:

警告:您似乎无权访问项目 [$PROJECT] 或它不存在。

在本地运行以下命令后:

    激活并设置服务帐号:

    gcloud auth activate-service-account \
    $SERVICE_ACCOUNT \
    --key-file=key.json
    
    #=>
    
    Activated service account credentials for: [$SERVICE_ACCOUNT]
    

    选择$PROJECT作为上述服务帐号:

    gcloud config set project $PROJECT
    
    #=>
    
    Updated property [core/project].
    WARNING: You do not appear to have access to project [$PROJECT] or it does not exist.
    

我自己的 GCP 帐户与以下角色相关联:

App 引擎管理员 Cloud Build 编辑器 Cloud Scheduler 管理员 存储对象创建器 存储对象查看器

为什么这个服务账号不能set$PROJECT?是否有我缺少的角色或权限?

【问题讨论】:

我在尝试gcloud config set project my-project 时看到了同样的情况。我昨天使用的密钥运行良好,我没有对 IAM 进行任何更改。我还验证了我正在使用的密钥的 ID 是在控制台中列出的服务帐户中指定的。 值得注意的是,这是一个警告,而不是错误。尽管收到您详细说明的警告,但我仍然可以成功使用有问题的密钥。收到警告后与 GCP 交互时,您的密钥是否有效? @eversMcc 是对的。它最终只是一个错误,并且由于与我的gcloud app deploy 命令完全不同的原因而无法正常工作。 【参考方案1】:

此问题的解决方案可能是通过单击启用在您的 Google Cloud Console here 中启用 Cloud Resource Manager API。

【讨论】:

这个解决方案比我选择的答案更适合我。 @bryan 我认为这是正确的答案。 正确答案!【参考方案2】:

我认为这是一条错误的警告信息。尽管我的服务帐户对我的 GCP 项目具有权限并且可以成功执行必要的操作,但我在我的服务帐户上看到了相同的警告消息。

由于不相关的问题,您可能会看到此错误。就我而言,我试图从持续集成环境 (Circle CI) 部署到 AppEngine,但我没有启用 App Engine Admin API。启用 API 后,我就能够成功部署。

【讨论】:

你是对的 - 它最终只是一个错误,并且由于我的 gcloud app deploy 命令完全不同的原因而无法正常工作 同意并确认 - 这通常发生在某些内容无效并且仅显示此奇怪的通用错误消息时。当环境变量无效或丢失时,通常会发生这种情况。 就我而言,事实证明我提供了错误的项目名称。 呸,这也发生在我身上!此警告之后的错误才是真正的问题。【参考方案3】:

我在开始使用 Google 云平台时遇到了这个错误。

问题是我配置/设置了一个不存在的项目 (my-kube-project) 使用以下命令作为我的默认项目:

gcloud config set project my-kube-project

我是这样解决的

我必须先列出我现有的项目:

gcloud projects list

然后我复制了我想要的项目的ID,这次再次运行命令:

gcloud config set project gold-magpie-258213

而且效果很好。

注意:您不能更改项目的ID编号的ID,您只能更改名称 >.

就是这样。

我希望这会有所帮助

【讨论】:

这对我有用!【参考方案4】:

我在尝试通过在 CircleCI 中配置的服务帐户将应用部署到 Google App Engine 时遇到了同样的错误,并通过将以下角色(权限)附加到我的服务角色来解决该错误:

App Engine 部署者 App Engine 服务管理员 Cloud Build 编辑器 存储对象创建器 存储对象查看器

我还启用了 App Engine Admin API,但没有Cloud Resource Manager API

【讨论】:

【参考方案5】:

警告:您似乎无权访问项目 [$PROJECT_ID] 或它不存在。

警告出现如果没有至少一个角色被授予包含resourcemanager.projects.get 权限的服务帐户。

换句话说,如果以下命令的结果为空,警告出现:

    收集给定$SERVICE_ACCOUNT 的所有角色(这适用于任何帐户,而不仅仅是服务帐户):

    gcloud projects get-iam-policy $PROJECT_ID \
    --flatten='bindings[].members' \
    --format='table(bindings.role)' \
    --filter="bindings.members:$SERVICE_ACCOUNT"
    
    
    #=>
    
    ROLE
    . . .
    

    对于上面收集的每个$ROLE,要么:

    gcloud iam roles describe $ROLE \
    --flatten='includedPermissions' \
    --format='value(includedPermissions)' \
    --project=$PROJECT_ID | grep \
    --regexp '^resourcemanager.projects.get$'
    

    如果$ROLE自定义 (projects/$PROJECT_ID/roles/$ROLE),或者:

    gcloud iam roles describe roles/$ROLE \
    --flatten='includedPermissions' \
    --format='value(includedPermissions)' | grep \
    --regexp '^resourcemanager.projects.get$'
    

    如果$ROLE策划 (roles/$ROLE)。

注意:自定义角色和精选角色的 gcloud 命令格式之间的区别在于,难以列出与单个帐户关联的所有角色相关的所有权限。

如果您已确认没有与服务帐户关联的角色包含resourcemanager.projects.get 权限,则:

至少更新一个与具有resourcemanager.projects.get 权限的服务帐户关联的自定义角色:

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。

【讨论】:

以上是关于谷歌云平台服务帐号无法访问项目的主要内容,如果未能解决你的问题,请参考以下文章

无法使用服务帐户订阅 google pub 子主题

谷歌云存储报告下载无法访问

REACT APP 无法访问谷歌云运行环境变量

无法识别的配置参数“默认表访问方式”谷歌云

无法从服务器读取。它可能没有适当的访问控制原点设置Google Cloud |昂首阔步

在 ubuntu 谷歌云平台上安装 RethinkDb