BigQueryのQuotasやクエリ課金を別々に制御するためAPIリクエスト用のプロジェクトを分けてみる

はじめに

BigQueryの利用をコントロールする方法を調べています。BigQueryのAPIについてQuotas(割り当て)を制御することで、ある程度の制御できます。もう少し制御する方法無いかなと調べていました。

yomon.hatenablog.com

やりたいこと

bqコマンドのオプションを見ると project_iddataset_id 内に設定するものと2つのプロジェクトを指定することができることがわかります。

--project_id

The project ID to use for requests. The default value is ''.

--dataset_id

The default dataset to use for requests. This flag is ignored when not applicable. You can set the value to project_id:dataset or dataset. If project_id is missing, the default project is used. You can override this setting by specifying the --project_id flag. The default value is ''.

cloud.google.com

調べてみると、データを持っているプロジェクトと別プロジェクトからアクセスをかけることができることがわかりました。これを利用して以下のようなことができるかやってみました。

f:id:yomon8:20200214204334p:plain

準備

リクエスト用プロジェクトと、BigQueryのテーブルが存在するメインプロジェクトを用意します。

それぞれのIAMでユーザにBigQueryの権限を渡します。

f:id:yomon8:20200209125823p:plain

リクエスト用プロジェクトの割り当て変更

リクエスト用プロジェクトの割り当ての設定を調整します。わかりやすくエラー起こすために0に設定して試してみます。

f:id:yomon8:20200209132140p:plain

bqコマンドで試してみます。project_idとdataestのプロジェクトを以下のように別々に設定して実行します。

bq \
  --project_id リクエスト用プロジェクト \
  --dataset_id メインプロジェクト:my_dataset \
  --location asia-northeast1 \
  query 'SELECT文 .....'

このコマンドの場合、dataset_idでプロジェクトとデータセットを指定しているのでSELECT文はテーブル名だけで機能します。

以下のように割り当てが不足しているエラーが発生します。

BigQuery error in query operation: Error processing job 'リクエスト用プロジェクト :bqjob_r56a3d6470a2a492_0000017027e2d99c_1': Custom
quota exceeded: Your usage exceeded the custom quota for QueryUsagePerUserPerDay, which is set by your administrator.
For more information, see https://cloud.google.com/bigquery/cost-controls

リクエストをメインプロジェクトに対して行えば、クエリが成功するのがわかります。

bq \
  --project_id メインプロジェクト \
  --dataset_id メインプロジェクト:my_dataset \
  --location asia-northeast1 \
  query 'SELECT文 .....'

Tableauの場合

bqコマンドで実行してきましたが、他のツールでも設定できる場所あったりします。Tableauの場合はBilling Projectとして設定できそうです。

f:id:yomon8:20200209120652p:plain

ちゃんと制限できてそうです。

f:id:yomon8:20200209120519p:plain

課金

TableauでもBilling Projectという名前になっている通り、クエリジョブがリクエスト側のプロジェクトで動くのでクエリ課金がリクエスト側にかかります。データのストレージ料金はBigQueryのデータセットが配置されているプロジェクトにかかります。

参考

google cloud platform - Who pays query costs on datasets across multiple users in BigQuery? - Stack Overflow