Snowflake의 dbt 프로젝트에 대한 종속성 이해

|sf-dbt|에서 dbt 종속성은 packages.yml 파일에서 선언하는 패키지입니다(예: 시작하기 자습서</user-guide/tutorials/dbt-projects-on-snowflake-getting-started-tutorial>`의 :samp:`dbt-labs/dbt_utils). dbt Core에서처럼 dbt deps`를 실행할 :code:`dbt_packages 폴더에 설치됩니다.

Snowflake 작업 공간 내에서 dbt deps 명령을 실행하여 dbt 프로젝트의 dbt_packages 폴더를 채워야 합니다. 또는 로컬 컴퓨터 또는 git 오케스트레이터(예: GitHub Actions)에서 :code:`dbt deps`를 실행하고 :code:`snow dbt deploy`를 사용하여 배포할 수 있습니다.

dbt 프로젝트 버전이 생성되면 읽기 전용 코드로 생각하세요. :code:`dbt deps`로 파일을 수정하지 않도록 합니다. 업데이트된 종속성이 필요한 경우 새 버전을 만듭니다.

dbt deps 명령 실행 정보

다음 방법 중 하나로 dbt deps 명령을 실행할 수 있습니다.

  • **Snowflake Workspace에서:**(개발 환경에 권장됨) dbt 프로젝트를 DBT PROJECT 오브젝트로 배포하기 전에 |sf-web-interface|의 작업 공간 내에서 dbt deps 명령을 실행하여 :code:`dbt_packages`를 채울 수 있습니다.

    이를 위해서는 Snowflake가 종속성에 대한 리포지토리에 액세스할 수 있도록 외부 네트워크 액세스가 필요합니다. 자세한 내용은 Snowflake에서 dbt 종속성에 대한 외부 액세스 통합 만들기 섹션을 참조하십시오.

  • **Snowflake 외부:**(예: 배포 파이프라인의 빌드 단계) 로컬 컴퓨터 또는 CI(연속 통합)에서 dbt deps 명령을 실행하여 패키지를 :code:`dbt_packages`에 다운로드한 다음, 전체 프로젝트(해당 폴더 포함)를 Snowflake에 배포할 수 있습니다.

    모든 종속성이 dbt 프로젝트에 이미 포함되어 있으므로 외부 네트워크 액세스 통합이 필요하지 않습니다.

    dbt 프로젝트 버전의 파일은 변경할 수 없으므로 배포된 오브젝트에 대해 dbt deps`를 실행하려고 하면 오브젝트 내의 :code:`dbt_packages 폴더에는 아무런 영향도 미치지 않습니다.

dbt 프로젝트 간 종속성

dbt 프로젝트 내에서 다른 dbt 프로젝트를 참조하려면 참조되는 dbt 프로젝트를 dbt 프로젝트의 루트에 복사해야 합니다.

로컬 종속성에는 외부 액세스 통합이 필요하지 않지만, 로컬 패키지와 원격 패키지의 혼합(예: dbt 패키지 허브 또는 Git의 패키지)이 필요한 경우 실제 외부 액세스 통합을 구성해야 합니다.

다음 두 dbt 프로젝트를 예로 들어 보겠습니다. Snowflake에 배포할 때 모든 것이 독립적이 되도록 :code:`core_project`에 :code:`metrics_project`를 포함하려고 할 수 있습니다(외부 액세스 불필요).

/Projects
├─ core_project/
│   ├─ dbt_project.yml
│   ├─ packages.yml
│   ├─ models/
│   └─ ...
└─ metrics_project/
    ├─ dbt_project.yml
    ├─ models/
    └─ ...
Copy
  • core_project: 이것이 기본 프로젝트(배포할 프로젝트)입니다.

  • metrics_project: 이것은 로컬 종속성으로 사용하려는 프로젝트입니다.

core_project 내에서 :code:`metrics_project`를 참조하려면 다음 단계를 완료하세요.

  1. core_project 내부에서 이름이 :code:`local_packages`인 폴더를 만듭니다. :code:`metrics_project`를 이 폴더에 복사합니다.

    :code:`metrics_project`의 :file:`dbt_project.yml`에 :file:`core_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. :file:`core_project/packages.yml`에서 상대 경로를 사용하여 로컬 종속성을 선언합니다.

    packages:
      - local: local_packages/metrics_project
    
    Copy
  3. core_project 내부에서 :code:`dbt deps`를 실행합니다.

    이제 dbt가 :code:`metrics_project`를 패키지로 취급하며 :code:`metrics_project`의 매크로는 :code:`core_project`에서 사용할 수 있습니다.

컴파일 시 dbt deps 자동 실행

dbt 프로젝트 오브젝트를 배포하거나 업데이트하고 외부 액세스 통합을 제공하면 종속성이 해당 단계의 일부로 설치되도록, 컴파일하는 동안 Snowflake가 dbt deps`를 자동으로 실행할 있습니다. 즉, 외부 종속성이 있는 프로젝트를 배포할 이상 :code:/dbt_packages`를 포함할 필요가 없습니다.

작업 공간에서 Snowflake 데이터베이스 및 스키마로 dbt 프로젝트 오브젝트를 배포할 때, 이전에 생성한 오브젝트를 생성하거나 업데이트할 수 있습니다.

  1. Snowsight 에 로그인합니다.

  2. 탐색 메뉴에서 Projects » Workspaces 를 선택합니다.

  3. Workspaces 메뉴에서 dbt 프로젝트가 포함된 작업 공간을 선택합니다.

  4. 작업 공간 편집기의 오른쪽에서 Connect » :ui:`Deploy dbt project`를 선택합니다.

  5. Deploy dbt project 팝업 창에서 다음을 선택합니다.

    • Select location 아래에서 데이터베이스와 스키마를 선택합니다.

    • Select or Create dbt project 에서 Create dbt project 를 선택합니다.

    • 이름과 설명을 입력합니다.

    • 선택적으로, 기본 대상을 입력하여 컴파일 및 후속 실행에 사용할 프로필(예: prod)을 선택합니다. dbt 프로젝트 실행의 대상은 여전히 ARGS`에서 :code:–target`으로 재정의할 수 있습니다.

    • 선택적으로, :ui:`Run dbt deps`를 선택한 다음, 배포 중에 :code:`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.

이제 생성한 dbt 프로젝트 오브젝트의 이름이 Connect 메뉴에 다음 옵션과 함께 표시됩니다.

  • 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 프로젝트 오브젝트를 실행하는 일정(작업) 목록을 엽니다.

Snowflake에서 dbt 종속성에 대한 외부 액세스 통합 만들기

작업 공간에서 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

Snowflake의 외부 액세스 통합에 대한 자세한 내용은 외부 액세스 통합 생성 및 사용하기 섹션을 참조하세요.

dbt 종속성에 대한 제한 사항, 요구 사항 및 고려 사항

|sf-dbt|의 dbt 프로젝트에 대한 dbt 종속성에 적용되는 요구 사항, 고려 사항, 제한 사항은 다음과 같습니다.

  • Snowflake 작업 공간 내에서 dbt deps 명령을 실행하여 dbt 프로젝트의 dbt_packages 폴더를 채워야 합니다. 또는 로컬 컴퓨터 또는 git 오케스트레이터에서 :code:`dbt deps`를 실행하고 :code:`snow dbt deploy`를 사용하여 배포할 수 있습니다.

    dbt 프로젝트 오브젝트는 버전이 지정된 스냅샷이므로 EXECUTE DBT PROJECT 또는 :codenowrap:`snow dbt execute`를 사용하여 :code:`dbt deps`를 실행해도 파일이 수정되지 않으며 주로 외부 액세스가 올바르게 구성되었는지 확인합니다.

  • packages.yml 파일에서 공개 `Git 패키지`_를 지정할 수 있지만 비공개 Git 패키지는 지원되지 않습니다.

  • Snowflake가 종속성에 대한 리포지토리에 액세스할 수 있도록 허용하려면 네트워크 규칙 및 외부 액세스 통합이 필요합니다. 자세한 내용은 Snowflake에서 dbt 종속성에 대한 외부 액세스 통합 만들기 섹션을 참조하십시오.

  • dbt 프로젝트 오브젝트는 프로젝트의 버전이 지정된 스냅샷입니다. 이 오브젝트에 대해 deps 명령을 실행해도 파일이 수정되지 않으며 주로 외부 액세스 구성이 올바른지 확인하는 데 사용됩니다. dbt 프로젝트 오브젝트가 외부 액세스 통합으로 생성되면 dbt compile 전에 :code:`dbt deps`가 실행되어 모든 종속성과 프로젝트 파일을 패키징합니다.