Meshのハンズオンを実施して見えてきたdbt Mesh利用時の問題と解決策

## 1. はじめに
dbt Cloudの機能の一つであるdbt Meshは、2024年の[dbt Coalesce](https://www.getdbt.com/blog/coalesce-2024-highlights)で紹介され、データプラットフォームに依存しないデータメッシュアーキテクチャを実現する[cross-platform dbt Mesh](https://www.getdbt.com/blog/introducing-cross-platform-dbt-mesh)により、大きな注目を集めています。

dbt Meshの理解を深めるために、dbt Labs社が提供する[ハンズオン](https://docs.getdbt.com/guides/mesh-qs?step=1)を実施しました。
他チームのテーブルを含めたリネージの可視化やドキュメントへの迅速なアクセスが可能になり、今後のdbtでのデータメッシュアーキテクチャに期待が持てる内容でした。

一方で、dbt Meshを利用する際には、開発環境から別チームの検証・本番環境のテーブルを参照できてしまうことが分かりました。開発環境で他の環境の資材を参照することが問題になるケースは多いと思われるため、dbt Meshを利用した際の環境分離問題を解決してみます。
※以降dbt Labs社提供のハンズオンの資材をベースにファイル作成・修正・追記を実施します。

## 2. dbt Meshの挙動
dbt Meshは別プロジェクトのテーブルを参照する際、以下のルールに従います。
※開発環境はDevelopment環境、検証環境はStaging環境、本番環境はProduction環境を示します。

### 2.1 参照元に「検証環境」がある場合
- 参照先が「開発環境」または「検証環境」で実行される場合:
  - 「検証環境」のテーブルを参照します。
- 参照先が「本番環境」で実行される場合:
  - 「本番環境」のテーブルを参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/b1949ce6-97a4-f770-2345-f1101fcb8313.png)


### 2.2 参照元に「検証環境」がない場合
- 「本番環境」のテーブルを参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/ce613a5e-40c9-6be2-81cf-836f8b2e3b43.png)



## 3. dbt Meshの問題
dbt Meshを利用する際に発生しうる問題は次のとおりです：
### 3.1 dbt Cloudでの問題

- **製造時に別プロジェクトを参照してしまう問題**：
ウォーターフォール型開発では、結合テストより前のフェーズでは別プロジェクトの資材を参照しないことが原則です。しかし、dbt Meshの既存機能では、製造時に別プロジェクトの資材を参照してしまいます。


- **検証環境がない場合の本番データ参照問題**：
参照元に「検証環境」が存在しない場合、開発・検証時に本番データを参照します。これは企業にとって重大な問題となり得ます。
※今回は検証環境がある前提で問題の解決を実施するため、本問題は解決対象としない。


### 3.2 dbt Coreでの問題
- **そもそも実行できない問題**：
dbt Meshはdbt Cloudの機能のため、dbt Coreで利用するとコンパイルエラーが発生します。これによりdbt Cloudのライセンス費を抑えるためのdbt Coreとdbt Cloudの併用が難しくなります。

```sql:agg_customer_payments_journey.sql (ハンズオンのモデルSQL)
with stg_payments as (
    select * from {{ ref('stg_payments') }}
),
fct_orders as (
	-- project_refを利用したい
    select * from {{ ref('analytics', 'fct_orders') }}
),
-- 以下省略(dbt Meshのハンズオン参照)
```

↓dbt Coreでのdbt Mesh利用時のエラー
![dbtCoreでのdbtMesh利用時のエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/ccc3a99a-b7b5-dcf1-0ade-8748cbfcb270.png)






## 4. dbt Mesh利用時の前提
本記事における**環境分離方針**と**dbtの利用方針**に関する前提は下記の通りです。

### 4.1 環境分離方針
データアナリストチームと財務チームがそれぞれdbtプロジェクトを持ち、環境分離を次のように実施していると仮定します：

- **チーム間の環境分離**は**データベース**を用いて行います。
- **開発・検証・本番環境の分離**は**スキーマ**を用いて行います。


### 4.2 dbtの利用方針
**dbt Core**は**開発環境でのみ**利用し、検証・本番環境では利用しないと仮定します。
**dbt Cloud**は**開発・検証・本番環境の全て**で利用すると仮定します。
※今回の検証では、dbt Coreとdbt Cloudはリポジトリの併用利用をせず、リポジトリを別途作成して行います。


**イメージ図**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/be1af7a2-737b-7169-d873-9b4696d147f2.png)


## 5. 解決策
dbtのマクロを利用して、開発環境では自チームのテーブルを参照させ、検証・本番環境ではdbt Meshの標準機能の通り、他チームのテーブルを参照させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/d37f250a-4442-0601-c4f0-7d3dbc7787da.png)

## 6. 主な解決手順

3つの資材の作成・修正・追記をしてdbt Mesh問題を解決します。

### 6.1 `project_ref.sql`の作成（参照切替用マクロ）
参照切替に本マクロを利用します。環境変数である[DBT_CLOUD_ENVIRONMENT_TYPE](https://docs.getdbt.com/docs/build/environment-variables#dbt-cloud-context)を利用して開発環境では自チームのテーブル、検証・本番環境では他チームのテーブルの参照を実現します。
```sql:project_ref.sqll
{% macro project_ref(project_name, table_name) %}
    {% if env_var('DBT_CLOUD_ENVIRONMENT_TYPE', 'dev') in ['staging', 'prod'] %}
        {{ ref(project_name, table_name) }}
    {% else %}
        {{ source(project_name, table_name) }}
    {% endif %}
{% endmacro %}
```

### 6.2 `agg_customer_payments_journey.sql`の修正
ハンズオンのモデルSQLをproject_refマクロを利用するように書き換えます。

```sql:agg_customer_payments_journey.sql
with stg_payments as (
    select * from {{ ref('stg_payments') }}
),

fct_orders as (
    -- project_refマクロの利用
    select * from {{ project_ref('dbt_analytics', 'fct_orders') }}
),
```

### 6.3 `sources.yml`の追記
ハンズオンのソース用のYAMLに製造時に参照させるfct_ordersのテーブル情報を追記します。
今回は参照元プロジェクト名をソースの名称として利用します。

```yaml:sources.yml
version: 2

sources:
  - name: analytics #参照元プロジェクト名
    database: jaffle_finance #参照先開発環境DB名
    schema: dbt_poc_dev #参照先開発環境スキーマ名
    tables:
      - name: fct_orders #参照先開発環境テーブル名
#以下省略
```


## 7. 結果
マクロが意図した通り、開発環境（dbt Core）と開発環境（dbt Cloud）の問題が解決し、検証環境（dbt Cloud）と本番環境（dbt Cloud）ではdbt Meshが想定通りに機能したのか、それぞれでの実行されたSQLとリネージの表示結果を示します。

### 7.1 開発環境（dbt Core）での結果

**◎ 問題解決**
dbt Coreのターミナルから実行した際、問題なく処理が終了し、自チームの環境下（jaffle_finance.dbt_poc_dev）のテーブルを参照してモデルを作成できました。
dbt docsで出力されるリネージも開発環境の実態と一致しています。

```sql:agg_customer_payments_journey.sql
with stg_payments as (
    select * from jaffle_finance.dbt_poc_dev.stg_payments
),
fct_orders as (
    select * from
        -- project_refマクロの利用 
        jaffle_finance.dbt_poc_dev.fct_orders
),
```
![{907DB29A-E402-42FA-BF5F-A679DE89B8B1}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/7d3f1397-28e8-4611-1965-842a410382e1.png)


### 7.2 開発環境（dbt Cloud）での結果
**◎ 問題解決**
dbt CloudのIDEから実行しても、処理は正常に終了しました。
IDEで表示されるリネージも想定通りでした。
```sql:agg_customer_payments_journey.sql
with stg_payments as (
    select * from jaffle_finance.dbt_poc_dev.stg_payments
),
fct_orders as (
    select * from
        -- project_refマクロの利用 
        jaffle_finance.dbt_poc_dev.fct_orders
),
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/11fb8469-6719-056f-92e9-76a74e6ac426.png)




### 7.3 検証環境（dbt Cloud）での結果
**△ 不明点あり**
検証環境でのジョブ実行では想定通り他チームの検証環境（jaffle_da.dbt_poc_stg）のテーブルを参照しました。
dbt Explorerのリネージも期待通り他チームのテーブルを表示しました。
一方で、今回のマクロの利用可否に関わらずリネージ上に「Production」という文字が表示されるようです、、本番環境ではなく、検証環境のテーブルを参照できているのに、、

```sql:agg_customer_payments_journey.sql
with stg_payments as (
    select * from jaffle_finance.dbt_poc_stg.stg_payments
),
fct_orders as (
    select * from 
        -- project_refマクロの利用    
        jaffle_da.dbt_poc_stg.fct_orders
),
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/a4e2881c-b59b-c03e-e1f1-05063188e3d8.png)



### 7.4 本番環境（dbt Cloud）での結果
**〇 問題なし**
本番環境でのジョブ実行では想定通り他チームの本番環境（jaffle_da.dbt_poc_prd）のテーブルを参照しました。
dbt Explorerのリネージも期待通り他チームのテーブルを表示しました。

```sql:agg_customer_payments_journey.sql
with stg_payments as (
    select * from jaffle_finance.dbt_poc_prd.stg_payments
),
fct_orders as (
    select * from 
        -- project_refマクロの利用
        jaffle_da.dbt_poc_prd.fct_orders
),
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/b13c24bf-0278-bc5f-b08d-e65ff6f08bf6.png)



## 8. まとめ
dbt Meshを利用する際に必要だと思われた環境分離の問題の解決に挑戦してみました。
dbt Meshの標準機能による検証環境のリネージの表示について理解できない挙動もありましたが、今回紹介したマクロを利用することで、検証・開発環境でdbt Meshの機能を利用しつつ、開発環境でチームごとの環境分離をしながら開発が可能であることが分かりました。
「検証環境がない場合の本番データ参照問題」については、今回各チームに検証環境がある前提で進めていたので対処法には触れませんでしたが、マクロを改良することで対処できる見込みです。
また、dbt Coreを開発環境でのみ利用するなどの制約を設けることで、dbt Coreとdbt Cloudの併用も可能であることが示唆されました。
皆さんもデータメッシュアーキテクチャの構築において、是非今回紹介したマクロを活用し、適切な環境分離を行いながら開発を進めてみてください。


## 補足
2024年12月時点では、dbtのジョブで表示されるリネージには実行されたリソースのみが表示され、ソースやプロジェクトを跨いだrefは表示されないようです。
ジョブで表示されるリネージでも参照元を確認できるようになることを期待したいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927905/3f9b7212-8e7a-7474-70b9-57252c0ff29c.png)

## 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://www.nttdata.com/jp/ja/lineup/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>

<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://www.nttdata.com/jp/ja/lineup/tdf_am/
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

https://www.nttdata.com/jp/ja/lineup/databricks/

</details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://www.nttdata.com/jp/ja/lineup/tableau/

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://www.nttdata.com/jp/ja/lineup/alteryx/

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://www.nttdata.com/jp/ja/lineup/datarobot/

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://www.nttdata.com/jp/ja/lineup/informatica/

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://www.nttdata.com/jp/ja/lineup/snowflake/

</div></details>