やりたいこと
データにタグベースのマスキング
https://docs.snowflake.com/en/user-guide/tag-based-masking-policies
を適用する時、クレンジング以降を毎回手で修正するのはとても辛いので
要件をExcelなどで確定させ、あとはカラムリネージつかって自動で付与したい
EXCEL→RAW(YAML)
手間の8割がここ、いい感じにExcel読んでYAMLを更新する
YAMLの処理についてはPyYAMLでは色々問題が出るので
を使用し、↓のようにYAMLの定義のカラムにタグを追加で埋め込む
columns:
- name: namae
description: "なまえ"
data_type: VARCHAR
tags:
- pii_mask_analyst
- pii_mask_operator
読み込みと書き出しについては、以下を指定して引用符とインデントを調整
- 引用符を保持する
yaml.preserve_quotes = True
- インデントの制御
yaml.indent(mapping=2, sequence=4, offset=2)
詳しくは
https://yaml.readthedocs.io/en/latest/detail/
RAW/CLEANSING → DWH/MART
- dbs-osmosis
dbt-osmosis yaml refactor --add-progenitor-to-meta models/cleansing
とかで下流に適用していく
TAGを元にdbt実行時に適用する
- dbt-tags
こちらのパッケージを追加し、post-hookとして適用を行う
今回はTAGは既に作成済みのため、TAGとポリシー作成は割愛
流れとしては
https://dbt-tags.iflambda.com/latest/getting-started.html
ここにある通り
dbt_project.ymlに
- TAGのスキーマを指定
- 許可するタグを指定
vars:
dbt_tags__schema: COMMON
dbt_tags__allowed_tags:
- pii_mask_analyst
- pii_mask_operator
- 適用したい範囲で
post-hook: {{ dbt_tags.apply_column_tags() }}
と追加しておくことでモデル実行後にpost_hookでテーブルにタグが適用できる
まとめ
流れはとても単純なので、YAMLさえ編集できればとてもサクッと行く
YAMLの読み込みと加工は表記揺れなどでとても泣ける…
補足
incrementalやsnapshotのようにテーブルが都度REPLACEされないものについては
unsetするストアドを書いておき
post-hook:
- {{ unset_tags() }}
- {{ dbt_tags.apply_column_tags() }}
のように重ねておく。