🗂

dbt-osmosisでBigQueryのpolicy_tagsを伝搬させる

2024/05/13に公開

ポリシータグ

BigQueryにはポリシータグというものが存在します。
ポリシータグを利用することで、BigQueryのテーブルに対して列レベルのアクセス制御または動的データマスキングができます。
https://cloud.google.com/bigquery/docs/best-practices-policy-tags?hl=ja

dbt-osmosis

dbt-osmosisはdbtの上位modelのメタデータであるtable,columnのdescriptionを下位modelへ伝搬することができます。
これにより、全てのmodelのメタデータを手作業で更新するのではなく、上位modelのメタデータ更新のみで下位modelへ伝搬することができます。
https://github.com/z3z1ma/dbt-osmosis

背景

dbtにはBigQuery用にポリシータグを設定することができます。
https://docs.getdbt.com/reference/resource-configs/bigquery-configs#policy-tags

こちらを利用することで、dbtで作成したBigQueryのテーブルにポリシータグを設定できます。
しかしdbt-osmosisではpolicy_tagsへの対応がされておらず、policy_tagsの追記を全てのmodelへ行う必要性があります。
ポリシータグの特性上、設定されるカラムはPIIデータなど設定漏れがまず許されないようなものがほとんどです。
設定漏れやミスによってセキュリティ事故につながる危険性もあります。

対応

dbtではpolicy_tagsを含むその他の情報が_extraというdictに格納されており、dbt-osmosisでもそちらを利用しています。
なので情報としては持っていますので、そちらも伝搬する対象とすれば実現できそうです。

今回はpolicy_tagsのみではなく、任意のものを伝搬できるようなオプションを追加しました。
https://github.com/z3z1ma/dbt-osmosis/pull/147

これにより以下のようなコマンドでpolicy_tagsを伝搬できるようになりました。

dbt-osmosis yaml refactor --add-inheritance-for-specified-keys policy_tags

課題

ポリシータグやBigQueryを本番環境とその他でGCP Projectを分けています。
そのため、設定するpolicy_tagsも内容も環境によってdbtのvariablesでそれぞれ設定しています。
前述のコマンドをそのまま実行してしまうと、変数が展開されてしまった状態で伝搬されてしまいます。

こちらは現在ワークアラウンドとして、dbt-osmosisの実行時に--varsで変数展開されたときに変数となるような値を渡しています。
具体的には以下のようなpolicy_tagsの設定時に、--varsをオプションで渡したコマンドを実行しています。(どなたか良い解決策あれば教えて下さい)

# dbt_project.yml
vars:
  policy_tags:
    dev: 'dev-policy-tag-id'
    stg: 'stg-policy-tag-id'
    prd: 'prd-policy-tag-id'

# source.yml
~~
- name: users
  columns:
    - name: id
    - name: email
      policy_tags:
        - '{{ var("policy_tags")[target.name] }}'
dbt-osmosis yaml refactor --add-inheritance-for-specified-keys policy_tags \
--vars '{"policy_tags":{"dev":"{{ var(\"policy_tags\")[target.name] }}"}}'

おわり

本記事ではdbt-osmosisを利用して、BigQueryのポリシータグを伝搬させる方法を紹介しました。
--add-inheritance-for-specified-keysオプションはpolicy_tagsだけでなく他のものでも利用できますので、便利な使い方があれば教えて下さい。

Discussion