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_projectmetrics_project を含めて、Snowflakeのデプロイ時にすべてを自己完結させたいとします(外部アクセス不要)。

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project:これはメインプロジェクト(デプロイするもの)です。

  • metrics_project:これはローカル依存関係として使用するプロジェクトです。

core_project 内の metrics_project を参照するには、次の手順を実行します。

  1. core_project 内部に local_packages という名前のフォルダーを作成します。このフォルダーに metrics_project をコピーします。

    metrics_project で、間違いなく dbt_project.ymlcore_project とは別の名前があることを確認します。これは一意である必要があります。

    cd /Projects/core_project
    mkdir local_packages
    cp -R ../metrics_project ./local_packages/metrics_project
    
    Copy

    これで、レイアウトは次のようになります。

    core_project/
      ├─ dbt_project.yml
      ├─ packages.yml
      ├─ models/
      ├─ local_packages/
      │   └─ metrics_project/
      │       ├─ dbt_project.yml
      │       ├─ models/
      │       └─ ...
    
    Copy
  2. core_project/packages.yml では、相対パスを使用してローカル依存関係を宣言します。

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. core_project 内部から、 dbt deps を実行します。

    これで、dbtは metrics_project をパッケージとして扱うようになり、 metrics_project のマクロを core_project で利用できるようになります。

コンパイル時にdbt depsを自動的に実行する

dbtプロジェクトオブジェクトをデプロイまたは更新して、外部アクセス統合を可能にすると、Snowflakeがコンパイル中に自動的に dbt deps を実行し、そのステップの一部として依存関係がインストールされるようにできます。つまり、外部依存関係を持つプロジェクトをデプロイするときに /dbt_packages を含める必要がなくなります。

ワークスペースからdbtプロジェクトオブジェクトをSnowflakeデータベースとスキーマにデプロイすると、以前に作成したオブジェクトを作成または更新できます。

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで Projects » Workspaces を選択します。

  3. Workspaces メニューで、dbtプロジェクトを含むワークスペースを選択します。

  4. ワークスペースエディターの右側で、 Connect » Deploy dbt project を選択します。

  5. Deploy dbt project ポップアップウィンドウで、次を選択します。

    • Select location の下で、データベースとスキーマを選択します。

    • Select or Create dbt project の下で、 Create dbt project を選択します。

    • 名前と説明を入力します。

    • オプションで、デフォルトのターゲットを入力して、コンパイルとその後の実行にどのプロファイルを使用するかを選択します(たとえば、prod)。dbtプロジェクト実行のターゲットは、変わらず、ARGS--target でオーバーライドできます。

    • オプションで、Run dbt deps を選択してから、デプロイ中に自動的に dbt deps を実行する外部アクセス統合を選択します。

  6. 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);
Copy
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依存関係のために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;
Copy

外部アクセス統合の詳細については、外部アクセス統合の作成と使用 をご参照ください。

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 executedbt deps を実行しても、ファイルは変更されません。主に、外部アクセスが正しく構成されているかどうかを確認します。

  • You can specify public Git packages in the packages.yml file. 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_project isn't supported. For a workaround, see dbtプロジェクトを横断する依存関係.