dbt Core と dbt platform を併用する開発環境構築を試してみた
はじめに
dbt Core と dbt platform(旧 dbt Cloud)を併用する環境構築を試してみましたので、その内容を記事としました。
前提条件
dbt の役割
ここでは、dbt Core と dbt platform の併用を試してみますので、それぞれ以下の用途で使用することとします。
- dbt Core
- 開発環境として使用
- dbt platform
- 本番環境へのデプロイを行う
- dbt platform ではジョブとして開発環境以外へのデプロイを行い、そのスケジュール実行なども可能なため
検証環境
以下の環境を使用しています。
- WSL2 + Ubuntu 22.04 + bash
- Python/依存管理の方針
- 依存は
pyproject.tomlとuv.lockで固定し、両方をコミットする
- 依存は
- dbt コマンド実行は
uv run dbt …とする - リポジトリ構成
- 以降でも記載しますが、基本構成は以下としました
repo-root/
pyproject.toml
uv.lock
my_dbt_project/ # dbt_project.ymlがあるディレクトリ
dbt_project.yml
models/
- シークレットの管理
- profiles.yml はリポジトリに配置しない
- 各ユーザーの
~/.dbtに配置(~/.dbt/profiles.yml)
- 各ユーザーの
- profiles.yml 内の値は env_var() 経由で渡す
- Snowflake への認証方式:キーペア
- 秘密鍵はリポジトリ外に配置(例:
~/.snowflake/rsa_key.p8)
- 秘密鍵はリポジトリ外に配置(例:
- profiles.yml はリポジトリに配置しない
- DWH:Snowflake
- バージョン管理システム:GitHub(SaaS)を使用
Snowflake 上の環境分離
Snowflake 側で以下のように環境を用意します。
- 環境分離:データベースレベル
- 本番環境:
prd_dbprdスキーマにモデルを作成
- 開発環境:
dev_db- 開発者ごとに
dbt_userスキーマにモデルを作成
- 開発者ごとに
- 本番環境:
それぞれ以下の内容で環境を用意しています。
USE ROLE SYSADMIN;
-- 変数の設定:dev または prd
SET env_name = 'dev'; # 開発環境
-- SET env_name = 'prd'; # 本番環境
SET db_name = concat($env_name,'_db');
SET schema_name = concat($db_name,'.raw');
SET wh_name = concat($env_name,'_dbt_whs');
SET role_name = concat($env_name,'_dbt_role');
-- warehouses作成
CREATE WAREHOUSE IF NOT EXISTS identifier($wh_name)
WITH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED = TRUE;
-- 基本データベースとスキーマ作成
CREATE DATABASE identifier($db_name);
CREATE SCHEMA identifier($schema_name); -- rawデータ用スキーマ
-- 権限付与
-- ロール作成
USE ROLE SECURITYADMIN;
CREATE ROLE identifier($role_name);
GRANT ROLE identifier($role_name) TO ROLE SYSADMIN;
-- 権限付与:warehouse
GRANT USAGE,OPERATE ON WAREHOUSE identifier($wh_name) TO ROLE identifier($role_name);
-- 権限付与:rawデータへの読み取り
GRANT USAGE ON DATABASE identifier($db_name) TO ROLE identifier($role_name);
GRANT USAGE ON SCHEMA identifier($schema_name) TO ROLE identifier($role_name);
GRANT SELECT ON ALL TABLES IN SCHEMA identifier($schema_name) TO ROLE identifier($role_name);
GRANT SELECT ON FUTURE TABLES IN SCHEMA identifier($schema_name) TO ROLE identifier($role_name);
GRANT SELECT ON ALL VIEWS IN SCHEMA identifier($schema_name) TO ROLE identifier($role_name);
GRANT SELECT ON FUTURE VIEWS IN SCHEMA identifier($schema_name) TO ROLE identifier($role_name);
-- 権限付与:スキーマの作成権限
GRANT CREATE SCHEMA ON DATABASE identifier($db_name) TO ROLE identifier($role_name);
事前準備
Snowflake とのキーペア認証
dbt 経由での認証に使用する Snowflake ユーザーに、キーペア認証のための設定を行います。
秘密鍵を作成し、ユーザーに公開鍵を設定しておきます。
ALTER USER <user名> SET RSA_PUBLIC_KEY = 'MII・・・';
こちらの手順は以下の記事が参考になります。
初回のセットアップ
はじめに、uv を使用するプロジェクトを作成します。
uv init example-dbt-project --bare
cd example-dbt-project
git init
続けて dbt を追加します。バージョンについて、ここでは最新の Compatible トラックに揃える形としました。
uv add "dbt-core==1.10.15" "dbt-snowflake==1.10.3"
uv sync
$ cat pyproject.toml
[project]
name = "example-dbt-project"
version = "0.1.0"
requires-python = ">=3.11.9"
dependencies = [
"dbt-core==1.10.15",
"dbt-snowflake==1.10.3",
]
.gitignoreを作成します。
touch .gitignore
参考までに、プロジェクトルートに配置した.gitignoreについて、ここでの最終的な内容は以下のようにしました。
.venv/
__pycache__/
*.pyc
# settings
.vscode/settings.json
# local secrets
.env
.env.*
!.env.example
# Log files
logs/
*.log
dbt プロジェクトを作成
プロジェクトディレクトリで dbt initを実行し、dbt プロジェクトを作成します。
uv run dbt init my_dbt_project
上記を実行すると現在のディレクトリ配下に、指定のプロジェクト名からなるディレクトリが作成されます。
また、あわせて~/.dbt にprofiles.ymlが作成されます。
$ uv run dbt init my_dbt_project
03:01:43 Running with dbt=1.10.15
03:01:43 Creating dbt configuration folder at /home/<user>/.dbt
03:01:43
Your new dbt project "my_dbt_project" was created!
For more information on how to configure the profiles.yml file,
please consult the dbt documentation here:
https://docs.getdbt.com/docs/configure-your-profile
One more thing:
Need help? Don't hesitate to reach out to us via GitHub issues or on Slack:
https://community.getdbt.com/
Happy modeling!
その後編集し、profiles.ymlの内容は以下のようにしました。
my_dbt_project:
target: "{{ env_var('DBT_TARGET', 'dev') }}"
outputs:
dev:
type: snowflake
account: "{{ env_var('DBT_SNOWFLAKE_ACCOUNT') }}"
user: "{{ env_var('DBT_SNOWFLAKE_USER') }}"
role: "{{ env_var('DBT_SNOWFLAKE_ROLE') }}"
database: "{{ env_var('DBT_DATABASE') }}"
warehouse: "{{ env_var('DBT_SNOWFLAKE_WAREHOUSE') }}"
schema: "{{ env_var('DBT_SNOWFLAKE_SCHEMA') }}"
threads: "{{ env_var('DBT_THREADS', 6) | int }}"
authenticator: "snowflake_jwt"
private_key_path: "{{ env_var('DBT_SNOWFLAKE_PRIVATE_KEY_PATH') }}"
private_key_passphrase: "{{ env_var('DBT_ENV_SECRET_SNOWFLAKE_PRIVATE_KEY_PASSPHRASE') }}"
ポイントは以下です。
- 環境について
- 開発環境として dbt Core を使用しますが、本番環境への適用は dbt platform 経由で行うので、他の環境については
profiles.yml上では記載しない
- 開発環境として dbt Core を使用しますが、本番環境への適用は dbt platform 経由で行うので、他の環境については
- ターゲット変数(
target.name)について- dbt Core の場合、この値は
profiles.ymlで定義されたターゲットに基づきます。そのため、開発環境についてはdevが使われます
- dbt Core の場合、この値は
環境変数を読み込み、dbt debugの出力が以下のようになれば問題ないです。
$ uv run dbt debug
14:21:40 Running with dbt=1.10.15
14:21:40 dbt version: 1.10.15
14:21:40 python version: 3.11.9
・
・
・
14:21:40 adapter type: snowflake
14:21:40 adapter version: 1.10.3
14:21:40 Configuration:
14:21:40 profiles.yml file [OK found and valid]
14:21:40 dbt_project.yml file [OK found and valid]
14:21:40 Required dependencies:
14:21:40 - git [OK found]
・
・
・
14:21:40 Connection:
・
・
・
14:21:40 Registered adapter: snowflake=1.10.3
14:21:42 Connection test: [OK connection ok]
14:21:42 All checks passed!
dbt run を実行してみます。
$ uv run dbt run
14:22:47 Running with dbt=1.10.15
14:22:47 Registered adapter: snowflake=1.10.3
14:22:47 Unable to do partial parsing because saved manifest not found. Starting full parse.
14:22:49 Found 2 models, 4 data tests, 508 macros
14:22:49
14:22:49 Concurrency: 6 threads (target='dev')
14:22:49
14:22:50 1 of 2 START sql table model dbt_tyasuhara.my_first_dbt_model .................. [RUN]
14:22:51 1 of 2 OK created sql table model dbt_tyasuhara.my_first_dbt_model ............. [SUCCESS 1 in 1.36s]
14:22:51 2 of 2 START sql view model dbt_tyasuhara.my_second_dbt_model .................. [RUN]
14:22:52 2 of 2 OK created sql view model dbt_tyasuhara.my_second_dbt_model ............. [SUCCESS 1 in 0.77s]
14:22:52
14:22:52 Finished running 1 table model, 1 view model in 0 hours 0 minutes and 3.61 seconds (3.61s).
14:22:52
14:22:52 Completed successfully
14:22:52
14:22:52 Done. PASS=2 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=2
プロジェクト初期化時にサンプルで含まれるモデルが、指定のデータベース・スキーマに作成されました。

リモートリポジトリとの連携
GitHub 側で空のリポジトリを作成し、ローカル側で初回 push をします。
cd ~/example-dbt-project
git status
git add .
git commit -m "Init dbt project"
git remote add origin git@github.com:<user>/<repo>.git
git branch -M main
git push -u origin main
dbt platform 側の設定
ここまで、開発環境として dbt Core の設定を行いました。本番環境へのデプロイには dbt platform を使用します。
Connection を作成
dbt platform ではコネクションで DWH への接続を管理するため、コネクションを作成します。
プロジェクトを作成
続けて、dbt platform 上でプロジェクトを作成します。主な設定は以下です。
-
Project name:任意の名称(あくまで dbt platform 上の名称。後から変更も可能)
-
Project subdirectory
- ここでは以下の構成なので「my_dbt_project」と指定しました
dbt_project.ymlのないルート階層を指定すると dbt platform の開発環境である Studio を開いた際に Git 関連操作として、初期化の項目が表示されるため
$ tree -L 2 . ├── my_dbt_project │ ├── README.md │ ├── analyses │ ├── dbt_project.yml │ ├── logs │ ├── macros │ ├── models │ ├── seeds │ ├── snapshots │ ├── target │ └── tests ├── pyproject.toml └── uv.lock
dbt platform 上のプロジェクト作成とあわせて、その操作ユーザーの Developrment Credential を指定する必要があります。この際、Target nameのデフォルトがdefaultなので dbt Core と一致(ここではdev)するように注意します。
リポジトリには、作成済みの Git リポジトリを指定すればセットアップ完了です。
環境(本番環境)とジョブを作成
先の手順では、dbt platform におけるプロジェクトと開発環境があわせて作成されます。異なる環境へのデプロイを行うために、以下の内容で本番環境を作成しました。
- 本番環境用のコンテキスト
- データベース:PRD_DB
- ロール:PRD_DBT_ROLE
- ウェアハウス:PRD_DBT_WHS
- Deployment credentials
- スキーマ:prd
dbt platform における開発環境以外の環境へのデプロイは、ジョブを経由します。そのため、あわせて本番環境へのデプロイジョブを以下の内容で作成しました。
- 名前:my_deploy_job
- ※名前は後からでも変更可能
- Target name:
prd - その他はデフォルト(実行コマンドは
dbt build)
本番環境へのデプロイジョブを実行
ジョブを実行前の本番環境は以下のようになっています。

dbt プロジェクトの初期化段階では、サンプルのテストが含まれており、dbt buildはエラーとなるので、サンプルで作成される schema.ymlのdata_testsの項目を削除します。
以下の操作はローカルの開発環境で行います。
git switch main
git pull origin main
uv sync # 依存が更新されている可能性があるので
# 新しいブランチを作成し移動
git switch -c feature/my-change
$ cd my_dbt_project/
# schema.ymlのdata_testsの項目を削除
# dbt build が問題なく実行されるかローカルで検証
$ uv run dbt build
01:27:30 Running with dbt=1.10.15
01:27:31 Registered adapter: snowflake=1.10.3
01:27:32 Found 3 models, 508 macros
01:27:32
01:27:32 Concurrency: 6 threads (target='dev')
01:27:32
01:27:34 1 of 3 START sql table model dbt_tyasuhara.my_first_dbt_model .................. [RUN]
01:27:34 2 of 3 START sql table model dbt_tyasuhara.my_first_dbt_model2 ................. [RUN]
01:27:36 1 of 3 OK created sql table model dbt_tyasuhara.my_first_dbt_model ............. [SUCCESS 1 in 1.61s]
01:27:36 2 of 3 OK created sql table model dbt_tyasuhara.my_first_dbt_model2 ............ [SUCCESS 1 in 1.62s]
01:27:36 3 of 3 START sql view model dbt_tyasuhara.my_second_dbt_model .................. [RUN]
01:27:36 3 of 3 OK created sql view model dbt_tyasuhara.my_second_dbt_model ............. [SUCCESS 1 in 0.33s]
01:27:36
01:27:36 Finished running 2 table models, 1 view model in 0 hours 0 minutes and 4.15 seconds (4.15s).
01:27:36
01:27:36 Completed successfully
01:27:36
01:27:36 Done. PASS=3 WARN=0 ERROR=0 SKIP=0 NO-OP=0 TOTAL=3
問題なく実行できたので、変更をコミット/プッシュし、main ブランチにマージします。
git add .
git commit -m "Describe your change"
git push -u origin feature/my-change

変更をマージ後、dbt platform 上から先の手順で定義したジョブを実行します。

実行結果を確認すると、本番環境に各種モデルが作成されました。
※その他検証時に作成したモデルも含まれています。

その他の設定
環境変数を参照する場合
profiles.yml以外で環境変数を参照する場合、dbt platform からの参照用にdbt platform 上で対象プロジェクトの環境変数を設定できます。
例えば、Source定義ファイルなどで以下のように環境変数で環境ごとに出力や参照先などを動的に制御できます。
version: 2
sources:
- name: raw
description: This is a replica of the Postgres database used by our app
database: "{{ env_var('DBT_DATABASE') }}"
schema: raw
tables:
- name: customers
description: One record per customer.
ローカルでは環境変数を設定しておけばよいです。dbt platform でもこの値を参照する場合、「Orchestration > Environments」の「Environment variables」タブより環境変数を追加できます。

dbt power user の追加
ここではローカルのエディタとして Visual Studio Code を使用しました。拡張機能として「Power User for dbt」が提供されており、こちらを使用するとローカルからリネージの確認やコードの補完などを行えます。
「Extensions」より「Power User for dbt」で検索すると下図が選択できます。

インストール後の設定手順は以下に記載があります。
上記の設定では Git 管理対象から除いていますが、.vscode/settings.json を用意して、以下の内容を追加し、*.sqlと *.ymlを jinja-sql / jinja-yamlとして扱うよう VS Code に設定しました。
※dbt.enableNewLineagePanelはオプションです。有効にするとリネージ図を platform 側のように表示できます。
{
"files.associations": {
"*.sql": "jinja-sql",
"*.yml": "jinja-yaml"
},
"dbt.enableNewLineagePanel": true
}
また、この環境で使用する dbt がインストールされている Python インタープリターを、コマンドパレット等から選択します(Windows の場合はCtrl+Shift+P > Python: Select Interpreterを実行します)。
正しい環境を選択すると VS Code 下部の dbt 表示がチェックマークになるようです。

リネージ図の例:

さいごに
dbt Core と dbt platform を併用する環境構築を試してみました。
本記事の内容がどなたかの参考になれば幸いです。








