BigQueryのコストを制限する基本設定

[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos "PONOS Advent Calendar 2023")の1日目の記事です。

# はじめに
各種ログを分析してビジネスに活かすデータ分析に、AIの話題もホットになって、より一層の活用が求められています。一方で、青天井にコストを費やせるわけではないのでバランスが難しいところ。ここではGoogle Cloud PlatformのBigQueryに対して、コストへの制限を基本に戻って整理してみます。

# BigQuery
[BigQuery](https://cloud.google.com/bigquery?hl=ja "BigQuery")は、Google Cloud Platformで提供されているサーバレスのデータウェアハウスです。

# 料金
[料金](https://cloud.google.com/bigquery?hl=ja#pricing-module "料金")は、以下のようにデータの流れに沿って確認すると理解しやすいです。
　①データの入力　→ 「データの取り込み」欄参照
　②データの蓄積　→ 「ストレージ」欄参照
　③データの利用　→ 「コンピューティング(分析)」欄参照

# データ蓄積関連
②のデータの蓄積は、2023年7月より、論理ストレージではなく物理ストレージでの料金体系が追加になっています。これによって、大量に蓄積されたデータに対しては、圧縮後のデータ量で計上する物理ストレージでの料金体系を選択する方がお得になる可能性があります。（お得になるかどうかは状況に依存するので、詳細に確認ください）。テーブルの変更がなく、クエリを実行するだけであればアクティブストレージにはならないので、長期保存しているデータセットは候補になります。この料金体系の選択はデータセット単位で可能です。

:::note
◆手順
1. コンソールのBigQueryページの左側「エクスプローラ」からデータセットを選択。
1. 「データセット情報」ページの右上「詳細を編集」を選択。
1. 「詳細の編集」の「詳細オプション」にある「ストレージの課金モデル」にある「物理ストレージの課金モデルを有効にする」にチェック。
1. 「詳細の編集」の末尾にある「SAVE」ボタンで保存。
:::

# データ利用関連
データ分析としては、入力と蓄積が終わったら利用のためのクエリの実行が多くなります。
料金体系では、クエリしたデータ量に基づく請求のオンデマンドと、スロット数の利用時間に基づく請求のエディション(Standard/Enterprise/Enterprise Plus)があり、提供されている機能の違いもあるため、機能面と利用頻度から選択することになります。

ここでは、オンデマンドの無料枠1TB/月も活用しながら、上限を抑えることを整理します。

まずは、青天井で使わないための制限を設定します。
BigQueryの「Query usage per day」に上限となる1日の利用量を設定します。上限に至った場合、以降のクエリは実行できないことになります。[詳細](https://cloud.google.com/bigquery/quotas?hl=ja "詳細")

:::note
◆手順
1. コンソールの左側メニュー「IAMと管理」から「割り当て」を選択。
1. 「BigQuery API」サービスの「Query usage per day」割り当てを検索して選択。
1. ページの右上「割り当てを編集」を選択。
1. 「割り当ての変更」画面で「新しい上限」に具体的な容量を設定して完了。
:::

プロジェクトで設定したQuery usage per dayの上限内で利用するユーザは利用量の取り合いになります。ここでいうユーザとは、個別にBigQueryを利用しているユーザはもちろん、スケジュールクエリやLookerStudioでクエリを実行するサービスアカウントも含まれます。あるユーザの利用量が極端に大きいと、他のユーザがまったく利用できないということがありえます。例えば、BigQueryであるユーザが大量のクエリを実行したために、スケジュールクエリに設定した定期集計処理が実行されない、なんてことも。この状況に対して、各ユーザでの利用量を設定することで、みんな仲良く同じ利用量で使ってね、とすることができます。BigQueryの「Query usage per day per user」にユーザの上限となる1日の利用量を設定します。（ユーザごとに上限設定できるわけではないので注意が必要です）[詳細](https://cloud.google.com/bigquery/quotas?hl=ja "詳細")

:::note
◆手順
1. コンソールの左側メニュー「IAMと管理」から「割り当て」を選択。
1. 「BigQuery API」サービスの「Query usage per day per user」割り当てを検索して選択。
1. ページの右上「割り当てを編集」を選択。
1. 「割り当ての変更」画面で「新しい上限」に具体的な容量を設定して完了。
:::

通常、スケジュールクエリやLookerStudioのクエリは、作成したユーザが認証情報のオーナーになっています。これでは、作成したユーザの利用量として計上されるので、用途に合わせてサービスアカウントを設定して利用するのが適切です。サービスアカウントへの差し替え方法も合わせて整理しておきます。

:::note
◆スケジュールクエリ認証情報の変更手順
コンソールからの設定は提供されていません。[詳細](https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja#using_a_service_account "詳細")
Pythonでの設定例になります。
```Python
from google.cloud import bigquery_datatransfer
from google.protobuf import field_mask_pb2

transfer_client = bigquery_datatransfer.DataTransferServiceClient()

service_account_name = "abcdef-test-sa@abcdef-test.iam.gserviceaccount.com"
transfer_config_name = "projects/1234/locations/us/transferConfigs/abcd"

transfer_config = bigquery_datatransfer.TransferConfig(name=transfer_config_name)

transfer_config = transfer_client.update_transfer_config(
    {
        "transfer_config": transfer_config,
        "update_mask": field_mask_pb2.FieldMask(paths=["service_account_name"]),
        "service_account_name": service_account_name,
    }
)

print("Updated config: '{}'".format(transfer_config.name))
```
:::

:::note
◆LookerStudioカスタムクエリ認証情報の変更手順
1. LookerStudioの編集画面の上部メニュー「リソース」から「追加済みデータソースの管理」を選択
1. 変更するクエリのアクション「編集」を選択
1. 上部「データの認証情報」のユーザ名を選択
1. 「データの認証情報を更新」ダイアログから「サービスアカウント認証情報」を選択してサービスアカウントを入力して更新。
※ 事前にサービスアカウントにLookerStudioのサービスエージェントの権限やクエリに必要となる権限の付与などが必要です。[詳細](https://support.google.com/looker-studio/answer/10835295 "詳細")
:::

# 請求額の確認
日々の利用状況に基づく見込み金額は「請求の詳細」のページで確認ができます。

:::note
◆手順
1. コンソールの左側メニュー「お支払い」から「レポート」を選択。
1. 右側「フィルタ」の「サービス」から「BigQuery」を選択。
:::

# まとめ
2023年11月現在の情報で手順を整理しましたが、料金体系や手順は更新になる可能性があります。確認する観点として本情報を参考にしつつ、BigQueryの公式ページから最新情報を取得するようにご注意ください。

ということで、次回は@honeniqさんです！