dbt Cloudを卒業してVSCodeでローカル開発はじめました

# はじめに

みなさん、dbt使ってますか？ dbt Cloud使ってますか？ この記事ではdbt Cloudを卒業し、dbtのローカル環境を構築した方法についてご紹介いたします。
皆様の参考になれば幸いです。

# dbt Cloud とは
dbtを利用する方法には、基本的に2つのアプローチがあります。一つはSaaSプラットフォームであるdbt Cloud、もう一つはCLIツールのdbt-coreを使う方法です。dbt CloudはWeb上でコードの変更が可能で、Git連携、プレビュー表示、ビルド実行、JOBの定期実行などを行うことができる非常に便利なツールです。


![スクリーンショット 2023-05-11 2.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/986dedab-9ce2-c65e-9cb5-998bf16b3322.png)

# dbt Cloud の課題
dbt Cloudの問題点はIDE機能と費用です。
dbt Cloudはブラウザ上で利用できるIDEを提供しています。IDE機能では、dbt開発のための便利な機能が用意されていますが、一方で、一般的なIDEにあるような当たり前の機能がなかったりします。
たとえば、ファイル横断のgrep検索・置換、コードジャンプ、画面分割など。
（とはいえ、dbt CloudのIDE機能は日々進化しているため、近い将来改善されるかもしれません）

費用について、dbt Cloudで企業向けのプランであるTeamプランの現在の料金は１開発者あたり$100/月です。各種セットアップが簡略化できるという点で考えれば、安いと捉えることもできますが、開発者が増えていくとかなり費用がかさみます。

https://docs.getdbt.com/docs/cloud/about-cloud/about-cloud-ide

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/1983d6cc-8cea-1c04-f4e1-53b2ccb5171d.png)
(dbt Developer Hubより引用)

# ローカル開発環境での dbt-core の活用
そこで我々は dbt-core を使った開発環境を自前で作成することにしました。 dbt-core はCLIツールで、dbt Cloudと比較して機能が不足しています。しかし、dbt-core とさまざまなツールを組み合わせることでdbt Cloudに負けず劣らずな開発環境を構築することができます。

## dbt Cloudと VSCode(+ dbt-core)の比較 ざっくり

dbt Cloudとdbt-coreを使ったローカル開発環境についてざっくりと比較してみましょう。

|                | dbt Cloud                | vscodeローカル環境          |
|-------------- |--------------------------|-------------------------------|
| ワークフロー機能 | ◯                        | X(他のジョブ実行ツールで対応) |
| コード編集     | ◯                        | ◎                             |
| 安定性         | ◯                        | △（いまいち安定しない）       |
| セットアップの容易さ | ◎ （ブラウザでアクセスするだけ） | ×（各自がPyenvでセットアップ） |

dbt Cloudの方が多くの面で優れていますが、VSCodeの方がコード編集に関する機能が優れています。（主観）

## コード編集機能の比較

それでは、VSCodeのコード編集について詳しく比較してみましょう。
|                | dbt Cloud                                       | vscodeローカル環境         |
|-------------- |------------------------------------------------|-----------------------------|
| git連携          | △（ファイル単位の制御など細かな操作はできない）    | ◯                            |
| github連携       | △（GUI上でPRが作れるのみ）                       | ◯                            |
| コードジャンプ     | ×                                               | ◯                            |
| リネージ（DAG)表示       | ◎ (クリックでジャンプ可能）                       | ◯ (dbt power userで表示可能)                           |
| コンパイル後のSQL表示 | ◯                                               | ◯                            |
| クエリのプレビュー表示 | ◎（見やすい）                                    | ◯（簡易的）                  |
| ボタンでクリックでビルド | ◎                                              | △（upstreamごとビルドなど細かな制御ができない） |
| ファイル横断検索・置換 | ×                                              | ◯                            |
| 画面分割           | ×                                              | ◯                            |
| 拡張機能の追加      | ×                                              | ◯                            |
| GitHub Coplit    | ×                                               | ◯                            |
| 一括SQLフォーマット(SQLFluff) | ×                                   | ◯                            |

コード編集は、dbtの固有機能意外の部分についてはVSCodeの方が便利な点が多いです。
クエリのプレビューやリネージ表示といったdbtの固有機能はやはりdbt Cloudのほうが使いやすいです。（主観）

# ローカル開発環境の整備

## Visual Studio Code を使用
Visual Studio Codeは多機能であり、多くの開発者にとって馴染みのあるコードエディターです。
`dbt-core`はCLIツールであるため、dbtのSQLファイルやモデル定義のためのymlファイルを編集するためのツールとしてVisual Studio Codeを採用しました。

https://azure.microsoft.com/ja-jp/products/visual-studio-code

## Pipenv による Python 実行環境構築
Pipenvによってdbt codeの動作環境であるPythonの実行環境を整えました。
できれば、dockerなどをつかってローカルマシンの環境を汚さない形で実現したかったのですが、
これから`Wizard of dbt Core`という拡張機能との相性が悪くうまく動作しなかったのであきらめました。

## Visual Studio Codeに拡張機能を導入
dbt CloudにあるようなGUIでのデータプレビュー機能やビルド機能を実現し、簡単に開発するために各種拡張機能を導入しました。

### dbt Power User 
vscodeとdbtがシームレスに連携できるようになる拡張機能です。
dbt Power User を利用することで、GUI操作でのビルドやクエリ結果のプレビュー、定義ジャンプ、オートコンプリートなどができます。
この拡張機能はローカル環境でのdbt開発では欠かせないものだと思っています。

![スクリーンショット 2023-05-11 1.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/820a2770-131c-ed83-7562-9f727689a3d1.png)

https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user

![貼り付けた画像_2023_05_20_18_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/4bfe5307-d8ed-0b10-1c7a-d222a0ae66e4.png)
図:ボタンクリックでクエリ結果プレビュー表示の例

![貼り付けた画像_2023_05_20_18_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/3b0a443e-ebcd-e11b-ada5-734621952c26.png)
図:ボタンクリックでビルドできる例
※upsteramを含めてのビルドなどはボタンでできないのでdbt runコマンドを手動で打ってます

### Wizard of dbt Core
Wizard of dbt Core では、dbt向けsqlを書くときのさまざまな便利機能が提供されています。

- クエリプレビュー
- SQLからrefへの変換
- エラー強調
- 列、テーブル、参照の自動補完
- 関数シグネチャのヘルプ


![スクリーンショット 2023-05-11 1.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/e98926c9-d705-c4a3-f1c8-096cd71947fd.png)

https://marketplace.visualstudio.com/items?itemName=Fivetran.dbt-language-server

### SQLFluff
SQLFluffはSQLのlint, formatを行ってくれる拡張機能です。
`.sqlfluff`ファイルを編集することでsqlのフォーマットルールを決めることができます。
dbtのフォーマットにも対応しています。

設定方法はこちらをご参照ください。

https://qiita.com/zackey2/items/c924f121d4047c339831

## その他の Visual Studio Code の便利機能
### Git
VSCodeにはgit機能が含まれています。本家dbt Cloudにもgit機能がありGUIでブランチ操作やGitコミットができますが。VSCodeのgit機能はリベースやファイル単位での操作など複雑なgit操作ができます。

### GitHub
GitHub拡張機能では、GitHubのPullRequest作成や、PullRequestのCheckoutができます。
このような機能はdbt Cloudにはない機能なので便利です。

![スクリーンショット_2023-05-11_2_07_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/dd214f2a-2a5c-036f-7b94-15592f56679f.png)

### GitHub Copilot
GitHub Copilotは、AIペアプログラマーによるオートコンプリートができます。
dbtプロジェクトについてもsqlやyamlの保管で便利に使うことができます。
（GitHub Copilotは、テーブル構造を理解してないため、バッチリ正しいSQLが出てくることは稀ですが、JOIN句のON句部分を自動補完してくれたり時折便利です。）

https://docs.github.com/ja/copilot/overview-of-github-copilot/about-github-copilot-for-business

### Live Share
Live Shareは共同作業のための機能です。
ペアプログラミングを行うときに試験的に使っています。

https://visualstudio.microsoft.com/ja/services/live-share/

# ビルドジョブ実行機能の構築

dbt Cloudにはジョブ機能があり、いつどのようなビルドをするか設定し自動でビルドを行うことができました。
dbt-coreには当然ジョブ機能がないので、別のところで実行してあげる必要があります。
弊社の場合は、GitHub ActionsとTroccoワークフローにて実行するように設定しました。


## Github Actionsでbuild実行

GitHub Actionsを使い、dbt buildを行うワークフローを設定しました。
PullRequestがmainブランチにマージされたタイミングで起動し、dbt buildを行います。
この時点で`dbt test`が落ちた場合、slack通知されるようになっています。

以下のactionを利用しています。
https://github.com/mwhitaker/dbt-action

また、このアクションで`dbt docs`の生成もしていて、静的サイトとしてデプロイされ、閲覧できるようにセットアップしています。

## Troccoでのbuild実行
弊社ではTroccoというETLツールを利用しており、
Troccoのワークフロー機能で、定期的にBigQueryへのデータ転送を行なっています。
Troccoにはdbt連携機能を用いることで、データパイプラインの一部としてdbtのビルドを組み込むことで、データの最新性を保つようにしました。

![スクリーンショット_2023-05-11_2_19_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/40c5200b-9746-ba19-4c70-b4d1a5d0d6c9.png)

https://documents.trocco.io/docs/about-dbt-integration

# まとめ
dbt Cloudは非常に便利なツールであり、多くの機能を提供しています。しかし、そのコストは全ての企業や開発チームが負担できるものではありません。そのため、我々は様々な工夫をしてdbtのローカル開発環境を整えることに成功しました。

この記事が、同じ問題に直面している他の開発チームにとって、何らかの参考になれば幸いです。
また、「うちのチームではこういうツールも使ってるよ！ 」といったご意見があればぜひ教えていただきたいです。