🏙

dbtのdatabaseオプションとともに送る幸せな日々

2022/09/12に公開

要約

  • 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を一切取り込まないとして作っています
      • 識別子として必要な際はハッシュ化して取り込んでいます
    • この点を指して「用法用量を守ってね」と書いています

要約

(最後に改めて)

  • dbtの動作確認のためにtableをコピーして使うのやめたかった
  • databaseプロパティ使ったらその辛さから開放された
  • 用法用量を守って正しく使いましょう

docsはこちら

https://docs.getdbt.com/reference/resource-properties/database

Discussion