dbtのパッケージは、共通マクロ・テスト・モデルを再利用可能にする仕組みです。プロジェクトの生産性を上げる一方で、バージョン固定や依存解決を疎かにすると、本番とローカルで動きがズレる温床になります。
ここでは、公式ドキュメントに基づく安定した運用パターンに絞って、packages.ymlの書き方、dbt depsの挙動、再現性を担保するピン留め戦略、代表的パッケージの活用、よくある落とし穴をまとめます。試験対策メモも各所に挟みます。
dbtのパッケージは、Jinjaマクロ、カスタムテスト、モデル、シードなどを配布・再利用する単位です。プロジェクト直下のpackages.ymlに依存関係を宣言し、dbt depsでdbt_packages/配下に取得します。取得済みのコードはビルド時に参照され、パッケージ名.マクロ名の形式で呼び出します。
パッケージはdbt Hub(公式カタログ)経由のセマンティックバージョン指定、Gitリポジトリのタグ/ブランチ/コミット固定、ローカルパスの3経路で導入できます。再現性と更新容易性のバランスを取りつつ、CI/CDではできる限りピン留めするのが定石です。
マクロ呼び出し例(dbt-utilsのsurrogate_key)
select
{{ dbt_utils.surrogate_key(['customer_id', 'order_date']) }} as order_sk,
*
from {{ ref('stg_orders') }}基本はdbt Hubの安定版をセマンティックバージョンで固定します。長期運用のCI/CDでは、厳密なピン留め(例: 1.1.1)か、互換範囲を明示した上限付き指定(例: ">=1.1.0,<2.0.0")が安全です。機能検証や自作パッケージの共同開発ではGitやローカル参照が有効です。
packages.ymlではJinjaは評価されません。トークン埋め込みのような可変値は使えないため、プライベートGitの認証はSSHデプロイキーやGitクライアント側設定で扱います。
| 取得元 | 記述例 | 更新容易性 | 再現性 |
|---|---|---|---|
| dbt Hub(バージョン) | - package: dbt-labs/dbt_utils\n version: 1.1.1 | 中 | 高(厳密ピン留め時) |
| Git(タグ/コミット) | - git: https://github.com/dbt-labs/dbt-utils.git\n revision: v1.1.1 | 中 | 高(コミット固定時) |
| ローカルパス | - local: ../shared/dbt_utils_fork | 高 | 中(変更が即反映) |
packages.yml の代表的な書き方
packages:
# Hubから厳密ピン留め
- package: dbt-labs/dbt_utils
version: 1.1.1
# Gitからタグ/コミット固定
- git: https://github.com/calogica/dbt-expectations.git
revision: 0.10.4
# ローカル開発用
- local: ../dbt_my_internal_pkgdbt depsは、ルートのpackages.ymlと各パッケージ内のpackages.ymlを読み込み、単一の依存グラフを解決します。同一依存に対して異なる範囲指定が混在する場合、全てを満たす1つのバージョンに解けないとエラーになります。この場合はルート側で上書き指定し、厳密に固定して衝突を解消します。
本番の再現性は、1) Hubは厳密バージョン、2) Gitはコミットハッシュ、3) 変更の少ない期間はベンダリング(必要なマクロを自プロジェクトに取り込み)で担保できます。なお、dbtはpipのような自動ロックファイルは持たないため、ピン留めとレビュー運用が重要です。
dbt deps の流れ(依存解決と取得)
再現性を高める設定例(厳密固定とdispatch)
# packages.yml(厳密固定)
packages:
- package: dbt-labs/dbt_utils
version: 1.1.1
- git: [email protected]:myorg/dbt-internal-macros.git
revision: 3f2c9a1 # コミット固定
# dbt_project.yml(dispatchで安全に上書き)
dispatch:
- macro_namespace: dbt_utils
search_order: ['my_project', 'dbt_utils']dbt-utilsは最も広く使われるユーティリティ集で、キー生成、列の存在チェック、可変SELECTなど日常作業を短縮します。dbt-expectationsはExpectations由来の宣言的テストを提供し、データ品質の初期ガードレールとして有効です。どちらも本番ではバージョンを固定し、メジャーアップグレード時はCHANGELOGを確認します。
演算子や関数の方言差分はアダプタに委ねられるため、SnowflakeやDatabricksなど異なるエンジン間でも同一マクロで動作するケースが多いです。ただし、方言依存のマクロは挙動が異なる可能性があるため、検証環境でのsmokeテストを忘れないでください。
スキーマテスト例(dbt-expectations)
version: 2
models:
- name: fct_orders
tests:
- dbt_expectations.expect_table_row_count_to_be_between:
min_value: 1
- dbt_expectations.expect_column_values_to_be_unique:
column: order_idモノレポでは1つのGitリポジトリに複数のdbtプロジェクト/パッケージを格納します。packages.ymlのsubdirectoryでサブフォルダを指し示せます。開発者がローカルで別パッケージを同時編集する場合はlocal参照を使い、CIではGitのタグやコミット固定に切り替えるのが安全です。
インストール先は既定でdbt_packages/ですが、dbt_project.ymlのpackage-pathsで変更できます。基本は既定のまま、Git管理から除外しておくのが無難です。
モノレポとローカル参照の例
# モノレポ: Git上のサブディレクトリを指す
packages:
- git: [email protected]:myorg/analytics-mono.git
revision: v0.3.0
subdirectory: packages/dbt_common_macros
# ローカル開発時(CIでは使わない)
packages:
- local: ../dbt_common_macros
# dbt_project.yml でのインストール先調整(必要時のみ)
# package-paths: ["dbt_packages"]依存取得の不整合は、dbt cleanでdbt_packages/を削除し、dbt depsで再取得するのが最短です。プライベートGitはpackages.ymlに資格情報を埋め込めないため、SSHデプロイキーまたはGitクライアント設定で解決します。dbt Cloud環境ではジョブが依存を自動インストールする設定になっているか確認します。
試験対策としては、packages.ymlの基本形、dbt depsの役割、マクロの呼び出し方法(package_name.macro_name)、dispatchの意味、HubとGit/ローカルの使い分け、Jinjaがpackages.ymlで使えない点を押さえておくと得点に繋がります。
復旧の定石コマンドと.gitignore
# 依存の取り直し
$ dbt clean
$ dbt deps
# .gitignore
/dbt_packages/
/target/Analytics Engineer
問題 1
本番ジョブで、複数のパッケージがdbt-utilsに異なる範囲指定(>=1.0.0,<2.0.0 と >=1.1.0,<1.2.0)を要求し、開発者ごとに解決結果が変わってビルドが不安定です。最も再現性が高い対処はどれですか?
正解: A
dbtは単一バージョンに解決するため、範囲指定が競合すると環境差や取得タイミングで不安定になります。ルートで厳密固定し、dbt clean→dbt depsで揃えるのが再現性の観点で最適です。取得物のコミットは推奨されません。
dbt Cloudではdbt depsを明示的に実行する必要がありますか?
多くのジョブ設定で依存インストールが自動実行されますが、プロジェクトやジョブの設定次第です。初回やエラー時の復旧ではdbt clean→dbt deps相当の工程が含まれているか確認してください。
packages.ymlで環境変数やJinjaを使って、Gitのトークンを差し込みできますか?
できません。packages.ymlではJinja(env_var含む)は評価されません。プライベートリポジトリはSSHデプロイキーやGitクライアントの認証設定で対応します。
dbt_packages/配下はGitで管理すべきですか?
いいえ。取得物はビルドアーティファクトと同様に都度再取得可能であるため、.gitignoreで除外するのが一般的です。再現性はバージョン固定とCIでのdbt deps実行で担保します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...