3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

タグベースのマスキングポリシーをdbt-osmosisで伝搬し、dbtで適用する

Last updated at Posted at 2024-09-30

やりたいこと

データにタグベースのマスキング
https://docs.snowflake.com/en/user-guide/tag-based-masking-policies
を適用する時、クレンジング以降を毎回手で修正するのはとても辛いので
要件をExcelなどで確定させ、あとはカラムリネージつかって自動で付与したい

EXCEL→RAW(YAML)

手間の8割がここ、いい感じにExcel読んでYAMLを更新する

YAMLの処理についてはPyYAMLでは色々問題が出るので

を使用し、↓のようにYAMLの定義のカラムにタグを追加で埋め込む

xxx.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() }}

のように重ねておく。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?