public note

BigQueryのオンデマンドクエリ料金を見積るPythonパッケージをつくった

BigQueryのオンデマンドクエリ料金を見積もるPythonパッケージをつくりました。

経緯

BigQueryをオンデマンドクエリ料金で運用していると、作成したクエリを実行したら一体どれくらいのコストがかかるのか?ということが気になります。 bqコマンドにはdryrunオプションがありますので、これを使ってスキャン量の見積ができますが、もっと気軽にしゅっと見積ができて、かつ使うひとに寄り添った出力がほしいなと思いました。シェルスクリプトで頑張るにはちょっと…という分量になりそうな予感がしましたので、今回はPythonパッケージをつくることにしました。*1

つくったもの

pypi.org

github.com

これはなにか

BigQueryを対象とした、SQLシンタックスチェック結果クエリコスト試算結果を出力します。
通常のPython環境のほか、Google Colaboratory でも動作することを確認済みです。

導入方法

$ pip install sfb

実行方法

$ sfb
{
  "Succeeded": [
    {
      "SQL File": "/home/admin/project/sfb_test/sql/covid19_open_data.covid19_open_data.sql",
      "Total Bytes Processed": "1.9 GiB",
      "Estimated Cost($)": {
        "per Run": 0.009414,
        "per Month": 0.28242
      },
      "Frequency": "Daily"
    },
    {
      (中略)
    }
  ],
  "Failed": [
    {
      "SQL File": "/home/admin/project/sfb_test/sql/test_failure_badrequest_01.sql",
      "Errors": [
        {
          "message": "Unrecognized name: names; Did you mean name? at [9:5]",
          "domain": "global",
          "reason": "invalidQuery",
          "location": "q",
          "locationType": "parameter"
        }
      ]
    },
    {
      (中略)
    }
  ]
}

入力

以下のいずれかをとります。

  • SQLファイル
    • デフォルトは カレントのsqlディレクトリ内のファイルすべて
    • 複数指定、ワイルドカード指定可
    • クエリパラメータ自動補完(configでクエリパラメータを設定している場合)
  • クエリ文字列

出力

  • JSONで以下を標準出力
    • シンタックスチェック結果(エラーの場合は原因を出力)
    • クエリコスト試算結果($)
      • 1実行あたりのコスト
      • 月額コスト(configで実行頻度を設定している場合)
    • 成功・失敗で分類

詳しい内容や設定方法は、GitHubリポジトリをご参照ください

想定ユースケース

  • 開発段階での試行錯誤のお供として
    • 気軽にチェックできることはコスト意識の向上につながるはず
  • CIへの組み込み
    • コスト面もチェックできるSQLテストツールとしてつかえるはず

今後の予定

  • 設定項目にコストしきい値を追加し、月額コスト料金のしきい値チェックを行う機能を追加
  • クエリ文字列を標準入力から受け取る機能を追加
  • テストコードの拡充
  • GitHub Actions の導入

Development Status

4 - Beta で公開しています。不具合や改善点など、フィードバックをくださる心優しい方を募集中です!

*1:Web UIでも見積は可能ですが、git管理のSQLを毎回コピペするのは大変です。また、Web UIはクエリパラメータに対応していない、という点も結構つらいです