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 프로젝트 간 종속성¶
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 패키지 허브 또는 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';
To automatically run dbt deps during compile, run the snow dbt deploy
command with either the --external-access-integration or --install-local-deps flag, as shown in the following example.
--install-local-deps 플래그는 빈 외부 액세스 통합이 있는 오브젝트를 생성합니다. 일반 컴파일에서는 dbt deps`를 실행하고 :code:`dbt_packages 폴더의 이전 상태를 대체합니다.
The --external-access-integration flag adds an external access integration, which taken precedence over the
--install-local-deps flag.
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`를 실행해도 파일이 수정되지 않으며 주로 외부 액세스가 올바르게 구성되었는지 확인합니다.
You can specify public Git packages in the
packages.ymlfile. 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가 종속성에 대한 리포지토리에 액세스할 수 있도록 허용하려면 네트워크 규칙 및 외부 액세스 통합이 필요합니다. 자세한 내용은 Snowflake에서 dbt 종속성에 대한 외부 액세스 통합 만들기 섹션을 참조하십시오.
dbt 프로젝트 오브젝트는 프로젝트의 버전이 지정된 스냅샷입니다. 이 오브젝트에 대해
deps명령을 실행해도 파일이 수정되지 않으며 주로 외부 액세스 구성이 올바른지 확인하는 데 사용됩니다. dbt 프로젝트 오브젝트가 외부 액세스 통합으로 생성되면dbt compile전에 :code:`dbt deps`가 실행되어 모든 종속성과 프로젝트 파일을 패키징합니다.Snowflake only supports referencing another dbt project in the same folder. For example,
:local: ../some_other_projectisn’t supported. For a workaround, see dbt 프로젝트 간 종속성.