Compreensão das dependências de projetos dbt no Snowflake

No dbt Projects on Snowflake, as dependências do dbt são os pacotes que você declara no arquivo packages.yml (por exemplo, dbt-labs/dbt_utils do Tutorial de introdução). Eles são instalados na pasta dbt_packages quando você executa dbt deps, assim como no dbt Core.

Você deve executar o comando dbt deps em um espaço de trabalho Snowflake para preencher a pasta dbt_packages do seu projeto dbt. Se preferir, execute dbt deps na sua máquina local ou no orquestrador git (por exemplo, ações GitHub) e implante com snow dbt deploy.

Depois que uma versão do projeto dbt é criada, pense nela como um código somente leitura. Você não modifica seus arquivos com dbt deps, mas cria uma nova versão se precisar de dependências atualizadas.

Sobre a execução do comando dbt deps

Você pode executar o comando dbt deps de uma das seguintes maneiras:

  • Em um espaço de trabalho Snowflake: (recomendado para ambientes de desenvolvimento). Você pode executar o comando dbt deps no seu espaço de trabalho no Snowsight para preencher dbt_packages antes de implantar seu projeto dbt como um objeto DBT PROJECT.

    Para isso, é necessário ter acesso à rede externa para o Snowflake acessar os repositórios para as dependências. Para obter mais informações, consulte Criação de integração de acesso externo no Snowflake para dependências de dbt.

  • Fora do Snowflake: (por exemplo, na etapa de criação do pipeline de implantação). Você pode executar o comando dbt deps em sua máquina local ou integração contínua (Continuous Integration, CI), o que baixa os pacotes em dbt_packages, e depois implantar o projeto inteiro (incluindo essa pasta) no Snowflake.

    Isso não requer uma integração de acesso à rede externa porque todas as dependências já estão incluídas no projeto dbt.

    Como os arquivos em uma versão do projeto dbt são imutáveis, se você tentar executar dbt deps em um objeto implantado, isso não terá efeito sobre a pasta dbt_packages no objeto.

Dependências entre projetos dbt

Para fazer referência a outro projeto dbt dentro do seu projeto dbt, o projeto dbt que for referenciado deverá ser copiado para a raiz do seu projeto dbt.

As dependências locais não exigem uma integração de acesso externo; mas, se você precisar de uma combinação de pacotes locais e remotos (por exemplo, do hub de pacotes dbt ou Git), será necessário configurar uma integração de acesso externo real.

Por exemplo, considere os dois projetos dbt a seguir. Você quer que core_project inclua metrics_project localmente para que tudo esteja incluído quando você implantar no Snowflake (sem necessidade de acesso externo).

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project: este é seu projeto principal (o que você vai implantar).

  • metrics_project: este é o projeto que você deseja usar como dependência local.

Para fazer referência ao metrics_project no core_project, conclua as seguintes etapas:

  1. No core_project, crie uma pasta chamada local_packages. Copie metrics_project para essa pasta.

    Certifique-se de que metrics_project tenha um nome diferente no dbt_project.yml daquele usado no core_project. Eles devem ser exclusivos.

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

    Este é o seu layout:

    core_project/
      ├─ dbt_project.yml
      ├─ packages.yml
      ├─ models/
      ├─ local_packages/
      │   └─ metrics_project/
      │       ├─ dbt_project.yml
      │       ├─ models/
      │       └─ ...
    
    Copy
  2. No core_project/packages.yml, declare a dependência local usando o caminho relativo.

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. No core_project, execute dbt deps.

    O dbt agora considera o metrics_project como um pacote, e as macros de metrics_project estão disponíveis para core_project.

Execução automática do dbt deps na compilação

Quando você implanta ou atualiza um objeto de projeto dbt e concede a ele uma integração de acesso externo, o Snowflake pode executar automaticamente dbt deps durante a compilação, para que as dependências sejam instaladas como parte desta etapa. Isso significa que você não precisa mais incluir /dbt_packages ao implantar projetos com dependências externas.

Ao implantar o objeto de projeto dbt do espaço de trabalho em um banco de dados e esquema do Snowflake, você pode criar ou substituir um objeto que já foi criado.

  1. Faça login no Snowsight.

  2. No menu de navegação, selecione Projects » Workspaces.

  3. No menu Workspaces, selecione o espaço de trabalho com seu projeto dbt.

  4. No lado direito do editor do espaço de trabalho, selecione Connect » Deploy dbt project.

  5. Na janela pop-up Deploy dbt project, selecione o seguinte:

    • Em Select location, selecione o banco de dados e o esquema.

    • Em Select or Create dbt project, selecione Create dbt project.

    • Insira um nome e uma descrição.

    • Se preferir, insira um destino padrão para escolher o perfil que será usado para compilação e execuções subsequentes (por exemplo, prod). Ainda é possível substituir o destino da execução de um projeto dbt por --target em ARGS.

    • Se preferir, selecione Run dbt deps e escolha a integração de acesso externo para executar dbt deps automaticamente durante a implantação.

  6. Selecione Deploy.

A guia Output exibe o comando que é executado no Snowflake, muito semelhante ao seguinte exemplo:

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.

O menu Connect agora exibe o nome do objeto de projeto dbt que você criou com as seguintes opções:

  • Redeploy dbt project: atualiza o objeto de projeto dbt com a versão atual do espaço de trabalho do projeto usando ALTER. Isso incrementa a versão do objeto de projeto dbt em um. Para obter mais informações, consulte Controle de versão para objetos e arquivos de projeto dbt.

  • Disconnect: desconecta o espaço de trabalho do objeto de projeto dbt, mas não exclui o objeto.

  • Edit project: atualiza o comentário, o destino padrão e a integração de acesso externo no objeto de projeto dbt.

  • View project: abre o objeto de projeto dbt no explorador de objetos, em que é possível visualizar o comando CREATE DBT PROJECT para o objeto de projeto dbt e o histórico de execuções do projeto.

  • Create schedule: mostra opções para você criar uma tarefa que executa o objeto de projeto dbt de acordo com um cronograma. Para obter mais informações, consulte Criação de tarefa para agendar a execução do projeto dbt.

  • View schedules: abre uma lista de cronogramas (tarefas) que executam o objeto de projeto dbt, com a opção de visualizar os detalhes das tarefas no explorador de objetos.

Criação de integração de acesso externo no Snowflake para dependências de dbt

Ao executar comandos do dbt em um espaço de trabalho, o dbt pode precisar acessar URLs remotos para baixar as dependências. Por exemplo, o dbt pode precisar baixar pacotes do hub de pacotes dbt ou do GitHub.

A maioria dos projetos dbt especifica as dependências no arquivo packages.yml. Você deve instalar essas dependências no espaço de trabalho do projeto dbt.

Você não pode atualizar um objeto de projeto dbt implantado com dependências. Para atualizar um objeto de projeto dbt com novas dependências, adicione uma nova versão ao objeto. Para obter mais informações, consulte Como os objetos de projeto dbt são atualizados.

Para obter o pacote dbt dos URLs remotos, o Snowflake precisa de uma integração de acesso externo que siga uma regra de rede, como mostrado no seguinte exemplo:

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

Para obter mais informações sobre integrações de acesso externo no Snowflake, consulte Criação e uso de uma integração de acesso externo.

Limitações, requisitos e considerações para dependências de dbt

Os seguintes requisitos, considerações e limitações se aplicam às dependências do dbt para projetos dbt em dbt Projects on Snowflake:

  • Você deve executar o comando dbt deps em um espaço de trabalho Snowflake para preencher a pasta dbt_packages do seu projeto dbt. Se preferir, execute dbt deps na sua máquina local ou no orquestrador Git e implante com snow dbt deploy.

    Um objeto de projeto dbt é um instantâneo com versão, portanto, a execução de dbt deps com EXECUTE DBT PROJECT ou snow dbt execute não modifica nenhum arquivo. Essa instrução verifica principalmente se seu acesso externo está configurado corretamente.

  • Você pode especificar pacotes Git públicos no arquivo packages.yml, no entanto, os pacotes Git privados não são compatíveis.

  • Uma regra de rede e a integração de acesso externo são necessárias para permitir que o Snowflake acesse os repositórios para as dependências. Para obter mais informações, consulte Criação de integração de acesso externo no Snowflake para dependências de dbt.

  • Um objeto de projeto dbt é um instantâneo com controle de versão do seu projeto. A execução do comando deps nele não modifica nenhum arquivo. Ele é usado principalmente para verificar se a configuração de acesso externo está correta. Quando um objeto de projeto dbt é criado com uma integração de acesso externo, o dbt deps é executado antes de dbt compile para empacotar todas as dependências e os arquivos do projeto.