当前位置: 首页 > 知识库问答 >
问题:

GCP:无法通过GCloud/API创建项目接收器

洪季萌
2023-03-14

我目前有一个场景,其中我使用部署管理器创建了部署脚本(python),它在GCP沙箱(LA Playground)中运行得非常好,我倾向于使用该沙箱来进行测试。但是当我尝试在一个实际的GCP项目上运行它时,我得到了一个权限错误,尽管我在为它创建的服务帐户中使用了基本相同的角色集。我也是那个麻烦的GCP帐户的项目所有者。

我遇到的特殊权限集是在创建项目接收器时遇到的。我总是得到以下错误:

Error in Operation [operation-xxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxx-9d487530]: errors:
- code: RESOURCE_ERROR
  location: /deployments/structured-pipeline/resources/dataprep-bq-listener-sink
  message: '{"ResourceType":"gcp-types/logging-v2:projects.sinks","ResourceErrorCode":"403","ResourceErrorMessage":{"code":403,"message":"The
    caller does not have permission","status":"PERMISSION_DENIED","statusMessage":"Forbidden","requestPath":"https://logging.googleapis.com/v2/projects/redacted-gcp-project-name-dev/sinks","httpMethod":"POST"}}'

下面是我附加在用于运行部署的服务帐户上的角色列表:

  • 计算机管理
  • 部署管理器编辑器
  • 安全管理
  • 日志管理
  • 日志配置编写器
  • 发布/子管理
  • 服务使用管理
  • 存储管理

正如您可能看到的,我已经将它们设置为管理员级别,以确保不会丢失所需的权限。

根据官方文档,创建项目接收器所需的特定权限是logging.sinks.create,它包含在logging adminlogs Configuration writer角色中。

更新#1:

下面是问题资源的扩展DM配置

- name: dataprep-bq-listener-sink
  properties:
    destination: pubsub.googleapis.com/projects/redacted-gcp-project-name-dev/topics/dataprep-bq-listener-vpcps3s6wjzbmkbxxlsqqh
    filter: |-
      resource.type="bigquery_dataset"
      resource.labels.dataset_id="dataprep_output_vpcps3s6wjzbmkbxxlsqqh"
      protoPayload.methodName="google.cloud.bigquery.v2.JobService.InsertJob"
    outputVersionFormat: V2
    sink: dataprep-bq-listener-sink-vpcps3s6wjzbmkbxxlsqqh
  type: gcp-types/logging-v2:projects.sinks
- accessControl:
    gcpIamPolicy:
      bindings:
      - members:
        - $(ref.dataprep-bq-listener-sink.writerIdentity)
        role: roles/pubsub.publisher
  name: dataprep-bq-listener
  properties:
    labels:
      client_namespace: redacted-client-name
    topic: dataprep-bq-listener-vpcps3s6wjzbmkbxxlsqqh
  type: pubsub.v1.topic
  metadata:
    dependsOn:
    - dataprep-bq-listener-sink

更新#2

我将GCloud设置为使用一个服务帐户作为凭据(https://cloud.google.com/sdk/docs/authorizing#authorizing_with_a_service_account),它具有上面所述的角色。

运行GCloud身份验证列表明确指向我创建/使用的服务帐户。

ACTIVE  ACCOUNT
        my_redacted_email@company.com
        cloud_user_p_2725ef46@linuxacademygclabs.com
        cloud_user_p_2e3db20d@linuxacademygclabs.com
        cloud_user_p_41b5121a@linuxacademygclabs.com
        cloud_user_p_b57aaef8@linuxacademygclabs.com
        cloud_user_p_bdb72060@linuxacademygclabs.com
        cloud_user_p_c2f5d19a@linuxacademygclabs.com
        cloud_user_p_c3c54122@linuxacademygclabs.com
        cloud_user_p_c88350f1@linuxacademygclabs.com
        cloud_user_p_d7702b8b@linuxacademygclabs.com
*       service_account_used_in_dm@project_id.iam.gserviceaccount.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

更新#3

运行GCloud项目get-iam-policy 将结果转到以下IAM策略列表(我已将我的电子邮件替换为“my_redacted_email@company.com”,并将我用于DM的服务帐户电子邮件替换为“service_account_used_in_dm@project_id.IAM.gserviceaccount.com”;所有我保留的默认默认服务帐户)

bindings:
- members:
  - user: my_redacted_email@company.com
  role: roles/billing.projectManager
- members:
  - serviceAccount:1008104628570@cloudbuild.gserviceaccount.com
  role: roles/cloudbuild.builds.builder
- members:
  - serviceAccount:service-1008104628570@gcp-sa-cloudbuild.iam.gserviceaccount.com
  role: roles/cloudbuild.serviceAgent
- members:
  - serviceAccount:service-1008104628570@gcf-admin-robot.iam.gserviceaccount.com
  role: roles/cloudfunctions.serviceAgent
- members:
  - serviceAccount:service-1008104628570@gcp-sa-cloudscheduler.iam.gserviceaccount.com
  role: roles/cloudscheduler.serviceAgent
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/compute.admin
- members:
  - serviceAccount:service-1008104628570@compute-system.iam.gserviceaccount.com
  role: roles/compute.serviceAgent
- members:
  - serviceAccount:service-1008104628570@containerregistry.iam.gserviceaccount.com
  role: roles/containerregistry.ServiceAgent
- members:
  - serviceAccount:service-1008104628570@dataflow-service-producer-prod.iam.gserviceaccount.com
  role: roles/dataflow.serviceAgent
- members:
  - serviceAccount:service-1008104628570@trifacta-gcloud-prod.iam.gserviceaccount.com
  role: roles/dataprep.serviceAgent
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/deploymentmanager.editor
- members:
  - serviceAccount:1008104628570-compute@developer.gserviceaccount.com
  - serviceAccount:1008104628570@cloudservices.gserviceaccount.com
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  - user:my_redacted_email@company.com
  role: roles/editor
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/iam.securityAdmin
- members:
  - user:my_redacted_email@company.com
  role: roles/iam.serviceAccountUser
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/logging.admin
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/logging.configWriter
- members:
  - user:my_redacted_email@company.com
  role: roles/owner
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/pubsub.admin
- members:
  - user:my_redacted_email@company.com
  role: roles/resourcemanager.projectIamAdmin
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/serviceusage.serviceUsageAdmin
- members:
  - serviceAccount:service_account_used_in_dm@project_id.iam.gserviceaccount.com
  role: roles/storage.admin
etag: BwW0MM3sGXk=
version: 1

正如您可能注意到的那样,我使用的服务帐户绑定到上面提到的项目级别的角色。

更新#4

使用相同的服务帐户通过GCloud创建接收器将导致成功创建接收器。

gcloud logging sinks create dataprep-bq-listener-sink-vpcps3s6wjzbmkbxxlsqqh pubsub.googleapis.com/projects/<project_id>/topics/dataprep-bq-listener-vpcps3s6wjzbmkbxxlsqqh --log-filter='resource.type="bigquery_dataset" AND resource.labels.dataset_id="dataprep_output_vpcps3s6wjzbmkbxxlsqqh" AND protoPayload.methodName="google.cloud.bigquery.v2.JobService.InsertJob"' --project=<project_id>

更新#5

@Kolban确实注意到了部署管理器对[PROJECT_NUMBER]@cloudservices.gserviceAccount.com服务帐户的要求,正如其官方文档中所述,现在查看更新#4,它清楚地显示了所述服务帐户具有editor角色。

他还注意到可能会混淆多个云帐户(我可能使用服务帐户但在不同的云帐户下运行该命令),因此,我执行了以下命令:gcloud config get-value account&gcloud config get-value project,结果得到了我所期望的正确的GCP项目和服务帐户对。

共有1个答案

田志尚
2023-03-14

单据上写着:-

为了创建其他Google云资源,Deployment Manager使用Google API服务帐户的凭据对其他API进行身份验证。Google API服务帐户是专门为代表您运行内部Google进程而设计的。服务帐户可通过电子邮件识别:

[PROJECT_NUMBER]@CloudServices.gServiceAccount.com

在您的情况下,您的1008104628570@cloudservices.gserviceaccount.com服务帐户绑定到项目级别的roles\editor角色。但是,您所需的权限(logging.sinks.create)不包含在该旧版编辑器角色中。

您是否可以尝试另外授予1008104628570@cloudservices.gserviceaccount.com服务帐户日志管理角色(roles/Logging.Admin)并看看这是否有帮助?

 类似资料:
  • 介绍 create-umi umi 通过 create-umi 提供脚手架能力,包含: project,通用项目脚手架,支持选择是否启用 TypeScript,以及 umi-plugin-react 包含的功能 ant-design-pro,仅包含 ant-design-pro 布局的脚手架,具体页面可通过 umi block 添加 block,区块脚手架 plugin,插件脚手架 library

  • 我正在尝试将Terraform设置为与GCP一起使用,但在gcloud CLI:Terraform实验室创建一个新项目时遇到了麻烦 我使用的命令是 null

  • 本文向大家介绍通过命令行创建vue项目的方法,包括了通过命令行创建vue项目的方法的使用技巧和注意事项,需要的朋友参考一下 最近想要学习vue,正好看到资料,如何通过命令创建vue项目的方法,就留个笔记 环境要求: 安装有 Node.js、 vue、vue-cli 。 创建项目: 进入项目,下载依赖: npm install 或者 cnpm install 运行项目: 效果如下: 创建项目 进入项

  • 我的问题似乎类似于通过命令行构建Android Studio应用程序的问题,但它有点不同。我有一个android studio项目,一切都是ok,当使用android studio IDE构建,但我需要通过ubuntu终端构建项目。我键入。/Gradlew build我得到以下错误: 当键入sudo./gradlew时,会出现以下错误: 正在下载https://services.gradle.or

  • 我试图连接jira的API通过python(3.6)和我一直得到错误消息: 警告:root:HTTPSConnectionPool(host='jira',port=443):url:/secure/rest/api/2/serverInfo/rest/api/2/serverInfo超过了最大重试次数(由SSLError引起(SSLError(“错误握手:错误”(('SSL例程','tls\u进