Serviceaccount没有bigquery.jobs.create权限

Kru*_*nal 8 google-bigquery

授予服务帐户的权限为“所有者”和“ 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);
Run Code Online (Sandbox Code Playgroud)

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

{ "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." } ],
}}
Run Code Online (Sandbox Code Playgroud)

llo*_*les 7

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

你可以用keyFilePath参数来做:

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

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

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"
Run Code Online (Sandbox Code Playgroud)
  1. 创建凭据文件:
gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)
  1. 将此文件的路径添加到BigQueryClient构造函数并运行您的代码。


Kru*_*nal 7

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

  • 如果服务帐户被删除并使用相同的名称重新创建,则可能会导致意外行为。最有可能这就是为什么创建一个新的服务帐户解决了这个问题。检查这个 https://cloud.google.com/iam/docs/understanding-service-accounts#deleting_and_recreating_service_accounts (2认同)