こんにちは、中村です。
ついにdbt Projects on Snowflakeが使えるようになりましたね。
というわけで、今回は既存のdbtプロジェクトをSnowflake上で編集・実行する方法を解説します!
目次
dbt Projects on Snowflakeについて
公式ドキュメントによると、主な機能は以下の通り
- Web画面(Workspaces)で開発:Git連携もでき、ファイルをブラウザ上で編集。
- SQLやCLIでも実行可能:
EXECUTE DBT PROJECT
やsnow dbt run
などで dbt コマンドをSnowflakeから実行。 - バージョン管理付き:自動でバージョンを管理。切り替えも可能。
- スケジュール実行OK:Snowflake Tasksで定期実行できる。
- ログや実行履歴が見える:Snowsightでモニタリングできる。
個人的にはスケジュール実行できるのはほかのツールを入れなくて済むので、とてもありがたいですね。
dbt Projects on Snowflakeを使ってみた
先述の通り今回は既存プロジェクトをSnowflakeのワークスペースで実行する方法について解説していきます。
今回もSnowflake公式ハンズオンを参考にしていますが、今回の解説では、ハンズオン資料とは異なる既存のdbtプロジェクトを使用します。
準備
まずはSnowflakeのワークスペースが使えるようにしましょう。
以下をSQLワークシートで実行
ALTER USER ユーザー名 SET DEFAULT_SECONDARY_ROLES = ('ALL');
次にGitリポジトリを見るためのAPI統合と、dbt deps用に外部統合の設定をします。
API統合はGitHubからPATを取得してSECRETを作成します。
GitHubからPATを取得する方法
GitHubにサインイン後、右上の自分のアイコンをクリック、Setting → Developer Setting → Personal access tokens → Fine-grained tokensを選択、Generate new tokensから作成します。 公式ドキュメント
以下をSQLワークシートで実行
use role sysadmin;
--WH、データベース、スキーマを設定
use warehouse NAKAMURA_WH;
create database NAKAMURA_DB;
create schema if not exists dbt_test;
use schema NAKAMURA_DB.dbt_test;
--API統合の設定(既存プロジェクトの編集用)
-- SECRETの作成
CREATE OR REPLACE SECRET RDTEAM.dbt_test.nakamura_git_secret
TYPE = password
USERNAME = 'Nakamura*****' --GitHubのユーザー名
PASSWORD = 'github_pat_**********************************'; --作成したGitHubのPAT
-- API統合の作成
CREATE OR REPLACE API INTEGRATION git_api_integration_nakamura
API_PROVIDER = git_https_api
API_ALLOWED_PREFIXES = ('https://github.com/Nakamura*****')
ALLOWED_AUTHENTICATION_SECRETS = (nakamura_git_secret)
ENABLED = TRUE;
GRANT USAGE ON INTEGRATION git_api_integration_nakamura TO ROLE NAKAMURA;
CREATE EXTERNAL ACCESS INTEGRATION my_ext_access_integration
ALLOWED_NETWORK_RULES = (my_network_rule)
ALLOWED_AUTHENTICATION_SECRETS = (my_secret)
ENABLED = TRUE;
--外部統合の設定(dbt deps用)
CREATE OR REPLACE NETWORK RULE NAKAMURA_DB.dbt_test.dbt_network_rule
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = ('hub.getdbt.com', 'codeload.github.com'); --package.ymlに記載した外部パッケージのドメインを入力
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION dbt_access_integration
ALLOWED_NETWORK_RULES = (NAKAMURA_DB.dbt_test.dbt_network_rule)
ENABLED = true;
GRANT USAGE ON INTEGRATION DBT_ACCESS_INTEGRATION TO ROLE NAKAMURA;
-- タスクを実行可能にする権限を付与(スケジュール実行用)
GRANT EXECUTE TASK ON ACCOUNT TO ROLE NAKAMURA;
また、今回僕はこちらのdbt公式リポジトリをフォークして使っています。手元に既存プロジェクトがない場合は、こちらを使えます。
実際に使ってみる
ワークスペース>ワークスペース名>ワークスペースの作成、Gitリポジトリからを選択

つづいて既存プロジェクトのリポジトリURLを入力し、先ほど作成したAPI統合を選択

プロジェクトが表示されましたね。

プロジェクトが表示されたら、まずはprofiles.ymlを作成しましょう。
既存プロジェクトの場合、Coreの場合ローカルの.dbt配下にあり、Cloudの場合SaaS自体で設定するので、プロジェクト内にはないはずです。
新規追加からprofiles.ymlを追加を選択

既存のprofiles.ymlをそのままコピペしましょう。
ここからは、コマンド実行をしていきます。
dbt Projects on SnowflakeはGUIでコマンドが実行できます!
各コマンドについて
・コンパイル dbt形式(jinja形式)のSQLをコンパイルすることでリネージ(DAG)がわかる ・テスト dbt testに相当 YAMLに書いたテストをすることができる ・依存関係 dbt depsに相当 外部パッケージを使っている場合、package.yamlに記載してdbt build/runの実行前にdbt depsをする必要がある ・表示 dbt showに相当 ・リスト dbt listに相当 dbt project内のリソースの一覧表示ができる ・実行 dbt runに相当 モデルを作成できる ・ビルド dbt buildに相当 dbt seed/run/testを一括でできる ・シード dbt seedに相当 seedsファイルにあるcsvをテーブル/ビュー化できる ・スナップショット dbt snapshotに相当 時系列での履歴管理を目的としたテーブル(スナップショット)を作成・更新できる ・操作を実行 run-operationに相当 カスタムマクロ(macro)を実行するためのコマンド
プロジェクト内に外部パッケージを使用しているので、dbt depsを実行します。
実行に外部統合の選択が必要なので、先ほど作成した外部統合のdbt_access_integrationを選択して実行

次にコンパイルを実行します。

これでプロジェクト内のリネージを見ることができます。

続いてdbt buildをしていきます。

実行すると僕のプロジェクトでは下の様になりました。

ちなみに、dbt_project.ymlには以下の様に記載をしています。

テストの方も問題なくパスしているようですね。

無事実行できたのでデプロイしましょう!
右上の接続からdbtプロジェクトをデプロイを選択

デプロイするデータベースとスキーマを選択し、dbtプロジェクトの作成を選択、プロジェクト名を入力しましょう

これでデプロイ完了です。
スケジュールジョブの作成と実行
先ほどと同じように接続を選択し、スケジュールを作成を選択

スケジュールは毎時/毎日/毎週/毎月/カスタム(CRON形式)の中から選択できます。
コマンドは1つしか実行できないようなので、今回はbuildを選択しました。

スケジュールしたジョブの実行結果はモニタリング>dbtプロジェクトから確認できます

まとめ
今回は、既存のdbtプロジェクトを使って、dbt Projects on Snowflakeを実際に試してみました!
Snowflakeでもほかのエディター同様にdbtプロジェクトが使えるので、わざわざ画面を切り替える必要がなく、さくさく作業ができていいですね。
今回ご紹介したdbt Projects on Snowflakeと直接併用はできませんが、dbt Fusionや各種拡張機能も非常に便利です。今回の記事でdbtにも興味を持っていただけた方はぜひこちらの記事もご覧ください!