質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

PythonからのBigQuery認証でbigquery.jobs.create permissionがAccess Deniedされてしまいます

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 52

nyayuta

score 0

いろいろ試しましたが、認証が通りません。なにとぞよろしくお願いいたします。

前提・実現したいこと

PythonからBigQueryを利用したいです。
認証を取るためにサービスアカウントをjsonファイルで取得しています。
そして、GoogleCloudPlatformの"IAMと管理"の画面から、
取得したサービスアカウントに、

  • BigQuery 管理者
  • BigQuery データオーナー
  • BigQuery ジョブユーザー
  • サービス アカウント ユーザー
  • オーナー
    の5つの権限を付与しています(足りないのでは、と増やした結果です)。

発生している問題・エラーメッセージ

InvalidResponse                           Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/google/cloud/bigquery/client.py in load_table_from_file(self, file_obj, destination, rewind, size, num_retries, job_id, job_id_prefix, location, project, job_config)
   1430                 response = self._do_resumable_upload(
-> 1431                     file_obj, job_resource, num_retries
   1432                 )

/usr/local/lib/python3.6/dist-packages/google/cloud/bigquery/client.py in _do_resumable_upload(self, stream, metadata, num_retries)
   1586         upload, transport = self._initiate_resumable_upload(
-> 1587             stream, metadata, num_retries
   1588         )

/usr/local/lib/python3.6/dist-packages/google/cloud/bigquery/client.py in _initiate_resumable_upload(self, stream, metadata, num_retries)
   1629         upload.initiate(
-> 1630             transport, stream, metadata, _GENERIC_CONTENT_TYPE, stream_final=False
   1631         )

/usr/local/lib/python3.6/dist-packages/google/resumable_media/requests/upload.py in initiate(self, transport, stream, metadata, content_type, total_bytes, stream_final)
    326             retry_strategy=self._retry_strategy)
--> 327         self._process_initiate_response(result)
    328         return result

/usr/local/lib/python3.6/dist-packages/google/resumable_media/_upload.py in _process_initiate_response(self, response)
    448         self._resumable_url = _helpers.header_required(
--> 449             response, u'location', self._get_headers)
    450 

/usr/local/lib/python3.6/dist-packages/google/resumable_media/_helpers.py in header_required(response, name, get_headers, callback)
     63         raise common.InvalidResponse(
---> 64             response, u'Response headers must contain header', name)
     65 

InvalidResponse: ('Response headers must contain header', 'location')

During handling of the above exception, another exception occurred:

Forbidden                                 Traceback (most recent call last)
<ipython-input-46-b985c2114c26> in <module>()
      1 if __name__=='__main__':
----> 2   main()

<ipython-input-45-5e967183c75f> in main()
     27 
     28   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
---> 29   insert_into_bigquery_table(dataframe, fiscal_year)
     30   print('complete!!')

<ipython-input-44-85a5177f0da3> in insert_into_bigquery_table(dataframe, FY)
      7   print(FY)
      8 
----> 9   job = client.load_table_from_dataframe(dataframe, table_ref, location='asia-northeast1')
     10   job.result()

/usr/local/lib/python3.6/dist-packages/google/cloud/bigquery/client.py in load_table_from_dataframe(self, dataframe, destination, num_retries, job_id, job_id_prefix, location, project, job_config, parquet_compression)
   1561                     location=location,
   1562                     project=project,
-> 1563                     job_config=job_config,
   1564                 )
   1565 

/usr/local/lib/python3.6/dist-packages/google/cloud/bigquery/client.py in load_table_from_file(self, file_obj, destination, rewind, size, num_retries, job_id, job_id_prefix, location, project, job_config)
   1436                 )
   1437         except resumable_media.InvalidResponse as exc:
-> 1438             raise exceptions.from_http_response(exc.response)
   1439 
   1440         return self.job_from_resource(response.json())

Forbidden: 403 POST https://www.googleapis.com/upload/bigquery/v2/projects/xxxxxxxxxxx/jobs?uploadType=resumable: Access Denied: Project xxxxxxxxxxxx: The user xxxxxxxxxxx@xxxxxxx.iam.gserviceaccount.com does not have bigquery.jobs.create permission in project xxxxxxxxxx.

該当のソースコード

from google.cloud import bigquery
(中略)
def insert_into_bigquery_table(dataframe, FY):
  client = bigquery.Client.from_service_account_json('jsonへのpass/xxxxxxxxxxxxxxx.json')

  dataset_ref = client.dataset('xxxxxxx')
  table_ref = dataset_ref.table(FY)
  print(FY)

  job = client.load_table_from_dataframe(dataframe, table_ref, location='asia-northeast1')
  job.result()

試したこと

  • 様々な権限(上記の5つ)の付与
  • 3時間程度、時間をおいて再度実行
  • サービスアカウントの作り直し

補足情報(FW/ツールのバージョンなど)

GoogleColaboratoryから使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る