Snowflake를 사용한 DevOps

Snowflake는 Snowflake 환경을 코드로 관리하고, 변경 사항이 프로덕션에 도달하기 전에 유효성을 검사하며, CI/CD 파이프라인을 통해 배포를 자동화하기 위한 도구와 사례를 제공합니다.

Snowflake를 사용한 DevOps란 무엇입니까?

Snowflake를 사용하는 DevOps 는 데이터 인프라 관리에 소프트웨어 엔지니어링 모범 사례를 제공합니다. 핵심 원칙은 다음과 같습니다.

  • 코드로 정의합니다. 버전이 제어되는 파일에서 Snowflake 오브젝트의 원하는 상태를 선언합니다. Snowflake는 해당 상태에 도달하는 데 필요한 변경 사항(생성, 변경 또는 삭제)을 결정하고 적용합니다.

  • 배포하기 전에 유효성을 검사합니다. 계정에 적용하기 전에 계획 단계에서 제안된 변경 사항을 미리 봅니다. 생성, 변경 및 삭제를 검토한 후 변경 사항이 정확하다고 확신할 때 배포합니다.

  • CI/CD를 통해 자동화합니다. 수동 단계가 아닌 끌어오기 요청, 병합 또는 예약된 실행에 의해 배포가 트리거되도록 Snowflake를 기존 CI/CD 파이프라인에 통합합니다.

권장되는 접근 방식은 선언적 오브젝트 관리, 계획 후 배포 유효성 검사, 다중 환경 대상 지정 및 CI/CD 자동화를 단일 워크플로에 통합하는 DCM 프로젝트 (데이터베이스 변경 관리 프로젝트)를 사용하는 것입니다.

Snowflake 오브젝트를 코드로 정의

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 <오브젝트> 명령을 사용할 수 있으며, 이 명령은 오브젝트를 생성하거나 명령에 지정된 정의와 일치하도록 오브젝트를 변경합니다. 원격 리포지토리에 있는 버전 지정 파일에서 이 명령을 통해 파일의 이전 버전을 실행하여 이전 버전으로 변경 사항을 롤백할 수 있습니다.

CREATE OR ALTER TABLE vacation_spots (
  city VARCHAR,
  airport VARCHAR,
  avg_temperature_air_f FLOAT,
  avg_relative_humidity_pct FLOAT,
  avg_cloud_cover_pct FLOAT,
  precipitation_probability_pct FLOAT
) data_retention_time_in_days = 1;

참고

또한 Snowflake Python APIsSnowflake CLI 를 사용하여 Snowflake 리소스를 관리할 수도 있습니다. 데이터 엔지니어링 작업을 Python으로 수행하는 것을 선호하는 경우, Snowflake의 최고급 Python API를 사용하면 가장 생산성이 높은 언어로 동일한 리소스 관리를 수행할 수 있습니다.

변경 사항 확인 및 미리 보기

Snowflake 계정에 변경 사항을 배포하기 전에 제안된 수정 사항을 미리 보고 해당 의도와 일치하는지 확인할 수 있습니다.

DCM 프로젝트로 계획

DCM 프로젝트는 계획 후 배포 모델을 사용합니다. PLAN 명령은 정의 파일을 계정의 현재 상태와 비교하며 아무것도 수정하지 않고 제안된 변경 사항 목록을 생성합니다.

Snowflake CLI를 사용하여 계획을 실행할 수 있습니다.

snow dcm plan --target PROD

또는 SQL을 사용하여 계획을 실행할 수 있습니다.

EXECUTE DCM PROJECT my_db.my_schema.my_project
  PLAN
  USING CONFIGURATION PROD
FROM
  '@my_stage/my_project/';

배포를 진행하기 전에 출력을 검토하여 예상되는 생성, 변경, 삭제를 확인합니다.

CI/CD를 통한 배포 자동화

Snowflake를 CI/CD 파이프라인에 통합하여 끌어오기 요청 병합, 분기 푸시 또는 예약된 실행과 같은 이벤트에 의해 배포를 자동으로 트리거할 수 있습니다.

다음 테이블에서는 공통 CI/CD 파이프라인 작업을 해당 Snowflake CLI 명령으로 매핑합니다.

파이프라인 작업

CLI 명령

설명

끌어오기 요청 시 계획

snow dcm plan

대상 환경에 적용될 변경 사항을 미리 보는 계획을 생성합니다. 검토를 위해 계획 출력을 PR 설명으로 게시할 수 있습니다.

병합 시 배포

snow dcm deploy

계획된 변경 사항을 대상 환경에 적용합니다. 일반적으로 PR이 기본 분기에 병합된 후 실행합니다.

동적 테이블 새로 고침

snow dcm refresh

배포 후 동적 테이블의 새로 고침을 트리거하여 다운스트림 데이터를 최신 상태로 유지합니다.

테스트 기대치

snow dcm test

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 서비스 사용자를 생성합니다.

CREATE USER github_deployer
  TYPE = SERVICE
  DEFAULT_ROLE = deployer_role
  WORKLOAD_IDENTITY = (
    TYPE = OIDC
    ISSUER = 'https://token.actions.githubusercontent.com'
    SUBJECT = 'repo:<owner>/<repo>:environment:<environment_name>'
  );

일반적으로 주제 클레임 및 WIF 구성에 대한 자세한 내용은 워크로드 ID 페더레이션 섹션을 참조하세요.

다음 예제에서는 WIF OIDC 및 DCM 프로젝트를 사용하여 main 분기에 푸시할 때 변경 사항을 계획하고 배포하는 워크플로를 보여줍니다.

name: Deploy DCM project to production

on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Set up Snowflake CLI
        uses: snowflakedb/snowflake-cli-action@v2
        with:
          use-oidc: true
          cli-version: "3.11"

      - name: Plan DCM project
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: snow dcm plan --target PROD --save-output -x

      - name: Deploy DCM project
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: snow dcm deploy --target PROD -x

대체 인증 방법을 포함하여 Snowflake CLI를 통해 CI/CD를 설정하는 방법에 대한 자세한 내용은 CI/CD 와 Snowflake CLI 통합하기 섹션을 참조하세요.

환경 관리

개발, 테스트 및 프로덕션 환경을 별도로 유지하면 개발 활동을 프로덕션 환경과 분리하여 의도하지 않은 결과와 데이터 손상의 가능성을 줄일 수 있습니다.

환경 타겟팅을 위한 연결 프로필

DCM 프로젝트를 사용하면 manifest.yml 파일에서 여러 배포 대상을 정의할 수 있습니다. 각 대상은 특정 Snowflake 계정(또는 데이터베이스), 프로젝트 오브젝트, 소유자 역할 및 템플릿 구성에 매핑됩니다. 구성 프로필을 통해 환경별 설정이 적용된 모든 환경에 동일한 정의 파일을 배포할 수 있습니다.

targets:
  DEV:
    account_identifier: MYORG-MYACCOUNT_DEV
    project_name: MY_DB.MY_SCHEMA.MY_PROJECT_DEV
    project_owner: DEV_DEPLOYER
    templating_config: DEV

  PROD:
    account_identifier: MYORG-MYACCOUNT_PROD
    project_name: MY_DB.MY_SCHEMA.MY_PROJECT_PROD
    project_owner: PROD_DEPLOYER
    templating_config: PROD

templating:
  configurations:
    DEV:
      wh_size: "X-SMALL"
    PROD:
      wh_size: "LARGE"

다중 프로젝트 설정 및 팀 공동 작업과 같은 엔터프라이즈 패턴의 경우 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 코드 예에 나와 있습니다.

CREATE OR ALTER TASK {{ environment }}.my_schema.my_task
  WAREHOUSE = my_warehouse
  SCHEDULE = '60 minute'
  AS select pi();

시작하기

DCM 프로젝트를 시작하기 위한 프로젝트 파일 설정, 환경 구성, 변경 사항 배포 방법을 포함한 기능에 대한 전체 개요는 Snowflake DCM Projects 섹션을 참조하세요.

샘플 프로젝트, CI/CD 템플릿 및 빠른 시작은 snowflake-labs DCM 리포지토리 를 참조하세요.

단계별 자습서를 따르려면 Snowflake DCM 프로젝트 시작하기 빠른 시작을 참조하세요.