Comprendre les dépendances des projets dbt sur Snowflake

Dans dbt Projects on Snowflake, les dépendances dbt sont les paquets que vous déclarez dans votre fichier packages.yml (par exemple, dbt-labs/dbt_utils du Tutoriel de démarrage). Ils sont installés dans un dossier dbt_packages lorsque vous exécutez dbt deps, comme dans dbt Core.

Vous devez exécuter la commande dbt deps dans un espace de travail Snowflake pour renseigner le dossier dbt_packages de votre projet dbt. Vous pouvez également exécuter dbt deps sur votre machine locale ou votre orchestrateur Git (par exemple, GitHub Actions) et procéder au déploiement en utilisant snow dbt deploy.

Une fois qu’une version d’un projet dbt est créée, considérez-la comme du code en lecture seule. Vous ne modifiez pas ses fichiers avec dbt deps ; vous créez une nouvelle version si vous avez besoin de mettre à jour ses dépendances.

À propos de l’exécution de la commande dbt deps

Vous pouvez exécuter la commande dbt deps de l’une des manières suivantes :

  • Dans un espace de travail Snowflake : (recommandé pour les environnements de développement) Vous pouvez exécuter la commande dbt deps à l’intérieur de votre espace de travail dans l’Snowsight pour remplir dbt_packages avant de déployer votre projet dbt en tant qu’objet DBT PROJECT.

    Cela nécessite un accès au réseau externe afin que Snowflake puisse accéder aux référentiels pour les dépendances. Pour plus d’informations, voir Créer une intégration d’accès externe dans Snowflake pour les dépendances dbt.

  • En dehors de Snowflake : (par exemple, lors de l’étape de création de votre pipeline de déploiement) Vous pouvez exécuter la commande dbt deps sur votre machine locale ou dans votre intégration continue (CI), qui télécharge les paquets dans dbt_packages, puis déployer l’ensemble du projet (y compris ce dossier) dans Snowflake.

    Cela ne nécessite pas d’intégration d’accès au réseau externe, car toutes les dépendances sont déjà incluses dans le projet dbt.

    Étant donné que les fichiers d’une version d’un projet dbt sont immuables, si vous essayez d’exécuter dbt deps sur un objet déployé, cela n’aura aucun effet sur le dossier dbt_packages au sein de l’objet.

Dépendances de projets dbt croisées

Afin de référencer un autre projet dbt dans votre projet dbt, le projet dbt référencé doit être copié au niveau de la racine de votre projet dbt.

Bien que les dépendances locales ne nécessitent pas d’intégration d’accès externe, si vous avez besoin d’une combinaison de paquets locaux et de paquets distants (par exemple, provenant du hub dbt Packages ou de Git), vous devez configurer une véritable intégration d’accès externe.

Prenons, par exemple, les deux projets dbt suivants. Vous souhaitez que core_project inclue metrics_project localement, de sorte que tout soit autonome lorsque vous déployez sur Snowflake (aucun accès externe nécessaire).

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project : Il s’agit de votre projet principal (celui que vous allez déployer).

  • metrics_project : Il s’agit du projet que vous souhaitez utiliser comme dépendance locale.

Pour référencer metrics_project à l’intérieur de core_project, suivez les étapes suivantes :

  1. À l’intérieur de core_project, créez un dossier nommé local_packages. Copiez metrics_project dans ce dossier.

    Assurez-vous que metrics_project possède un autre nom que core_project dans son dbt_project.yml. Les noms doivent être uniques.

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

    À présent, votre disposition ressemble à ceci :

    core_project/
      ├─ dbt_project.yml
      ├─ packages.yml
      ├─ models/
      ├─ local_packages/
      │   └─ metrics_project/
      │       ├─ dbt_project.yml
      │       ├─ models/
      │       └─ ...
    
    Copy
  2. Dans core_project/packages.yml, déclarez la dépendance locale en utilisant le chemin relatif.

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. Depuis l’intérieur de core_project, exécutez dbt deps.

    dbt traitera désormais metrics_project comme un paquet, et les macros de metrics_project seront disponibles pour core_project.

Exécuter automatiquement dbt deps lors de la compilation

Lorsque vous déployez ou mettez à jour un objet de projet dbt et que vous lui donnez une intégration d’accès externe, Snowflake peut automatiquement exécuter dbt deps pendant la compilation, afin que les dépendances soient installées dans le cadre de cette étape. Cela signifie que vous n’avez plus besoin d’inclure /dbt_packages lors du déploiement de projets avec des dépendances externes.

Lorsque vous déployez votre objet de projet dbt depuis l’espace de travail vers une base de données et un schéma Snowflake, vous pouvez créer ou remplacer un objet que vous avez précédemment créé.

  1. Connectez-vous à Snowsight.

  2. Dans le menu de navigation, sélectionnez Projects » Workspaces.

  3. Dans le menu Workspaces, sélectionnez l’espace de travail qui contient votre projet dbt.

  4. Sur le côté droit de l’éditeur d’espace de travail, sélectionnez. Connect » Deploy dbt project.

  5. Dans la fenêtre contextuelle Deploy dbt project, sélectionnez les éléments suivants :

    • Sous Select location, sélectionnez votre base de données et votre schéma.

    • Sous Select or Create dbt project, sélectionnez Create dbt project.

    • Saisissez un nom et une description.

    • En option, saisissez une cible par défaut pour choisir le profil qui sera utilisé pour la compilation et les exécutions suivantes (par exemple, prod). La cible d‘une exécution de projet dbt peut toujours être remplacée par --target dans ARGS.

    • En option, sélectionnez Run dbt deps, puis sélectionnez votre intégration d’accès externe pour exécuter dbt deps automatiquement pendant le déploiement.

  6. Sélectionnez Deploy.

L’onglet Output affiche la commande s’exécutant sur Snowflake, qui est similaire à l’exemple suivant :

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.

Le menu Connect affiche maintenant le nom de l’objet de projet dbt que vous avez créé, avec les options suivantes :

  • Redeploy dbt project : Met à jour l’objet de projet dbt avec la version actuelle de l’espace de travail du projet en utilisant ALTER. Cela incrémente la version de l’objet de projet dbt par un. Pour plus d’informations, voir Gestion des versions pour les objets et fichiers de projet dbt.

  • Disconnect : Déconnecte l’espace de travail de l’objet de projet dbt, mais ne supprime pas l’objet de projet dbt.

  • Edit project : Met à jour le commentaire, la cible par défaut et l’intégration d’accès externe pour l‘objet de projet dbt.

  • View project : Ouvre l’objet de projet dbt dans l’explorateur d’objets, où vous pouvez voir la commande CREATE DBT PROJECT pour l’objet de projet dbt et l’historique d’exécution du projet.

  • Create schedule : Fournit des options pour vous permettre de créer une tâche qui exécute l’objet de projet dbt selon une planification. Pour plus d’informations, voir Créer une tâche pour planifier l’exécution d’un projet dbt.

  • View schedules : Ouvre une liste de planifications (tâches) qui exécutent l’objet de projet dbt, avec la possibilité d’afficher les détails des tâches dans l’explorateur d’objets.

Créer une intégration d’accès externe dans Snowflake pour les dépendances dbt

Lorsque vous exécutez des commandes dbt dans un espace de travail, dbt peut avoir besoin d’accéder à des URLs distantes pour télécharger les dépendances. Par exemple, dbt peut avoir besoin de télécharger des paquets à partir du hub de paquets dbt ou à partir de GitHub.

La plupart des projets dbt spécifient les dépendances dans leur fichier:file:packages.yml. Vous devez installer ces dépendances dans l’espace de travail du projet dbt.

Vous ne pouvez pas mettre à jour un objet de projet dbt déployé avec des dépendances. Pour mettre à jour un objet de projet dbt avec de nouvelles dépendances, vous devez ajouter une nouvelle version à l’objet. Pour plus d’informations, voir Comment les objets du projet dbt sont mis à jour.

Pour obtenir un packet dbt à partir d’URLs distantes, Snowflake a besoin d’une intégration d’accès externe qui s’appuie sur une règle réseau, comme montré dans l’exemple suivant :

-- 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

Pour plus d’informations sur les intégrations d’accès externe dans Snowflake, voir Création et utilisation d’une intégration d’accès externe.

Limitations, exigences et considérations pour les dépendances dbt

Les exigences, considérations et limitations suivantes s’appliquent aux dépendances dbt pour les projets dbt dans dbt Projects on Snowflake :

  • Vous devez exécuter la commande dbt deps dans un espace de travail Snowflake pour renseigner le dossier dbt_packages de votre projet dbt. Vous pouvez également exécuter dbt deps sur votre machine locale ou votre orchestrateur Git et procéder au déploiement en utilisant snow dbt deploy.

    Un objet de projet dbt est un instantané versionné, donc exécuter dbt deps avec EXECUTE DBT PROJECT ou exécuter snow dbt ne modifie aucun fichier ; cela vérifie principalement que votre accès externe est configuré correctement.

  • Vous pouvez spécifier des paquets Git publics dans le fichier packages.yml, mais les paquets Git privés ne sont pas pris en charge.

  • Une règle réseau et une intégration d’accès externe sont nécessaires pour permettre à Snowflake d’accéder aux référentiels des dépendances. Pour plus d’informations, voir Créer une intégration d’accès externe dans Snowflake pour les dépendances dbt.

  • Un objet de projet dbt est un instantané versionné de votre projet. L’exécution de la commande deps ne modifie aucun fichier ; elle est principalement utilisée pour vérifier que votre configuration d’accès externe est correcte. Lorsqu’un objet de projet dbt est créé avec une intégration d’accès externe, dbt deps est exécutée avant dbt compile pour empaqueter toutes les dépendances et les fichiers de projet.