
dbt Projects on SnowflakeでGitHubと連携した開発を試してみた
さがらです。
先日、Snowflakeアカウント内でdbtの開発・実行ができるdbt Projects on Snowflakeがリリースされました。私も1つ試してみた記事を書いています。
このdbt Projects on Snowflakeにおいて、GitHubを連携した場合にどのような開発プロセスとなるのかを試してみたので、その内容をまとめてみます。
やること
下図のdbt Cloudで動作させていたプライベートリポジトリをWorkspace上にフォークして、一般的なGit操作を行ってみます。Snowflake上でデータベースなどは事前に作成済とします。
今回は元々dbt Cloudで開発していたリポジトリを使用していますが、2025/7/2時点ではドキュメントにもあるように、空のGitリポジトリには接続できず、何かしらのコミットをしたリポジトリでないと連携ができないため、ご注意ください。
GitHubとの統合のための手順などは、以下の公式ドキュメントを参考に行っていきます。
前提条件:セカンダリロールの有効化
dbt Projects on Snowflakeが動作するWorkspaceではセカンダリロールの有効化が必要です。
対象のユーザにおいて、以下のクエリを実行して有効化しておきます。
alter user my_user set default_secondary_roles = ('all');
GitHubでpersonal access tokenを取得しSnowflakeでsecretとして登録
GitHubのプライベートリポジトリと接続するため、GitHubで取得したpersonal access tokenをsecretとして登録します。
GitHubでpersonal access tokenを取得
GitHubの右上の自分のアカウントをクリックし、Settings
⇛Developer settings
⇛Personal access tokens
内のFine-grained tokens
を押します。
右上のGenerate new token
を押します。
設定項目について、Repository access
までは任意の内容を入力してください。下図は私の例です。
設定項目のPermissionsについては、Repository permissionsで以下の項目を設定しました。(これで事足りるかは正直私もわかっていないです…)
- Read and write
- Actions
- Contents
- Pull requests
- Issues
- Workflows
- Read-only
- Metadata
このPermissionsの設定を行うと、下図のように表示されるはずです。問題なければ、Generate token
を押します。
すると下図のように発行したトークンが表示されますので、コピーして控えておきます。
Snowflakeでsecretとして登録
続いて、取得したGitHubのpersonal access tokenをSnowflakeでsecretとして登録します。
use role sagara_admin_role;
use database sagara_security_db;
create schema secrets_list;
use schema secrets_list;
create secret sagara_personal_github
type = password
username ='your-gh-username'
password = 'YOUR_PERSONAL_ACCESS_TOKEN';
登録したsecretを用いてGitHubへのAPI Integrationを作成
次に、登録したsecretを用いてGitHubへのAPI Integrationを作成します。
use role accountadmin;
create or replace api integration sagara_personal_github_integration
api_provider = git_https_api
api_allowed_prefixes = ('https://github.com/')
allowed_authentication_secrets = (sagara_security_db.secrets_list.sagara_personal_github)
enabled = true;
-- dbtで使用するロールに権限付与
grant usage on integration sagara_personal_github_integration to role sagara_admin_role;
dbtやGitHubからパッケージを取得するためのNetwork RuleとExternal Access Integrationの作成
dbtでは、外部のパッケージを利用するためにdbt Package hubやGitHubにアクセスする必要があります。
そのために、Network RuleとExternal Access Integrationを作成します。
-- Network Ruleの作成
use role sagara_admin_role;
use database sagara_security_db;
create schema network_rules;
use schema network_rules;
create or replace network rule sagara_dbt_network_rule
mode = egress
type = host_port
-- minimal url allowlist that is required for dbt deps
value_list = (
'hub.getdbt.com',
'codeload.github.com'
);
-- External Access Integrationの作成
use role accountadmin;
create or replace external access integration sagara_dbt_ext_access
allowed_network_rules = (sagara_dbt_network_rule)
enabled = true;
-- dbtで使用するロールに権限付与
grant usage on integration sagara_dbt_ext_access to role sagara_admin_role;
GitHubのプライベートリポジトリをWorkspace上にフォーク
ここまでの内容で事前準備を終えたので、GitHubのプライベートリポジトリをWorkspace上にフォークします。
Workspaceを立ち上げて、一番左上のWorkspace名をクリックし、From Git repository
を押します。
設定用の画面が立ち上がるため、以下の内容に沿って記入し、Create
を押します。
Repository URL
- GitHub上で確認できる、対象リポジトリのHTTPS URLを記入
- 例:
https://github.com/my-github-account/getting-started-with-dbt-on-snowflake.git
API integration
- 先ほど作成したAPI integrationを指定
Credentials secret
- 先ほど作成したSecretを指定
すると、下図のように対象のリポジトリがWorkspaceに連携できました!
おまけ:dbt Cloudで稼働させていたリポジトリをdbt Projects on Snowflakeで動作させるために、profiles.ymlを追加
これはおまけですが、今回dbt Cloudで稼働させていたリポジトリとなるため、dbt Coreが動作するdbt Projects on Snowflakeではこのままの形では動作しません。
そのため、リポジトリのルート階層にprofiles.yml
を作成します。
まず、新しいブランチを作成します。
次に、dbt_project.yml
を開き、profile
の値を確認します。これをキーとしてprofiles.yml
を作成していきます。
この上で、下記のようにprofiles.yml
を作成します。
dbt Cloudでいうと、dev
がDevelopment Environment
、prod
がProduction Environment
に該当します。dev
やprod
は、dbt Cloudでも設定できるtarget name
となります。普段ご利用のtarget name
に合わせて設定しましょう。
snowflake-sagara:
target: dev
outputs:
dev:
type: snowflake
role: SAGARA_ADMIN_ROLE
warehouse: SAGARA_DBT_DEV_WH
database: SAGARA_DBT_DEMO_DB
schema: DBT_SSAGARA
account: ''
user: ''
prod:
type: snowflake
role: SAGARA_ADMIN_ROLE
warehouse: SAGARA_DBT_DEV_WH
database: SAGARA_DBT_DEMO_DB
schema: PRODUCTION
account: ''
user: ''
ここまでの設定を行うと、profileを選択できるようになるため適当にCompileを実行してみると、無事に成功しました。
新しいモデルを開発してプルリクエスト~マージを行う
この状態で、新しいモデルを開発してプルリクエスト~マージを行ってみます。
ブランチ作成
まず、新しいブランチを切ります。(先ほどの「おまけ」章でブランチを切っている場合はそのブランチをそのまま利用できますので、不要です。)
新規のモデル(sqlファイル)の開発
ここでは簡易的に、既存のmarts
フォルダの.sqlファイルの名前だけを変えて作成します。
リネージを確認するため、一度Compileを実行してみます。すると、DAG
タブに下図のようにリネージが表示されました。
次に、Profileはdev
のままで、Buildをしてみます。すると、dev
の出力先スキーマとして設定したDBT_SSAGARA
にテーブル・ビューが作られました。
Mainブランチへの反映
これで新しいテーブルを作るためのsqlファイルが無事にできたので、Mainブランチに反映させていきます。
Workspaceの左上のChanges
を押して、Push
を押します。
任意のコミットメッセージを入れて、Push
を押します。これでGitHub上のリポジトリに、作成したブランチが反映されました。
次に、GitHubでMainブランチに対してプルリクエストを発行します。
GitHubのリポジトリへのリンクですが、Workspaceの下図の箇所からもリンク可能です。
GitHubに入ったら、後は通常のプルリクエスト~マージの流れを行います。(余談ですが、dbt CloudでCI Jobsを設定していると、dbt CloudからのプルリクエストでなくてもCI Jobsが実行されました。)
この後、Workspaceの画面に戻り、main
ブランチに切り替えると、先ほどブランチを切って開発したsqlファイルが無事に反映されていました!
WorkspaceからSnowflakeアカウントへdbt Projectsをデプロイする
dbt Projects on Snowflakeでは、対象のdbt Projectsをタスクで実行するために、Snowflakeアカウントにデプロイする必要があります。
右上のConnectからDeploy dbt project
を押します。
任意のデータベースとスキーマを指定し、作られるdbt projectオブジェクトの名前も指定して、Deploy
を押します。
すると、下図のように表示されます。
この後に対象のデータベース・スキーマを見ると、dbt projectオブジェクトが作成されていることがわかります。
このdbt projectsオブジェクトを使うことで、以下のようなタスクを定義することで、タスクからdbtを実行することが可能です。(以下のクエリは公式Docから引用)
create or replace task tasty_bytes_dbt_db.dev.run_prepped_data_dbt
warehouse=tasty_bytes_dbt_wh
schedule ='using cron 1 * * * * america/los_angeles'
as
execute dbt project tasty_bytes_dbt_project args='run --select customer_loyalty_metrics --target prod';
おまけ:新規開発後、再度デプロイする方法
実際には、一度dbt projectsオブジェクトのデプロイを行っていて、その後に追加で開発して再度dbt projectsオブジェクトに最新の内容を反映させたい、というケースが多いと思います。
その場合には、Workspaceで右上のデプロイを行ったメニューから、Redeploy dbt project
を押して再度デプロイを行えばOKです!
最後に
dbt Projects on Snowflakeにおいて、GitHubを連携した場合にどのような開発プロセスとなるのかを試してみたので、その内容をまとめました。
GitHubの連携自体もそこまで大変ではなく、ブランチを切る操作やGitHubへのプッシュなどもGUIベースで行えるので、非常に良いdbtの開発体験だと思いました!ぜひ、お試しください。