[新機能]Snowflakeアカウント内でdbtの開発・実行ができる「dbt Projects on Snowflake」がパブリックプレビューとなりました
さがらです。
私も以下の@mmotohasさんの投稿で知ったのですが、Snowflakeアカウント内でdbtの開発・実行ができる「dbt Projects on Snowflake」がパブリックプレビューとなりました!
早速試してみたので、その内容をまとめてみます。
dbt Projectsとは
改めてdbt Projects on Snowflakeですが、dbtはOSS版をdbt Coreとして提供しており、そのdbt CoreをSnowflakeのプラットフォーム上で直接、作成・実行・管理できるようにする機能です。
(以下は公式ドキュメントへのリンクですが、2025/6/26時点ではLIMITEDACCESSのリンクしかありませんでした。)
どういった機能かを知るには、以下の動画が参考になると思います。
注意点
上述の公式ドキュメントからの引用ですが、2025/6/26時点では以下の制限があります。(最新情報は公式ドキュメントを確認するよう、お願いいたします。)
- dbt Coreのプロジェクトのみサポートしているため、dbt Cloudで開発したリポジトリを使う場合には
profiles.yml
の作成などが必要です。 - Gitパッケージの制限:
packages.yml
ファイルでGitリポジトリを直接指定する形式のパッケージはサポートされていません。 - ファイル数制限: 1つのdbtプロジェクトに含めることができるファイルは20,000個までです。
- 共有不可: dbt Projects on SnowflakeはWorkspaceで動作しますが、Workspaceは個人用データベースに作成されるため、他ユーザーとの共有はできません。
- 設定: Gitリポジトリとの連携や外部パッケージの利用には、API統合や外部アクセス統合といった事前の設定が必要です。
また、今後改善予定の機能として、以下についても言及があります。
- 一部コマンドの未サポート: Workspace内で実行できるdbtコマンドはまだ限定的です(run, testなどはサポート済み)。
- UIの未実装: dbtの実行履歴の表示や、SnowsightのUIを使った実行スケジュール設定は、今後のアップデートで対応予定です。現状、スケジューリングはSQLでSnowflakeタスクを作成する必要があります。
- パフォーマンス改善: dbtプロセスの起動時間を大幅に(20〜40倍)短縮するパフォーマンス改善が予定されています。
試す内容
新規でWorkspace上でdbt Projectsを作成し、dbt Projects on Snowflakeでどのような事ができるかを確認してみます。
検証環境
検証環境は、SnowflakeのAWS東京リージョンの、非トライアルアカウントになります。
セカンダリロールの有効化
dbt ProjectsはWorkspace機能を使うのですが、個々のユーザに紐づくpersonal database上にWorkspaceは作成されます。
以下のクエリを使用するユーザー名に書き換えて実行して、セカンダリロールを有効化します。
ALTER USER my_user SET DEFAULT_SECONDARY_ROLES = ('ALL');
検証用のデータベース・スキーマの作成
以下のクエリを実行して、検証用のデータベース・スキーマを作成しておきます。
USE ROLE SYSADMIN;
CREATE DATABASE SAGARA_DBT_ON_SNOWFLAKE_FIRST_TIME;
GRANT OWNERSHIP ON DATABASE SAGARA_DBT_ON_SNOWFLAKE_FIRST_TIME TO ROLE SAGARA_ADMIN_ROLE;
USE ROLE SAGARA_ADMIN_ROLE;
USE DATABASE SAGARA_DBT_ON_SNOWFLAKE_FIRST_TIME;
CREATE SCHEMA DBT_SSAGARA; -- 開発用
CREATE SCHEMA PRODUCTION; -- 本番用
Workspaceを起動し、dbt Projectsをセットアップ
画面左のメニューから、Workspaceを起動します。
その後、一番左上の項目をクリックし、Create Workspace
から+ New
を押します。
任意の名称をつけて、Workspaceを作成します。
その後、+ Add New
を押し、dbt Project
を押します。
Project Name
、ロール、ウェアハウス、データベース、スキーマを入力します。ここでのデータベースとスキーマは、「dbtで開発時のテスト実行したときの出力先となるデータベースとスキーマ」をいれます。
すると、下図のようにdbtに必要な各フォルダ・ファイルが自動で作成されました!profiles.yml
では、先程入力したロール、ウェアハウス、データベース、スキーマが入っています。
サンプルモデルのリネージを表示してみる
dbt Projectsのセットアップ時、models
フォルダにはデフォルトでmy_first_dbt_model.sql
とmy_second_dbt_model.sql
が入っています。
このサンプルモデル同士のデータのリネージを確認するため、右上がCompile
になっていることを確認した上で、横のボタンを押します。
すると、WorkspaceのOutput欄にてログが表示されます。
このあと、ブラウザを更新するとDAG欄が追加され、リネージを見ることができます。(私が試したときは、ブラウザを更新しないとDAG欄が追加されませんでした。)
サンプルモデルをビルドしてみる
先ほどリネージを確認したサンプルモデルについてSnowflakeに反映させるため、一度ビルドを行ってみます。
右上のCompile
となっているところを、Build
に変更し、右側のボタンを押します。
すると、WorkspaceのOutput欄にてログが表示されます。
この上で、作成したデータべース・スキーマを見てみると、サンプルのモデルがビルドされて反映されていることがわかります。
本番用のスキーマのprofileを追加する
このあと実際にdbt Projects on SnowflakeをSnowflakeのタスクとして実行するために、本番用のスキーマに対するprofileを追加しておきます。
今回は下図赤枠のように追加しておきました。これで、Workspace上部のProfile
から、prod
も選択できるようになりました。
WorkspaceからSnowflakeアカウントへdbt Projectsをデプロイする
dbt Projects on Snowflakeでは、対象のdbt Projectsをタスクで実行するために、Snowflakeアカウントにデプロイする必要があります。
右上のConnectからDeploy dbt project
を押します。
任意のデータベースとスキーマを指定し、Select or create dbt project
ではCreate dbt project
を選択し、任意の名称をいれます。
すると、下図のように表示されます。
実際にデプロイ先のスキーマを見てみると、指定した名前でdbt Projectsがデプロイされています。
デプロイしたdbt Projectsを元にタスクを作成・実行
デプロイしたdbt Projectsを元にタスクを作成・実行してみます。
任意のワークシートを立ち上げ、以下のクエリを実行してタスクとして作成します。ポイントは、--target prod
とすることで、本番用のスキーマに対して操作が行われるようにしています。
CREATE OR ALTER TASK sagara_dbt_on_snowflake_first_time.production.dbt_execute
WAREHOUSE = sagara_dbt_prod_wh
SCHEDULE = 'USING CRON 0 9 1 1 * Asia/Tokyo'
AS
EXECUTE DBT PROJECT sagara_dbt_on_snowflake_first_time.production.sagara_dbt_deployment_first_time args='build --target prod';
このあと、以下のクエリを実行してタスクを手動実行します。
EXECUTE TASK sagara_dbt_on_snowflake_first_time.production.dbt_execute;
タスクが無事に完了すると、本番用のスキーマに対してテーブルとビューが作成されていることがわかります。
最後に
Snowflakeアカウント内でdbtの開発・実行ができる「dbt Projects on Snowflake」がパブリックプレビューとなったので、早速試してみました!
dbt Cloudに慣れている私ですが、特に問題なく開発できました。Snowflakeアカウント内でdbtの開発~本番実行が全て完結するというのが凄いですね…
今回はGitHubと連携しませんでしたが、今度はGitHubと連携した場合にどのような開発プロセスとなるかも検証してみたいと思います!