【问题标题】:Serviceaccount does not have bigquery.jobs.create permissionServiceaccount 没有 bigquery.jobs.create 权限
【发布时间】:2019-07-25 18:30:52
【问题描述】:

授予服务帐户的权限是“owner”和“bigquery admin”。

$bigQuery = new BigQueryClient([
            'projectId' => 'project-xxx',
        ]);

      $query = "SELECT * FROM `project-xxxx.analytics_xxx.events_xxx` where event_name='first_open' LIMIT 100";

        $jobConfig = $bigQuery->query($query);
        $queryResults = $bigQuery->runQuery($jobConfig);
        print_r($queryResults);

当我尝试执行上面的代码时,它显示以下错误:

{ "error": 
{ "errors": [ { "domain": "global", "reason": "accessDenied", 
  "message": "Access Denied: Project project-xxxx: The user 
  projectbigquery@project-xxxx.iam.gserviceaccount.com does not have 
  bigquery.jobs.create permission in project project-xxxx." } ],
}}

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您需要将服务帐户的凭据指定为BigQueryClient constructor 的参数。

    您可以使用keyFilePath 参数来做到这一点:

    $bigQuery = new BigQueryClient([
                'projectId' => 'project-xxx',
                'keyFilePath' => '/path/to/file.json'   
            ]);
    

    此外,请使用此命令检查您是否授予了服务帐户的权限:

    gcloud projects get-iam-policy yourProjectID

    编辑:

    让我们采用不同的方法创建服务帐户并从头开始授予其权限。

    1. 创建新的服务帐号:

      gcloud iam service-accounts create [NAME]

    2. 授予权限:

    gcloud projects add-iam-policy-binding [PROJECT_ID] --member "serviceAccount:[NAME]@[PROJECT_ID].iam.gserviceaccount.com" --role "roles/bigquery.admin"
    
    1. 创建凭据文件:
    gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com
    
    1. 将此文件的路径添加到BigQueryClient 构造函数并运行您的代码。

    【讨论】:

    • 我需要在 google cloud shell 哪里触发这个命令?
    • 您是否正在创建将keyFilePath 参数指定给凭证json 文件的构造函数?还要检查IAM & admin > Service Accounts Google Cloud Console 选项卡中的这些凭据是否是最新的。
    • @Krunal 我已经用非常详细的步骤编辑了我的答案。
    【解决方案2】:

    在创建具有与以前帐户相同权限的新服务帐户后,它的工作。我不知道以前的帐户有什么问题。可能是服务帐户的一些问题。

    【讨论】:

    • 如果服务帐户被删除并使用相同的名称重新创建它可能会导致意外行为。很可能这就是创建新服务帐户解决问题的原因。检查这个cloud.google.com/iam/docs/…
    • 再次阅读答案,我已经提到我已经给予了同样的许可,我没有提到任何关于名字的事情。
    • 就我而言...我创建了没有权限的服务帐户。访问被拒绝。我后来添加了权限(在我意识到我忘记了之后)。一旦我删除了帐户并重新创建,它就起作用了。我确实使用了相同的服务帐户名称。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2019-07-20
    • 2019-08-17
    • 2021-08-27
    相关资源
    最近更新 更多