Bigqueryのテーブル作成→サービスアカウント作成→PythonでBigquery操作
BigqueryはGoogle Cloud Platform(GCP)の提供するデータベース。
Pythonでquery操作してデータ取得できると便利なので実験。
1. テスト用のテーブル作成
Bigqueryに実験用のデータセット・テーブルを作成。
GCPのアカウント・プロジェクトは作成済。
1.1. データセット作成
Bigqueryにアクセス。
https://console.cloud.google.com/bigquery
「データセットを作成」
適当な名前、ここでは「dataset」と付ける。
データのロケーションも適当に、ここでは「us-west1」。
「データセットを作成」するとdatasetという名前のデータセットが作成される。
1.2. テーブル作成
データセットの中にテーブルを作成。
事前に適当なcsvファイルを用意しておく。
さっき作ったデータセット(dataset)を選択して「テーブルを作成」。
「テーブルの作成元」→「アップロード」として、
適当なcsvファイルをアップロード。
別に他の方法で作ってもいい。
テーブルに適当な名前、ここでは「table_01」と付ける。
スキーマの自動検出にチェックを付けて「テーブルを作成」。
2. サービスアカウント準備
GCPに外部からアクセスするためにサービスアカウントが必要となる。
2.1. ロール作成
サービスアカウントに付与するためのロールを作成する。
「IAMと管理」→「ロール」→「ロールを作成」。
適当な名前「sample-role」を付けて「権限を追加」。
権限が星の数ほどあり選ぶのが大変なのでフィルタに検索ワードを入れる。
目的の権限にチェックを付けて追加する。
今回必要な権限は以下の2つ。
「bigquery.jobs.create」、「bigquery.tables.getData」を選択して「追加」。
ここで作成したロールを次にサービスアカウントへ付与する。
2.2. サービスアカウント作成
GCPにアクセス。
「IAMと管理」→「サービスアカウント」。
「サービスアカウントを作成」
「サービスアカウントID」に適当な名前「sample」を付けて「作成して実行」。
「ロールを選択」して「続行」。
選択するのはさっき作った「sample-role」。
特に何もせず[「完了」。
サービスアカウントが作られた。
2.3. サービスアカウントのキー作成
サービスアカウントを使用するためのキーを作成する。
さっき作ったサービスアカウントを選択。
「キー」→「鍵の追加」→「新しい鍵を作成」。
「JSON」を選択して「作成」。
作成されたキーであるjsonファイルがダウンロードされる。
このキーを後で使う。
3. Python
2.3.で作成したjsonファイル(サービスアカウントキー)を準備しておく。
コード内から参照する。
3.1. 環境設定
Anacondaが既にインストールされている前提。
入ってなければ以下を参考にして入れる。
別にAnacondaである必要はない。
以下のように「gcp」という名前の環境を作り、必要なライブラリをインストール。
1 | conda create -n gcp |
pipでもなんでもいい。pandas-gbq=0.16
としているのは最新の0.17が何故かpython=3.1を求めているから。
3.2. Bigqueryからデータ取得
Bigqueryからデータ取得。
以下の情報が必要。
- サービスアカウントキー
- プロジェクトid
- データセット名
- テーブル名
1 | from google.oauth2.service_account import Credentials |
4. エラー
〇〇に対応する権限がサービスアカウントに付与されたロールに与えられていないと以下のエラーが発生する。
1 | 403 POST ~~ ××.iam.gserviceaccount.com does not have 〇〇 access to the Google Cloud project. |
サービスアカウントに付与されたロールに「bigquery.tables.getData」がない場合は以下の表示。
少し回りくどいメッセージ。
1 | Exception has occurred: GenericGBQException |
5. 参考
サービスアカウント
https://cloud.google.com/iam/docs/grant-role-console?hl=ja
pandas-gbq(ライブラリ)
https://pandas-gbq.readthedocs.io/en/latest/howto/authentication.html