🏙
dbtのdatabaseオプションとともに送る幸せな日々
要約
- dbtの動作確認のためにtableをコピーして使うのやめたかった
-
database
プロパティ使ったらその辛さから開放された - 用法用量を守って正しく使いましょう
前提
- GCP及びBigQueryの世界線で話しているので、ご自身の環境に合わせて適宜翻訳してください
背景
dbtの開発していく上で、データレイクに対してこんな悩みがありました
- production環境(以下prod環境)と開発環境(以下dev環境)でプロジェクトを分けて運用している
- dev環境からはprod環境のテーブルのReadのみができる
- 動作確認のためのデータレイク相当のものはdev環境にはない
- staging環境も存在はするのですが、どうしてもソフトウェアの動作確認、テスト環境用であって、データ基盤のデータの整合性までは考えられていないので、ログなどでしばしばデータ不整合が起きてしまう
- 動作確認のためにはprod環境のテーブルをコピーして使っていた
- PIIを含む情報を別の環境に移すのはデータガバナンスの観点からとても危険でやりたくない
- でも、どうしてもやらなきゃいけないときは自社のデータに絞ってとるなどしてやりくりしている
- コピーしたはいいけど、消すのは人間が頑張って覚えて消すしかないので運用から漏れることがある(人間だもの)
- 個人情報でフィルターをかける際にはDDLで記述するが、prod環境のテーブルと違うものを生み出してしまうことがある
- パーティションが切ってあって、パーティションフィルター必須の設定などを見落とすとprod環境と違う条件のテーブルで動作確認してしまい、本番で落ちてしまう
databaseプロパティを使って解決する
例として用いる状況
- prod環境の
tenajima-prod
とdev環境のtenajima-dev
がある - データセットとして
dataset_hoge
があるとする - テーブルとして
table_a
があるとする - sourceの定義としてこんな感じを想定する
version: 2
sources:
- name: dataset_hoge
tables:
- name: table_a
デフォルトの挙動はこちら
- この状態でdev環境で
dbt run
すると、tenajima-dev.dataset_hoge.table_a
を参照しにいきます - もし
tenajima-dev.dataset_hoge.table_a
がない場合は落ちてしまいます - 落ちてしまうので仕方なく
tenajima-dev
環境内にテーブルをコピーするなどあげる必要が出てきます
databaseプロパティを設定してあげる
- sourceにdatabaseオプションを加えてあげます
version: 2
sources:
- name: dataset_hoge
database: tenajima-prod
tables:
- name: table_a
- すると
tenajima-prod
プロジェクトを参照しにいきます -
tenajima-dev.dataset_hoge.table_a
を用意する必要がなくなったのでハッピーですね
運用を考える
- sourceにdatabaseオプションを付けるのは毒にも薬にもならないので、入れてもなんの問題もないと思っています
- ただ、僕自身は自分のチームで使い始めたばかりなのでまだ合意形成フェーズです
- なので、今は
#TODO: 後で消す
のコメントとともにdatabaseプロパティを使って開発、動作確認しています- もし消し忘れてもプルリクでレビュアーに指摘してもらえるようになってます
- 上記で書いたように毒にも薬にもならないなら、開発のしやすさ、データガバナンスの観点からdatabaseプロパティつけたほうがいいよねって合意をとっていこうと思っています
- データ基盤にPIIを含むものを扱う際は、違う環境にPIIが漏れるのはやはり良くないと思います
- 弊チームのデータ基盤はPIIを一切取り込まないとして作っています
- 識別子として必要な際はハッシュ化して取り込んでいます
- この点を指して「用法用量を守ってね」と書いています
- 弊チームのデータ基盤はPIIを一切取り込まないとして作っています
要約
(最後に改めて)
- dbtの動作確認のためにtableをコピーして使うのやめたかった
-
database
プロパティ使ったらその辛さから開放された - 用法用量を守って正しく使いましょう
docsはこちら
Discussion