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/
└─ ...
core_project: 이것이 기본 프로젝트(배포할 프로젝트)입니다.metrics_project: 이것은 로컬 종속성으로 사용하려는 프로젝트입니다.
core_project 내에서 :code:`metrics_project`를 참조하려면 다음 단계를 완료하세요.
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
이제 레이아웃은 다음과 같습니다.
core_project/ ├─ dbt_project.yml ├─ packages.yml ├─ models/ ├─ local_packages/ │ └─ metrics_project/ │ ├─ dbt_project.yml │ ├─ models/ │ └─ ...
:file:`core_project/packages.yml`에서 상대 경로를 사용하여 로컬 종속성을 선언합니다.
packages: - local: local_packages/metrics_project
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 프로젝트 오브젝트를 배포할 때, 이전에 생성한 오브젝트를 생성하거나 업데이트할 수 있습니다.
Snowsight 에 로그인합니다.
탐색 메뉴에서 Projects » Workspaces 를 선택합니다.
Workspaces 메뉴에서 dbt 프로젝트가 포함된 작업 공간을 선택합니다.
작업 공간 편집기의 오른쪽에서 Connect » :ui:`Deploy dbt project`를 선택합니다.
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`를 자동으로 실행하기 위한 외부 액세스 통합을 선택합니다.
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.
이제 생성한 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 프로젝트 오브젝트를 실행하는 일정(작업) 목록을 엽니다.
컴파일하는 동안 :code:`dbt deps`를 자동으로 실행하려면 다음 예와 같이 EXTERNAL_ACCESS_INTEGRATIONS 매개 변수를 사용하여 CREATE DBT PROJECT 또는 ALTER DBT PROJECT 명령을 실행합니다.
사용 사례에 따라 빈 배열을 EXTERNAL_ACCESS_INTEGRATIONS 매개 변수에 전달하거나 하나 이상의 외부 액세스 통합을 지정할 수 있습니다. 로컬 종속성에는 외부 액세스 통합이 필요하지 않지만, 로컬 패키지와 원격 패키지의 혼합(예: dbt 패키지 허브 또는 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';
컴파일하는 동안 dbt deps`를 자동으로 실행하려면 다음 예와 같이 :code:–external-access-integrations` 또는 --install-local-deps 플래그를 지정하여 snow dbt deploy 명령을 실행합니다.
--install-local-deps 플래그는 빈 외부 액세스 통합이 있는 오브젝트를 생성합니다. 일반 컴파일에서는 dbt deps`를 실행하고 :code:`dbt_packages 폴더의 이전 상태를 대체합니다.
--external-access-integrations 플래그는 외부 액세스 통합을 추가하며, --install-local-deps 플래그보다 우선합니다.
snow dbt deploy my_dbt_project --install-local-deps;
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;
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`가 실행되어 모든 종속성과 프로젝트 파일을 패키징합니다.