
Snowflake上でdbtプロジェクトをネイティブに動かす「dbt Projects on Snowflake」が正式に登場しました。
特に dbt-utils
パッケージなど外部のdbtパッケージを使いたい場合に、ちょっと特殊なネットワーク設定が必要になるため、
本記事ではそこに絞って、実際にハマったポイントと解決方法をまとめます!
ざっくり全体像
最終的にやりたいこと
- dbt-utils などの外部パッケージを Snowflake 上で利用したい
- そのために
packages.yml
に書いた依存パッケージをdbt deps
で取得する
ハマりどころ
- Snowflakeはセキュリティのために外部アクセスをデフォルトではブロックしている
- 外部アクセス統合とネットワークルールをセットで定義する必要がある
hub.getdbt.com
だけでなく、codeload.github.com
もアクセス許可しないといけない
Snowflakeでdbtパッケージを使うまでのステップ
1. packages.yml
を用意する
ワークスペースのdbtプロジェクト直下に packages.yml
を作成します。
packages:
- package: dbt-labs/dbt_utils
version: [">=1.0.0", "<2.0.0"]
2. 外部アクセス統合とネットワークルールの役割
Snowflakeからインターネット上のパッケージリポジトリにアクセスするには、外部アクセス統合(external access integration)とネットワークルール(network rule)のセットアップが必要です。
- ネットワークルール:どのドメイン・ポートにアクセスを許可するかを定義
- 外部アクセス統合:ネットワークルールをバインドし、データベースオブジェクトが使えるようにする
3. ネットワークルールを先に作る
まずは必要なドメインへのネットワークルールを定義します。
CREATE NETWORK RULE github_access
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = ('hub.getdbt.com:443', 'codeload.github.com:443');
今回は以下の2つのホストを許可する必要があるので、ここもポイントです。
hub.getdbt.com:443
→ パッケージのメタ情報取得に必要codeload.github.com:443
→ パッケージ本体(tar.gz)のダウンロードに必要
4. 外部アクセス統合を作成する
先ほどのネットワークルールを使って外部アクセス統合を定義します。
CREATE EXTERNAL ACCESS INTEGRATION my_github_integration
ALLOWED_NETWORK_RULES = (github_access)
ENABLED = TRUE;
これでSnowflakeが外部と通信するための設定が完了しました。
5. ワークスペースのdptプロジェクトで Deps
を実行
Snowflake上で dbt deps
を実行するには、以下のようにワークスペースでdbtプロジェクトを選択し、実行ボタンの左のプルダウンからDepsを選択します
実行する際に、4で作成した外部アクセス統合を選択し、Depsをクリック。
これで、dbt_utils
を含むプロジェクトがSnowflake上で実行できるようになります。
よく出るエラーと対処法
You must temporarily turn on secondary roles to run all actions.
→ USE SECONDARY ROLES ALL;
を実行してから再試行してください。
External connection exception occurred: Failed to resolve 'hub.getdbt.com'
→ hub.getdbt.com:443
のネットワークルールが漏れています。
Failed to resolve 'codeload.github.com'
→ GitHub本体のダウンロード用ドメインも必要です。codeload.github.com:443
を追加してください。
補足:セカンダリーロールとは?
セカンダリーロールとは、現在の有効ロール(CURRENT_ROLE()
)とは別に、「読み取り専用」などの補助的なロールを一時的に有効にする機能です。
Snowflake CLIからプロジェクト操作する際に、権限が不足しているときは USE SECONDARY ROLES ALL;
を使って全ロールを有効にする必要があります。
まとめ
Snowflake上でdbtパッケージを使うには、以下の3点がキモです:
- 外部アクセス統合とネットワークルールの構成
- ネットワークルールで2種類のホストを許可
- Deps実行時に外部アクセス統合を選択
ぜひお試しください!