[ver1.5新機能]指定したModelを参照させる範囲を限定できる「Access」を試してみた
さがらです。
先日、dbt-coreのver1.5がリリースされました。
dbt-core ver1.5の新機能として、「Access」がリリースされました。この機能を試してみたので、本記事で試した内容をまとめてみます。
Accessとは
一言でいうと、指定したModelを参照させる範囲を限定できる機能です。
これまでのdbtでは、あるModelを定義したとき、そのModelは同じdbt project内であれば自由に参照可能でした。
ただ、dbtでの活用が進んでModelの数が増えていくと、「営業チーム向けに作った中間Modelなのに、経理チームのデータマート層のModelで参照されている」といったような形で、意図せぬModel参照が行われてしまうことがあります。
そんなときに、今回の新機能「Access」の出番です!
このAccessの機能を使うと、参照先のModelと参照するModel、どちらもGroupが同じ場合にのみ参照させる事ができる、ということが可能になります。
試してみた
検証環境
- dbt Cloud
- dbt-Core:ver1.5 ※Environmentより設定
検証内容
ある中間Modelintermediate_sales.sql
を作成し、これを参照するModelをmart_sales.sql
とmart_finance.sql
として定義し、Groupを分けることでmart_sales.sql
のみ参照が上手くいく、というケースを想定し検証してみます。
intermediate_sales.sql
select * from {{ ref('stg_customers') }} -- 別途定義しているstagingレイヤーのデータを参照
mart_sales.sql
とmart_finance.sql
※どちらも同じ内容
select * from {{ ref("intermediate_sales") }}
Groupの定義
まず、Groupを定義する必要があります。
Groupは下記のように任意のyamlファイルの中で定義が出来ます。私はemail
とowner_name
を入れていますが、name
かemail
を定義しておけば、他はユーザー側で自由にPropertiesを定義することが可能です。
groups: - name: sales owner: email: jason@jaffleshop.com owner_name: jason - name: finance owner: email: tim@jaffleshop.com owner_name: tim
Modelのスキーマを定義するyamlファイルにおいてGroupとAccessを定義
続いて、Modelのスキーマを定義するyamlファイルにおいてAccessを定義していきます。このとき、上述のGroupが必要となってきます。
ここでは下記のように定義しました。access
がポイントで、intermediate_sales
でaccess: private
とすることで、intermediate_sales
は同じGroupであるsales
に属するModelからのみ参照できるようになります。
また、access
を定義しない場合はデフォルトのprotected
という、同じdbt project内であれば自由に参照できる、ver1.4以前のdbtと同じ権限範囲が適用されます。
models: - name: intermediate_sales access: private config: group: sales - name: mart_sales config: group: sales - name: mart_finance config: group: finance
また、公式Docにも下記のように記述がありますが、各Modelに定義できるGroupは1種類のみとなりますので、注意しましょう。
Each model can only belong to one group, and groups cannot be nested. If you set a different group in that model's YAML or in-file config, it will override the group applied at the project level.
定義したModelを実行
ここまでの内容を元に、dbt runを実行してみたいと思います!
…なのですが、dbt Cloudの場合はAccessで許可されていない参照を含むModelがあると、そもそもコンパイル自体が上手くいかない仕様となっているようです。(dbt-coreをインストールしたCLI環境だとどうなるかは未確認です…)
そのため、Accessで許可されていない参照を含むModelが1つでもあると、他のModelもdbt run/buildできなくなってしまいます、かなり厳しめな機能だと感じました。
ここで、原因となっている参照を持つmart_finance.sql
を削除してみると、無事にコンパイルできるようになり、同じGroupであるintermediate_sales.sql
とこのModelを参照するmart_sales.sql
は無事に実行できました。
最後に
dbt-core ver1.5の新機能「Access」を試してみました。
今回試したdbt Cloudでは許可されていない参照があるとdbt project全体でコンパイルすらできなくなってしまうほど制限が厳しい機能ですが、dbtで開発する人が増えて、各Modelの参照関係のガバナンスが効かなくなってきたときに活きる機能だと思います。