Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2026-02-25 Tokyo dbt meetup プロダクトと融合したCI/CD で実現...

2026-02-25 Tokyo dbt meetup プロダクトと融合したCI/CD で実現する、堅牢なデータパイプラインの作り方

プロダクトと融合したCI/CD で実現する、堅牢なデータパイプラインの作り方
robust data pipeline using CI, CD integrated with the product

Avatar for Kentaro Yoshida

Kentaro Yoshida

February 25, 2026
Tweet

More Decks by Kentaro Yoshida

Other Decks in Technology

Transcript

  1. © Commune Inc. All rights reserved ⾃⼰紹介 Communeのデータエンジニア。ex-TreasureData • 2024年6⽉よりコミューンへ⼊社

    • Product & Dataチームに所属(約10⼈) MLコンペ上位の機械学習エンジニアも多数在籍 • データ利活⽤業務の下記1〜2の上流領域を担当 1. データ活⽤戦略・アーキテクチャ設計・プロセス標準化 2. 基盤整備・データ処理パイプライン構築 3. データ分析・活⽤⽀援・ダッシュボード提供 Kentaro Yoshida (X: @yoshi_ken) 2
  2. ©Commune Inc. All rights reserved 4 BASEFOOD 様 SHE 様

    Sansan 様 日本ハム 様 ENEOS 様 オタフクソース 様 トリドール 様 メディカルシステム ネットワーク 様 オリジナルアプリ導⼊実績 (⼀部抜粋) コミューンのサービス概要 プロダクト_主要機能
  3. ©Commune Inc. All rights reserved 5 信頼がもたらす確かな成果 ※ 2026年時点 売上効果

    2.6億円 広告効果 年間 億円 1 ⾃然検索獲得 6万件 ファン発信で 認知効果 200%超 エンゲージメント サーベイ 110%向上
  4. ©Commune Inc. All rights reserved dbt CI/CD だけでは守れないもの 課題 具体例

    リスク スキーマ変更 検知漏 れ RDB でカラムリネーム → dbt モデルが壊れる 本番 ダッシュボードが止まる メタデータ 二重管理 RDB コメントと dbt description が乖離 ドキュメントを信用できなくなる 反映タイムラグ スキーマ変更 → dbt手動修正 → デプロイ 数時間〜数日 データ提供遅延 CI 不整合 dbt 単体 CI 通るが、本番カラムが消えている デプロイ後に遅れて発覚(手遅れ) コミュニケーション量 仕様や目的か不明で開発者に問い合わせる必要 速やかな対応が取りづらい dbt 単体 CI/CD だけで 、プロダクト側 スキーマ変更を検知できず、次 課題がありました 

  5. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:全体アーキテクチャ図 ステップ 何をしているか 解決する課題 ①

    スキーマコメント検証 RDBスキーマ 列 説明 記載漏れ・形式チェック メタデータ二重管理 防止 ② CSV 生成 テーブル名・カラム名・ description(説明)を 定義CSV に抽出 メタデータ 一元化 ③ dbt 検証トリガー commune PR CI から dbt 検証を起動 スキーマ変更 検知漏れ防止 ④ dbt run --empty SQL 構文・参照 検証(実データなしで高速実行) CI 不整合(壊れてからで 遅い) ⑤ モデル自動同期 CSV から staging SQL と YAML を自動生成 反映タイムラグ 短縮 ⑥ 差分デプロイ 変更されたモデルだけを本番へ反映 再計算量 最小化
  6. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:ポイント①: RDB → dbt のメタデータ⼀元化

    項目 Before (手動運用) After (自動連携) カラム説明 管理場所 プロダクト RDB定義 と dbt YMLで二重管理かつ乖離あり RDB から 自動反映 新テーブル追加時 information_schemaを利用した macroを用いて、そ 時点で 最 新スキーマで取り込む。列 説明 反映されていないため、 都度、開発者へ 確認を行い、 dbt schema.ymlに記入。 そ ため、テーブル 追加 定期的に、人的な運用が必要 information_schemaと、 schema.prismaから生成された定義 CSV から自動生成 列 削除時 macroで動的生成 ため、本番 DBへ 反映に即追従する一方、 後続パイプラインが次回実行時にエラーとなってから気づく もし非互換な変更であれ 予め調整がかかる カラム説明 鮮度 乖離しがち、追従 遅れが発生 常に最新(同期される) ドキュメント 信頼性 「おおむ 合っている」くらい 温度感 「RDBから同期しているためどちらもが正」と言い切れる
  7. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:ポイント①: RDB → dbt のメタデータ⼀元化

    schema.prisma コメントから抽象構文木 (AST)を利用したgetDMMFを使って、csvファイル化

  8. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:ポイント②: GitHub Actions 連携 RDB

    PRで作成されたスキーマ定義をdbtモデル生成プログラムにCSVで受け渡し、それを元にdbtモデル 自動生成を行い ます。次に、変更後 状態で dbt run --empty --deferを実行し、互換性テストが成功することを確認します。
  9. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:ポイント②: GitHub Actions 連携 フェーズ

    Actions 役割 連携内容・仕組み ① commune PR CI 定義CSV 生成 + dbt起動 workflow_dispatch で dbt CI を起動、定義CSV を artifact 経由で渡す ② dbt CI 変更スキーマ 互換性検証 定義CSVを元にdbtモデル 一斉更新を行い、 dbt run --emptyで検証し、 commit status API で結果を返す ③ マージ判定 commit status チェック dbt CI 結果が ✅ でないとマージ不可( Branch Protection) ④ sync-dbt-models 自動同期 マージ時に起動。定義 CSVからdbtモデル SQLとYMLを生成してmainにpush ⑤ デプロイ後 CD 差分デプロイ(--defer) main push をトリガーに state:modified.body state:new を対象に差分ビルド ⑥ manifest 同期 GCS へアップロード CDで dbt 成功時に GCS にアップロードし、次回 CDに備える 実装 ポイント
  10. ©Commune Inc. All rights reserved プロダクトと融合したCI/CDパイプライン:ポイント②: GitHub Actions 連携 項目

    パターンA: 自動管理モデル パターンB: 手動管理モデル commune PR CI ✅ 成功 ❌ 失敗(カラム参照エラー) マージ可否 そ ままマージ可能 dbt 修正完了後に再実行必要 dbt で 作業 なし(自動同期で対応) PR 作成 → 手動修正 → マージ sync-dbt-models マージ後に自動起動 dbt 修正後 + commune マージ後に起動 運用負荷 低い 中程度(チーム間連携必要) 通常、定義CSVからdbtモデル SQLとYMLを自動生成します。データレイクモデル 自動生成で 上書きできても、多少 調整を行いたいステージングモデル 、手動管理を行いたい事が頻発します。 そ 他、マートで削除された列 利用があれ 、列が見つからない旨で CIエラーとなります。 上流 変更を行うPRで、何かしら dbtモデル 実行エラーが起きたら、次 運用フローで修正します。 DBスキーマ変更を伴うプロダクト PR CIで、dbtモデルへ 互換性エラーを検知 → dbt モデルを手動修正 → プロダクト PR CIを再実行 → CI パス → マージ
  11. ©Commune Inc. All rights reserved dbtセレクタの活⽤、差分デプロイの仕組み 1 キャッシュ戦略 uv、dbt packages、partial

    parse 3種をキャッシュ。 約40秒 CI待ち時間を短縮 2 --empty フラグで全チェック 実データを入れず、 LIMIT 0 で構文検証。 それにより、BigQuery側 スキャンデータ量をゼロへ。 3 マージ後 差分ビルドと--defer 数分〜10分かかっていたデプロイCIを 約1分程度 に短縮した3つ ポイント state:new state:modified.body にて新規・変更箇所を対象に実 行。 CI環境に無いテーブル 本番 を自動参照。
  12. ©Commune Inc. All rights reserved dbtセレクタの活⽤、差分デプロイの仕組み セレクタ 検知する変更内容(概要) state:modified (全体)

    以下 全て 変更を含む、最も広範囲な変更を検知します state:modified.body SQLファイル、Jinjaコード、また Seedデータ 変更 state:modified.configs configブロックやdbt_project.ymlで 設定変更(データベース表現以外) state:modified.relation データベース名、スキーマ名、エイリアス(テーブル /ビュー名) 変更 state:modified.persisted_descriptions persist_docsが有効な場合 description 変更 state:modified.macros 使用しているマクロ ロジック変更 state:modified.contract コントラクト(カラム名、データ型) 変更 (そ 他) var/env_var 変更、Source/Exposure 設定変更など state:modified 、YAML description追加や、configタグ 追加といったロジックに影響しない変更も検知してしまいます。 state:modified.body 、SQL本文 変更 みを検知します。
  13. ©Commune Inc. All rights reserved dbtセレクタの活⽤、差分デプロイの仕組み db buildコマンドと共によく使うセレクタを紹介します セレクタ 意味

    使用場面 例 state:modified 前回マニフェストから 定義が変わったモデル seed デプロイ --select state:modified state:modified.body SQL 本文 が変わったモデル(YML除外) 本番デプロイ --select state:modified.body state:new 前回マニフェストに存在しなかったモデル デプロイ・CI --select state:new state:modified+ 変更モデル + そ 下流すべて CI 検証 --select state:modified+ state:new+ 新規モデル + そ 下流すべて CI 検証 --select state:new+ 場面 使うセレクタ 本番デプロイ state:modified.body state:new dbt CI 検証 state:modified+ state:new+ プロダクト CI state:modified+,+tag:customer_used
  14. ©Commune Inc. All rights reserved 複数 dbt プロジェクトの運⽤課題 課題 具体例・影響

    権限管理 複雑化 IAM 権限設定が複雑になり、管理が煩雑になることを避けたい リネージュ追跡 困難 他dbtプロジェクトへデータが渡った後、ど ように利用されているか、 データ 流れ(リネージュ)が見えなくなること 避けたい 保守性 低下 元データ スキーマ変更時、ど プロジェクト ど テーブルに影響が出るか把握 できず、安全に変更できないこと 避けたい
  15. ©Commune Inc. All rights reserved dbt-loomを使う事で、 ref() 利用を保ったまま解決出来た 複数 dbt

    プロジェクトの運⽤課題 複数プロジェクト manifest.json を統合し、依存関係を解決する data mesh構成を支えるツール
  16. ©Commune Inc. All rights reserved “Product A データをProduct Bでも参照したい”時 利用しなかった案

    • ref()を使わずに直接参照する → dbt リネージュから外れるバッドプラクティス • dbt source.ymlに定義して参照する → メンテナンスが大変 • Product B packagesにProduct Aを読み込みref参照する → 運用が大変そう • dbt post_hookで別 dbtプロジェクト DWHにテーブルをコピーする → 列 説明まで反映されず使いにくい と、dbt リネージュから外れる • dbt post_hookで別 dbtプロジェクト DWHにviewテーブルを作成する → 列 説明まで反映されず使いにくい と、dbt リネージュから外れる 今回採用した、疎結合な手法 • Product A テーブルを使って、Product B専用 マートをviewテーブルで作る(承認済みデータセット) • Product B側 dbt projectで、Product A 公開データを用いたマートを作る • 社外向けに 、BigQuery Data Sharing (旧名 Analytics Hub)を使うケースもある 複数 dbt プロジェクトの運⽤課題
  17. ©Commune Inc. All rights reserved 相互利用するときに運用面で考慮すべき観点 • テーブル構成を変更したいときに調整 手間を掛けずに済むこと ◦

    利用者側 都合で提供側 テーブル構成に制約が掛かると保守性が下がる • 利用したい側にとって欲しい粒度で datasetになってること ほぼない ◦ 欲しいテーブル そ dataset 中 ごく一部 • 権限管理 しやすさ ◦ table単位 大変といって、他プロジェクト専有 datasetやproject単位に 権限付与する 避けたい ◦ 権限を付与している範囲が不用意に広くならないこと • BigQuery標準 リネージュツールDataplexでも可視化できること • 同じテーブル名で複製すると、どちらが親な かが っと見分けが付きづらい 複数 dbt プロジェクトの運⽤課題
  18. ©Commune Inc. All rights reserved まとめ:課題と解決策 課題 解決策 実装 ポイント

    スキーマ変更 検知漏れ プロダクト PR から dbt CI を自動起動 workflow_dispatch + commit status メタデータ 二重管理 DB定義 を Single Source of Truth に CSV 抽出 → SQL/YAML 自動生成 反映タイムラグ モデル同期 自動化 自動デプロイ CI 不整合 dbt run --empty で事前検証 構文チェック USING句でなけれ as エイリアス必須 差分ビルド 困難 state セレクタ + manifest 自動管理 state:modified.body state:new+ GCSアップロード プロジェクト間連携 dbt_loom + データ中継場所 利用 dbt_loomでmanifest統合、view参照で データ複製を省略、承認済みデータセット