はじめに
BigQueryの利用をコントロールする方法を調べています。BigQueryのAPIについてQuotas(割り当て)を制御することで、ある程度の制御できます。もう少し制御する方法無いかなと調べていました。
やりたいこと
bqコマンドのオプションを見ると project_id
と dataset_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 ''.
調べてみると、データを持っているプロジェクトと別プロジェクトからアクセスをかけることができることがわかりました。これを利用して以下のようなことができるかやってみました。
準備
リクエスト用プロジェクトと、BigQueryのテーブルが存在するメインプロジェクトを用意します。
それぞれのIAMでユーザにBigQueryの権限を渡します。
リクエスト用プロジェクトの割り当て変更
リクエスト用プロジェクトの割り当ての設定を調整します。わかりやすくエラー起こすために0に設定して試してみます。
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として設定できそうです。
ちゃんと制限できてそうです。
課金
TableauでもBilling Projectという名前になっている通り、クエリジョブがリクエスト側のプロジェクトで動くのでクエリ課金がリクエスト側にかかります。データのストレージ料金はBigQueryのデータセットが配置されているプロジェクトにかかります。