dbt-osmosisでBigQueryのpolicy_tagsを伝搬させる
ポリシータグ
BigQueryにはポリシータグというものが存在します。
ポリシータグを利用することで、BigQueryのテーブルに対して列レベルのアクセス制御または動的データマスキングができます。
dbt-osmosis
dbt-osmosisはdbtの上位modelのメタデータであるtable,columnのdescriptionを下位modelへ伝搬することができます。
これにより、全てのmodelのメタデータを手作業で更新するのではなく、上位modelのメタデータ更新のみで下位modelへ伝搬することができます。
背景
dbtにはBigQuery用にポリシータグを設定することができます。
こちらを利用することで、dbtで作成したBigQueryのテーブルにポリシータグを設定できます。
しかしdbt-osmosisではpolicy_tagsへの対応がされておらず、policy_tagsの追記を全てのmodelへ行う必要性があります。
ポリシータグの特性上、設定されるカラムはPIIデータなど設定漏れがまず許されないようなものがほとんどです。
設定漏れやミスによってセキュリティ事故につながる危険性もあります。
対応
dbtではpolicy_tagsを含むその他の情報が_extra
というdictに格納されており、dbt-osmosisでもそちらを利用しています。
なので情報としては持っていますので、そちらも伝搬する対象とすれば実現できそうです。
今回はpolicy_tagsのみではなく、任意のものを伝搬できるようなオプションを追加しました。
これにより以下のようなコマンドで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