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

Google Cloud Platform Service Account is Unable to Access Project

我遇到以下警告:

WARNING: You do not appear to have access to project [$PROJECT] or it does not exist.

在 运行 本地执行以下命令后:

  1. 激活并设置服务帐号:

    gcloud auth activate-service-account \
    $SERVICE_ACCOUNT \
    --key-file=key.json
    
    #=>
    
    Activated service account credentials for: [$SERVICE_ACCOUNT]
    
  2. Select $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 帐户与以下角色相关联:

为什么此服务帐户无法 set $PROJECT?是否缺少我的角色或权限?

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

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

此问题的解决方案可能是在您的 Google 云控制台 here 中单击启用来启用云资源管理器 API。

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

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

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

我在开始使用 Google CLoud Platform 时遇到了这个错误。

问题是我 configured/set 一个 non-existing 项目 (my-kube-project) 使用以下命令作为我的默认项目:

gcloud config set project my-kube-project

我是这样解决的:

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

gcloud projects list

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

gcloud config set project gold-magpie-258213

而且效果很好。

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

就这些了。

希望对您有所帮助

WARNING: You do not appear to have access to project [$PROJECT_ID] or it does not exist.

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

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

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

    gcloud projects get-iam-policy $PROJECT_ID \
    --flatten='bindings[].members' \
    --format='table(bindings.role)' \
    --filter="bindings.members:${SERVICE_ACCOUNT}"
    
    
    #=>
    
    ROLE
    . . .
    
  2. 对于上面收集的每个 $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 自定义角色和精选角色的命令格式之间的区别使得列出与单个帐户关联的所有角色关联的所有权限变得困难。

如果您已确认与服务帐户关联的 none 个角色包含 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