BigQueryのオンデマンドクエリの利用量にフタをする (上限を設ける)

記事タイトルとURLをコピーする

G-gen の杉村です。BigQuery のオンデマンドクエリの利用量にフタをする、つまりスキャンデータ量に上限を設けて突発課金を防止する工夫について紹介します。

はじめに

BigQuery の課金体系にはオンデマンドEditions の2つから選択できます。前者はスキャンしたデータ量に応じた従量課金です。後者は確保するコンピュートリソースの量に応じた課金で、オートスケールの幅 (上限と下限) を設定できます。

Editions については以下の記事で解説しています。

blog.g-gen.co.jp

オンデマンド課金では、うっかり大きなサイズのクエリを実行してしまうと、想定しない多額の課金が発生してしまう可能性もゼロではありません。

当記事では、そのような BigQuery の突発的な課金を防ぐために、クエリ利用量に制限をかける (上限を設ける) ための方法を2つご紹介します。

  • 割り当て (Quota) の設定 (プロジェクト単位)
  • クエリのサイズ上限設定 (クエリ単位)

割り当て (Quota) の設定

Query usage per day

割り当て (Quota) とは、Google Cloud の各種サービスに設定された、API 呼び出しの制限のことです。各 Google Cloud サービスには、組織単位・プロジェクト単位・ユーザ単位など様々な粒度で割り当てが設定されています。

多くのクラウドユーザは「割り当て (Quota) は、利用が拡大してきたら上限緩和するもの」という認識を持っているかもしれません。しかし、今回はこの割り当てに任意の値を設定することによって、BigQuery の突発課金を防ぐ効果を期待してみます。

今回、設定対象となる割り当ては BigQuery API の Query usage per day (1 日あたりのクエリ使用量) です。この割り当ては一日あたりにプロジェクト内で利用できるオンデマンドクエリのスキャンデータ量を指定するもので、課金が有効になったプロジェクトではデフォルトで無制限となっています。

この割り当てに任意の数字を設定することで、それ以上のサイズのクエリ実行を防ぐことができます。割り当てを超えるクエリが実行されようとした場合、実行前にエラーとなります。

設定手順

割り当て画面へ遷移

Google Cloud コンソールにて IAM と管理 > 割り当て へ遷移します。このとき、想定通りのプロジェクトが選択されていることを確かめてください。

IAM と管理 > 割り当て

対象の割り当てをフィルタ

割り当て一覧から、今回の設定対象である BigQuery APIQuery usage per day を見つけ出します。

一覧表のフィルタ部分に サービス : BigQuery API を入力し、BigQuery の割り当てを絞り込みます。一覧の中から Query usage per day を見つけ出します。

割り当て一覧

編集ボタンをクリック

Query usage per day の左端のチェックボックスを選択して、鉛筆マークのある「割り当てを編集」ボタンを押下します。

このとき Query usage per day per user というよく似た名前の割り当てもあることに注意してください。こちらを設定すると ユーザーあたりの 一日のクエリスキャン量に制限がかかります。すなわち、割り当ての適用範囲が異なります。

チェックボックスを選択して割り当てを編集

割り当てを設定

TiB 単位でクエリの上限スキャン量を設定します。

単位は TiB しか選べませんが、0.5 TiB のように 1 TiB 未満の数字を指定することも可能です。

割り当ての設定

「リクエストを送信」を押下して、新しい割り当てを適用します。現在の割り当て設定との差が大きい場合は、以下のような警告文が表示されます。「確認」を押下します。

警告

新しい割り当ての確認

割り当て一覧に戻り、新しい数字が割り当てとして表示されていることを確認します。更新されていない場合、しばらくしてから画面をリロードします。

新しい割り当て

動作確認

スキャン量が一日の割り当てを超えると見積もられるクエリを実行しようとすると、以下のようなエラーメッセージが出て、クエリが実行できなくなります。

動作確認

Custom quota exceeded: Your usage exceeded the custom quota for QueryUsagePerDay, which is set by your administrator. For more information, see https://cloud.google.com/bigquery/cost-controls

クエリのサイズ上限設定

クエリ単位での上限設定

BigQuery ではクエリの実行時に課金対象となるバイト数を指定することができます。クエリ実行時のオプションで課金される最大バイト数 (maximum_bytes_billed) を指定することで、スキャン対象データの推定バイト数が事前に計算され、これが指定した最大バイト数を超えていればクエリを失敗します。

設定手順 (コンソール)

クエリ設定を開く

ご紹介するコンソール画面の UI は2023年9月現在のものです。

BigQuery コンソールでクエリの編集中に、歯車マーク「展開」ボタンを押下し、表示されたプルダウンメニューから「クエリ設定」を選択します。

クエリ設定を開く

詳細オプションの設定

開いたクエリ設定画面で下の方へスクロールし「詳細オプション」を展開します。「課金される最大バイト数」のテキストボックスに、バイト単位で数字を入力します。その後「保存」ボタンを押下します。

詳細オプションの設定

動作確認

この状態でクエリを実行してみます。クエリエディタのテキストボックス下部に指定した「課金される最大バイト数」が表示されています。

クエリを実行しようとする際、推定バイト数が指定した最大バイト数を上回っていると、以下のようにエラーメッセージが出てクエリが中止します。

動作確認

Query exceeded limit for bytes billed: 10485760. 168820736 or higher required.

設定手順 (bq コマンドライン)

bq コマンドラインでも同様に、最大バイト数を指定することができます。

bq query コマンド実行時に --maximum_bytes_billed オプションを指定するだけです (単位はバイト)。

bq query --use_legacy_sql=false \
    --maximum_bytes_billed=10485760 \
    'SELECT * FROM `my_project.my_dataset.my_table`'

課金が想定を超えてしまった場合の検知

前述の方法で、BigQuery の突発的な課金を防ぐことができます。

なお、万が一想定を超える課金が発生した場合には、予算アラートを設定することで早期に気がつくことができます。以下の記事もご参照ください。

blog.g-gen.co.jp

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。