Snowflake를 사용한 DevOps¶
Snowflake는 Snowflake 환경을 코드로 관리하고, 변경 사항이 프로덕션에 도달하기 전에 유효성을 검사하며, CI/CD 파이프라인을 통해 배포를 자동화하기 위한 도구와 사례를 제공합니다.
Snowflake를 사용한 DevOps란 무엇입니까?¶
Snowflake를 사용하는 DevOps 는 데이터 인프라 관리에 소프트웨어 엔지니어링 모범 사례를 제공합니다. 핵심 원칙은 다음과 같습니다.
코드로 정의합니다. 버전이 제어되는 파일에서 Snowflake 오브젝트의 원하는 상태를 선언합니다. Snowflake는 해당 상태에 도달하는 데 필요한 변경 사항(생성, 변경 또는 삭제)을 결정하고 적용합니다.
배포하기 전에 유효성을 검사합니다. 계정에 적용하기 전에 계획 단계에서 제안된 변경 사항을 미리 봅니다. 생성, 변경 및 삭제를 검토한 후 변경 사항이 정확하다고 확신할 때 배포합니다.
CI/CD를 통해 자동화합니다. 수동 단계가 아닌 끌어오기 요청, 병합 또는 예약된 실행에 의해 배포가 트리거되도록 Snowflake를 기존 CI/CD 파이프라인에 통합합니다.
권장되는 접근 방식은 선언적 오브젝트 관리, 계획 후 배포 유효성 검사, 다중 환경 대상 지정 및 CI/CD 자동화를 단일 워크플로에 통합하는 DCM 프로젝트 (데이터베이스 변경 관리 프로젝트)를 사용하는 것입니다.
Snowflake 오브젝트를 코드로 정의¶
DCM 프로젝트(권장)¶
DCM 프로젝트 (데이터베이스 변경 관리 프로젝트)는 Snowflake 환경을 관리하기 위한 선언적 코드로서의 인프라 접근 방식을 제공합니다. 각 단계를 지정하는 명령형 스크립트를 작성하는 대신 오브젝트의 원하는 대상 상태를 정의합니다. Snowflake는 이러한 정의를 현재 상태와 비교하고 필요한 변경 사항을 결정합니다.
DCM 프로젝트는 다음으로 구성됩니다.
매니페스트 파일 (
manifest.yml): 각 환경에 대한 배포 대상, 소유자 역할, 템플릿 구성을 지정합니다.정의 파일 (
sources/definitions/아래의 SQL 파일): Snowflake 오브젝트에 대한 DEFINE 문, 액세스 제어를 위한 GRANT 문, 데이터 품질 기대치를 위한 ATTACH 문이 포함됩니다.
다음 예제에서는 Jinja2 템플릿을 사용하여 여러 팀을 위한 인프라를 생성하는 정의 파일을 보여줍니다.
프로젝트 파일 설정, 여러 환경 관리, 배포 자동화 방법을 포함한 DCM 프로젝트에 대한 전체 설명서를 보려면 Snowflake DCM Projects 섹션을 참조하세요.
Snowflake의 dbt 프로젝트¶
Snowflake의 dbt 프로젝트 를 사용하면 dbt Core 프로젝트를 네이티브 Snowflake 오브젝트로 배포하고 실행할 수 있습니다. dbt 모델에서 SQL 변환을 정의하고 버전 지정 DBT PROJECT 오브젝트로 배포한 후 Snowflake SQL 또는 Snowflake CLI를 사용하여 실행합니다. Snowflake 작업으로 실행을 예약하고 배포를 CI/CD 파이프라인에 통합할 수 있습니다.
자세한 내용은 Snowflake의 dbt 프로젝트 섹션을 참조하십시오.
대안: 버전 지정 스크립트가 있는 CREATE OR ALTER¶
DCM 프로젝트 외부의 개별 오브젝트 변경 사항의 경우 CREATE OR ALTER <오브젝트> 명령을 사용할 수 있으며, 이 명령은 오브젝트를 생성하거나 명령에 지정된 정의와 일치하도록 오브젝트를 변경합니다. 원격 리포지토리에 있는 버전 지정 파일에서 이 명령을 통해 파일의 이전 버전을 실행하여 이전 버전으로 변경 사항을 롤백할 수 있습니다.
참고
또한 Snowflake Python APIs 및 Snowflake CLI 를 사용하여 Snowflake 리소스를 관리할 수도 있습니다. 데이터 엔지니어링 작업을 Python으로 수행하는 것을 선호하는 경우, Snowflake의 최고급 Python API를 사용하면 가장 생산성이 높은 언어로 동일한 리소스 관리를 수행할 수 있습니다.
변경 사항 확인 및 미리 보기¶
Snowflake 계정에 변경 사항을 배포하기 전에 제안된 수정 사항을 미리 보고 해당 의도와 일치하는지 확인할 수 있습니다.
DCM 프로젝트로 계획¶
DCM 프로젝트는 계획 후 배포 모델을 사용합니다. PLAN 명령은 정의 파일을 계정의 현재 상태와 비교하며 아무것도 수정하지 않고 제안된 변경 사항 목록을 생성합니다.
Snowflake CLI를 사용하여 계획을 실행할 수 있습니다.
또는 SQL을 사용하여 계획을 실행할 수 있습니다.
배포를 진행하기 전에 출력을 검토하여 예상되는 생성, 변경, 삭제를 확인합니다.
CI/CD를 통한 배포 자동화¶
Snowflake를 CI/CD 파이프라인에 통합하여 끌어오기 요청 병합, 분기 푸시 또는 예약된 실행과 같은 이벤트에 의해 배포를 자동으로 트리거할 수 있습니다.
다음 테이블에서는 공통 CI/CD 파이프라인 작업을 해당 Snowflake CLI 명령으로 매핑합니다.
파이프라인 작업 |
CLI 명령 |
설명 |
|---|---|---|
끌어오기 요청 시 계획 |
|
대상 환경에 적용될 변경 사항을 미리 보는 계획을 생성합니다. 검토를 위해 계획 출력을 PR 설명으로 게시할 수 있습니다. |
병합 시 배포 |
|
계획된 변경 사항을 대상 환경에 적용합니다. 일반적으로 PR이 기본 분기에 병합된 후 실행합니다. |
동적 테이블 새로 고침 |
|
배포 후 동적 테이블의 새로 고침을 트리거하여 다운스트림 데이터를 최신 상태로 유지합니다. |
테스트 기대치 |
|
DCM 프로젝트에 정의된 기대치 검사를 실행하여 배포가 예상한 결과를 생성했는지 확인합니다. |
GitHub Actions¶
GitHub Actions 를 사용하여 CI/CD 파이프라인을 구성하는 작업을 자동화할 수 있습니다.
Snowflake는 안전한 인증을 위해 비밀번호 또는 개인 키와 같은 정적 자격 증명 대신 OpenID Connect(OIDC)와 함께 워크로드 ID 페더레이션(WIF)을 사용할 것을 권장합니다. WIF OIDC를 사용하면 GitHub Actions가 GitHub의 OIDC 공급자로부터 단기 토큰을 요청하고 Snowflake는 토큰을 직접 확인합니다. 수명이 긴 시크릿은 리포지토리에 저장되지 않습니다.
WIF OIDC를 설정하려면 GitHub의 OIDC 공급자를 신뢰하는 Snowflake 서비스 사용자를 생성합니다.
일반적으로 주제 클레임 및 WIF 구성에 대한 자세한 내용은 워크로드 ID 페더레이션 섹션을 참조하세요.
다음 예제에서는 WIF OIDC 및 DCM 프로젝트를 사용하여 main 분기에 푸시할 때 변경 사항을 계획하고 배포하는 워크플로를 보여줍니다.
대체 인증 방법을 포함하여 Snowflake CLI를 통해 CI/CD를 설정하는 방법에 대한 자세한 내용은 CI/CD 와 Snowflake CLI 통합하기 섹션을 참조하세요.
환경 관리¶
개발, 테스트 및 프로덕션 환경을 별도로 유지하면 개발 활동을 프로덕션 환경과 분리하여 의도하지 않은 결과와 데이터 손상의 가능성을 줄일 수 있습니다.
환경 타겟팅을 위한 연결 프로필¶
DCM 프로젝트를 사용하면 manifest.yml 파일에서 여러 배포 대상을 정의할 수 있습니다. 각 대상은 특정 Snowflake 계정(또는 데이터베이스), 프로젝트 오브젝트, 소유자 역할 및 템플릿 구성에 매핑됩니다. 구성 프로필을 통해 환경별 설정이 적용된 모든 환경에 동일한 정의 파일을 배포할 수 있습니다.
다중 프로젝트 설정 및 팀 공동 작업과 같은 엔터프라이즈 패턴의 경우 DCM Projects 의 엔터프라이즈 사용 사례 섹션을 참조하세요.
고급: 사용자 지정 스크립트를 위한 Jinja 매개 변수화¶
DCM 프로젝트는 기본적으로 정의 파일에서 Jinja2 템플릿을 지원합니다. 템플릿 변수, 루프, 조건, 매크로, 사전을 사용하여 여러 환경에서 정의를 재사용할 수 있도록 설정할 수 있습니다. 변수 값은 manifest.yml 또는 런타임 재정의의 구성 프로필에서 가져옵니다.
DCM 템플릿에 대한 자세한 내용은 DCM Projects 파일 및 템플릿 섹션을 참조하세요.
EXECUTE IMMEDIATE FROM 과 함께 Jinja2를 사용하여 독립 실행형 SQL 스크립트(DCM 프로젝트)를 매개 변수화할 수도 있습니다. 또는 Snowflake CLI를 사용하여 환경 변수를 Python 스크립트로 전달할 수 있습니다.
예를 들어, 배포 대상을 변경하려면 대상 데이터베이스의 이름을 SQL 스크립트에서는 {{ environment }} 등의 Jinja 변수로, Python 스크립트에서는 환경 변수로 대체하면 됩니다. 이 기술은 다음 SQL 및 Python 코드 예에 나와 있습니다.
시작하기¶
DCM 프로젝트를 시작하기 위한 프로젝트 파일 설정, 환경 구성, 변경 사항 배포 방법을 포함한 기능에 대한 전체 개요는 Snowflake DCM Projects 섹션을 참조하세요.
샘플 프로젝트, CI/CD 템플릿 및 빠른 시작은 snowflake-labs DCM 리포지토리 를 참조하세요.
단계별 자습서를 따르려면 Snowflake DCM 프로젝트 시작하기 빠른 시작을 참조하세요.