Snowflake上のdbtプロジェクトの依存関係を理解する¶
dbt Projects on Snowflake では、dbt依存関係は packages.yml ファイルで宣言したパッケージです(例: 入門チュートリアル からの dbt-labs/dbt_utils )。dbt Coreと同様、dbt deps の実行時に dbt_packages フォルダーにインストールされます。
dbtプロジェクトの dbt_packages フォルダにデータを入力するには、Snowflakeワークスペース内で dbt deps コマンドを実行する必要があります。あるいは、ローカルマシンまたはgitオーケストレーター(例: GitHub Actions)で dbt deps を実行して、 snow dbt deploy でデプロイすることもできます。
dbtプロジェクトバージョンを作成したら、それを読み取り専用コードと考えます。dbt deps でファイルを変更することはありません。依存関係を更新する必要がある場合は、新しいバージョンを作成します。
dbt depsコマンドの実行について¶
dbt deps コマンドは、次のいずれかの方法で実行できます。
Snowflakeワークスペース内: (開発環境にお勧めです。)dbtプロジェクトを DBT PROJECT オブジェクトとしてデプロイする前に、
dbt depsコマンドを Snowsight のワークスペース内で実行してdbt_packagesを入力できます。これには、Snowflakeが依存関係のリポジトリにアクセスできるようにするための外部ネットワークアクセスが必要です。詳細については、 dbt依存関係のためにSnowflakeで外部アクセス統合を作成する をご参照ください。
Snowflake外部: (たとえば、デプロイメントパイプラインのビルドステップ内など。)ローカルマシンまたは継続的統合の(CI)内で
dbt depsコマンドを実行できます。この場合、パッケージをdbt_packagesにダウンロードしてから、プロジェクト全体(そのフォルダーを含む)をSnowflakeにデプロイします。すべての依存関係がdbtプロジェクトに既に含まれているため、外部ネットワークアクセスの統合は必要ありません。
dbtプロジェクトバージョンのファイルは不変であるため、デプロイされたオブジェクトに対して
dbt depsの実行を試みても、オブジェクト内のdbt_packagesフォルダーには影響がありません。
dbtプロジェクトを横断する依存関係¶
In order to reference another dbt project within your dbt project, the dbt project being referenced must be copied into the root of your dbt
project. Snowflake only supports references in the same folder. For example, :local: ../some_other_project isn't supported.
ローカルの依存関係は外部アクセス統合を必要としませんが、ローカルパッケージとリモートパッケージ(たとえば、dbt Packages hubまたはGitから)の組み合わせが必要な場合は、実際の外部アクセス統合を構成する必要があります。
たとえば、次の2つのdbtプロジェクトについて考えます。ローカルで core_project に metrics_project を含めて、Snowflakeのデプロイ時にすべてを自己完結させたいとします(外部アクセス不要)。
/Projects
├─ core_project/
│ ├─ dbt_project.yml
│ ├─ packages.yml
│ ├─ models/
│ └─ ...
└─ metrics_project/
├─ dbt_project.yml
├─ models/
└─ ...
core_project:これはメインプロジェクト(デプロイするもの)です。metrics_project:これはローカル依存関係として使用するプロジェクトです。
core_project 内の metrics_project を参照するには、次の手順を実行します。
core_project内部にlocal_packagesという名前のフォルダーを作成します。このフォルダーにmetrics_projectをコピーします。metrics_projectで、間違いなくdbt_project.ymlにcore_projectとは別の名前があることを確認します。これは一意である必要があります。cd /Projects/core_project mkdir local_packages cp -R ../metrics_project ./local_packages/metrics_project
これで、レイアウトは次のようになります。
core_project/ ├─ dbt_project.yml ├─ packages.yml ├─ models/ ├─ local_packages/ │ └─ metrics_project/ │ ├─ dbt_project.yml │ ├─ models/ │ └─ ...
core_project/packages.ymlでは、相対パスを使用してローカル依存関係を宣言します。packages: - local: local_packages/metrics_project
core_project内部から、dbt depsを実行します。これで、dbtは
metrics_projectをパッケージとして扱うようになり、metrics_projectのマクロをcore_projectで利用できるようになります。
コンパイル時にdbt depsを自動的に実行する¶
dbtプロジェクトオブジェクトをデプロイまたは更新して、外部アクセス統合を可能にすると、Snowflakeがコンパイル中に自動的に dbt deps を実行し、そのステップの一部として依存関係がインストールされるようにできます。つまり、外部依存関係を持つプロジェクトをデプロイするときに /dbt_packages を含める必要がなくなります。
ワークスペースからdbtプロジェクトオブジェクトをSnowflakeデータベースとスキーマにデプロイすると、以前に作成したオブジェクトを作成または更新できます。
Snowsight にサインインします。
ナビゲーションメニューで Projects » Workspaces を選択します。
Workspaces メニューで、dbtプロジェクトを含むワークスペースを選択します。
ワークスペースエディターの右側で、 Connect » Deploy dbt project を選択します。
Deploy dbt project ポップアップウィンドウで、次を選択します。
Select location の下で、データベースとスキーマを選択します。
Select or Create dbt project の下で、 Create dbt project を選択します。
名前と説明を入力します。
オプションで、デフォルトのターゲットを入力して、コンパイルとその後の実行にどのプロファイルを使用するかを選択します(たとえば、prod)。dbtプロジェクト実行のターゲットは、変わらず、
ARGSの--targetでオーバーライドできます。オプションで、Run dbt deps を選択してから、デプロイ中に自動的に
dbt depsを実行する外部アクセス統合を選択します。
Deploy を選択します。
その Output タブには、Snowflakeで実行されるコマンドが表示されます。これは次の例と同様です。
CREATE DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
FROM 'snow://workspace/mydb.my_dbt_projects_schema.sales_model/versions/version$2'
EXTERNAL_ACCESS_INTEGRATIONS = (my_dbt_ext_access);
my_dbt_project successfully created.
Connect メニューには、作成したdbtプロジェクトオブジェクトの名前と、次のオプションが表示されるようになります。
Redeploy dbt project:ALTER を使用して、プロジェクトの現在のワークスペースバージョンでdbtプロジェクトオブジェクトを更新します。これによりdbtプロジェクトオブジェクトのバージョンが1つずつ増加します。詳細については、 dbtプロジェクトオブジェクトとファイルのバージョン管理 をご参照ください。
Disconnect:dbtプロジェクトオブジェクトからワークスペースを切断しますが、dbtプロジェクトオブジェクトは削除しません。
Edit project:dbtプロジェクトオブジェクトのコメント、デフォルトターゲット、外部アクセス統合を更新します。
View project:オブジェクトエクスプローラーでdbtプロジェクトオブジェクトを開きます。そこにはdbtプロジェクトオブジェクトの CREATE DBT PROJECT コマンドとプロジェクトの実行履歴が表示されます。
Create schedule:スケジュール上でdbtプロジェクトオブジェクトを実行するタスクを作成するためのオプションを提供します。詳細については、 dbtプロジェクトの実行をスケジュールするタスクを作成する をご参照ください。
View schedules:dbtプロジェクトオブジェクトを実行するスケジュール(タスク)のリストを開きます。オブジェクトエクスプローラーでタスクの詳細を表示するオプションがあります。
コンパイル中に dbt deps を自動的に実行するには、次の例に示すように、CREATE DBT PROJECT または ALTER DBT PROJECT コマンドを EXTERNAL_ACCESS_INTEGRATIONS パラメーターを指定して実行します。
ユースケースに応じて、EXTERNAL_ACCESS_INTEGRATIONS パラメーターに空の配列を渡すことや、1つ以上の外部アクセス統合を指定することができます。ローカルの依存関係は外部アクセス統合を必要としませんが、ローカルパッケージとリモートパッケージ(たとえば、dbt Packages hubまたはGitから)の組み合わせが必要な場合は、実際の外部アクセス統合を構成する必要があります。
-- Create a dbt project object that runs dbt deps on compile for remote packages
CREATE DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
FROM 'snow://workspace/mydb.my_dbt_projects_schema.sales_model/versions/version$2'
EXTERNAL_ACCESS_INTEGRATIONS = (my_dbt_ext_access);
-- Create a dbt project object that runs dbt deps on compile for only local dependencies
CREATE DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
FROM 'snow://workspace/mydb.my_dbt_projects_schema.sales_model/versions/version$2'
EXTERNAL_ACCESS_INTEGRATIONS = ();
-- Update the Git repository object to fetch the latest code
ALTER GIT REPOSITORY mydb.dev_schema.my_dbt_git_stage FETCH;
-- Set external access integrations
ALTER DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
SET EXTERNAL_ACCESS_INTEGRATIONS = ();
-- Add a new version to the dbt project object based on the updated Git repository object
-- After an external access integration is set, the next ALTER DBT PROJECT ... ADD VERSION will call dbt deps during compile
ALTER DBT PROJECT mydb.my_dbt_projects_schema.my_dbt_project
ADD VERSION
FROM '@mydb.dev_schema.my_dbt_git_stage/branches/main/sales_dbt_project';
To automatically run dbt deps during compile, run the snow dbt deploy
command with either the --external-access-integration or --install-local-deps flag, as shown in the following example.
--install-local-deps フラグは、空の外部アクセス統合を持つオブジェクトを作成します。通常のコンパイルでは、dbt deps を実行し、 dbt_packages フォルダーの以前の状態を置き換えます。
The --external-access-integration flag adds an external access integration, which taken precedence over the
--install-local-deps flag.
snow dbt deploy my_dbt_project --install-local-deps;
dbt依存関係のためにSnowflakeで外部アクセス統合を作成する¶
ワークスペースでdbtコマンドを実行すると、dbtはリモートの URLs にアクセスして、依存関係をダウンロードする必要が生じる場合があります。たとえば、dbtはdbtパッケージハブから、または GitHub からパッケージをダウンロードする必要がある場合があります。
ほとんどのdbtプロジェクトは、 packages.yml ファイルで依存関係を指定します。これらの依存関係をdbtプロジェクトのワークスペースにインストールする必要があります。
依存関係のあるデプロイされたdbtプロジェクトオブジェクトを更新することはできません。新しい依存関係でdbtプロジェクトオブジェクトを更新するには、オブジェクトに新しいバージョンを追加する必要があります。詳細については、 dbtプロジェクトオブジェクトの更新方法 をご参照ください。
リモートの URLs からdbtパッケージを取得するには、次の例に示すように、Snowflakeにネットワークルールに依存する外部アクセス統合が必要です。
-- Create NETWORK RULE for external access integration
CREATE OR REPLACE NETWORK RULE my_dbt_network_rule
MODE = EGRESS
TYPE = HOST_PORT
-- Minimal URL allowlist that is required for dbt deps
VALUE_LIST = (
'hub.getdbt.com',
'codeload.github.com'
);
-- Create EXTERNAL ACCESS INTEGRATION for dbt access to external dbt package locations
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_dbt_ext_access
ALLOWED_NETWORK_RULES = (my_dbt_network_rule)
ENABLED = TRUE;
外部アクセス統合の詳細については、外部アクセス統合の作成と使用 をご参照ください。
dbt依存関係の制限、要件、および考慮事項¶
次の要件、考慮事項、および制限は、dbt Projects on Snowflake のdbtプロジェクトのdbt依存関係に適用されます。
dbtプロジェクトの
dbt_packagesフォルダにデータを入力するには、Snowflakeワークスペース内でdbt depsコマンドを実行する必要があります。あるいは、ローカルマシンまたはGitオーケストレーターでdbt depsを実行して、snow dbt deployでデプロイすることもできます。dbtプロジェクトオブジェクトはバージョン管理されたスナップショットであるため、 EXECUTE DBT PROJECT または:codenowrap:
snow dbt executeでdbt depsを実行しても、ファイルは変更されません。主に、外部アクセスが正しく構成されているかどうかを確認します。You can specify public Git packages in the
packages.ymlfile. As a best practice, Snowflake recommends using private Git packages only if they are stored securely. We don't recommend embedding unencrypted Git tokens.Snowflakeが依存関係のリポジトリにアクセスできるようにするには、ネットワークルールと外部アクセス統合が必要です。詳細については、 dbt依存関係のためにSnowflakeで外部アクセス統合を作成する をご参照ください。
dbtプロジェクトオブジェクトは、プロジェクトのバージョン管理されたスナップショットです。
depsコマンドを実行してもファイルは変更されません。これは主に、外部アクセスの構成が正しいかどうかを確認するために使用されます。dbtプロジェクトオブジェクトが外部アクセス統合で作成された場合、dbt compileの前にdbt depsが実行され、すべての依存関係とプロジェクトファイルがパッケージ化されます。Snowflake only supports referencing another dbt project in the same folder. For example,
:local: ../some_other_projectisn't supported. For a workaround, see dbtプロジェクトを横断する依存関係.