[小ネタ]dbt Cloud のジョブ経由で codegen のマクロを実行し異なる環境のテーブル情報を取得する
はじめに
dbt Cloud で codegen を使用し、モデルプロパティの YAML ファイルや Source 定義の YAML ファイルのベースを作成する際に、異なる環境のテーブルの情報を参照できるか試してみた内容を本記事でまとめています。
背景と結論
Source 定義を作成する際、テーブル数が多いと、それぞれのテーブルごとに手動で設定のベースを作成するのは手間です。
dbt Cloud では dbt Labs 社が提供するパッケージである codegen を使用することで、テーブルの情報を参照し、そのベースを作成してくれます。
codegen の概要は以下の記事で紹介されています。
dbt Cloud においては、Studio(開発環境)で主に YAML ファイルを作成することになると思うので、codegen のマクロも開発環境に対して実行するケースが多いと思います。
セキュリティ要件によっては、環境間で使えるデータが異なる場面もあるケースもあり、この際、異なる環境のテーブル情報を取得できるか確認してみました。
先に結論ですが、dbt Cloud においては、異なる環境はジョブ経由でアクセスすることになるので、codegen 用のコマンドを実行するジョブを作成することで、異なる環境のテーブル情報を問題なく取得できます。
試してみる
前提条件
ここでは以下の環境があるとします。
- DWH:Snowflake
- 環境:アカウントレベルで分離
- 本番環境
- 開発環境
- dbt 用ロールは今回参照するテーブルへの SELECT 権限を付与
また、各環境で以下のテーブルがあり、「RAW_」から始めるテーブルが今回の対象となる設定です。開発環境では一部サンプルのみで、本番環境では使用できるテーブルが多いとします。Source定義によりテストも記述できるので、テストのみ実施したいなどのケースでも基本的には Source 定義の YAML が必要です。
開発環境
>SHOW TABLES
->> SELECT "name" FROM $1 WHERE "name" LIKE 'RAW_%';
+--------------+
| name |
|--------------|
| RAW_CUSTOMER |
| RAW_SALES |
| RAW_WEBLOG |
+--------------+
本番環境
>SHOW TABLES
->> SELECT "name" FROM $1 WHERE "name" LIKE 'RAW_%';
+------------------+
| name |
|------------------|
| RAW_API_RESPONSE |
| RAW_CONFIG_YAML |
| RAW_CUSTOMER |
| RAW_FILE_LOGS |
| RAW_SALES |
| RAW_SENSOR_DATA |
| RAW_WEBLOG |
+------------------+
開発環境で実行
はじめに Source 定義のベースを出力してみます。コマンドや引数は以下に記載があります。
dbt Cloud における開発環境は Studio となるので、Studio のコマンドラインで以下を実行します。
dbt run-operation generate_source --args '{"schema_name": "<スキーマ>", "database_name": "<データベース>", "include_database": true, "table_pattern": "RAW_%"}'
上記では、開発環境の指定のデータベース・スキーマ配下にある「RAW_」から始まるテーブルに関する Source 定義を出力します。
実行後のシステムログのサマリの一部ですが、以下のように出力されるので、こちらをコピーしてSource 定義に使用できます。
04:16:27 version: 2
sources:
- name: raw
database: <データベース名>
tables:
- name: raw_customer
- name: raw_sales
- name: raw_weblog
ジョブ経由で異なる環境で実行
先は開発環境での実行だったので、開発環境アカウントの指定のデータベース・スキーマ配下のテーブル名を取得できました。
続けて本番環境でも同じように Source 定義のベースを出力できるか試してみます。
dbt Cloud における異なる環境への処理はジョブを経由するので、下図のように実行コマンドとして codegen の関数を指定する deploy job を作成します。

データベース・スキーマは、本番環境の指定のデータベース・スキーマ名とします。
dbt run-operation generate_source --args '{"schema_name": "raw", "database_name": "prd_db", "include_database": true, "table_pattern": "RAW_%"}'
作成したジョブは問題なく実行でき、下図のようにログに本番環境の指定のデータベース・スキーマ配下の「RAW_」から始まるテーブルに関する Source 定義を出力できました。

さいごに
dbt Cloud で codegen を使用し、異なる環境のテーブルの情報を参照できるか試してみました。マクロを実行することになるので、各環境の指定が問題なければ通常の dbt コマンドと同様に動作します。
こちらの内容が何かの参考になれば幸いです。







