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

我遇到以下警告:

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

在本地运行以下命令后:

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

    gcloud auth activate-service-account \
    $SERVICE_ACCOUNT \
    --key-file=key.json
    
    #=>
    
    Activated service account credentials for: [$SERVICE_ACCOUNT]
    
  2. 选择$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 命令完全不同的原因而无法正常工作。

标签: google-cloud-platform gcloud google-cloud-iam


【解决方案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 权限的服务帐户。

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

    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 命令格式之间的区别在于,难以列出与单个帐户关联的所有角色相关的所有权限。

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

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 2020-01-11
      • 1970-01-01
      • 2019-02-02
      • 2016-12-19
      • 1970-01-01
      • 2019-10-31
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多