dbt Projects on Snowflakeでpackage(dbt-utils)を使うまでのハマりポイントまとめ

dbt Projects on Snowflakeでpackage(dbt-utils)を使うまでのハマりポイントまとめ | Tableau-id Press -タブロイド-
eyecatch_snowflake_dbt

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つのホストを許可する必要があるので、ここもポイントです。

  1. hub.getdbt.com:443 → パッケージのメタ情報取得に必要
  2. 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点がキモです:

  1. 外部アクセス統合とネットワークルールの構成
  2. ネットワークルールで2種類のホストを許可
  3. Deps実行時に外部アクセス統合を選択

ぜひお試しください!