[ver1.5新機能]指定したModelを参照させる範囲を限定できる「Access」を試してみた

2023.05.23

さがらです。

先日、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.sqlmart_finance.sqlとして定義し、Groupを分けることでmart_sales.sqlのみ参照が上手くいく、というケースを想定し検証してみます。

  • intermediate_sales.sql
select * from {{ ref('stg_customers') }} -- 別途定義しているstagingレイヤーのデータを参照
  • mart_sales.sqlmart_finance.sql ※どちらも同じ内容
select * from {{ ref("intermediate_sales") }}

Groupの定義

まず、Groupを定義する必要があります。

Groupは下記のように任意のyamlファイルの中で定義が出来ます。私はemailowner_nameを入れていますが、nameemailを定義しておけば、他はユーザー側で自由に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_salesaccess: 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の参照関係のガバナンスが効かなくなってきたときに活きる機能だと思います。