Snowflake DevOps¶
기존에 사용하던 도구와 Snowflake 도구를 결합하여 코드와 데이터를 안전하고 효율적으로 관리할 수 있는 DevOps 프로세스를 구축할 수 있습니다.
Snowflake DevOps란 무엇입니까?¶
Snowflake는 개발 라이프사이클을 가속화하고 데이터 팀의 전반적인 생산성을 향상시키는 통합된 접근법을 제공합니다. 이 접근법은 Git 버전 제어, Python APIs, 선언적 오브젝트 관리, 원활한 CI/CD 자동화를 통합합니다.
모든 소스에 대한 Git 리포지토리 |
데이터 자산, 코드 및 구성을 중앙에서 관리하고 버전 제어하면 일관성을 보장하고, 공동 작업을 간소화하고, 필요한 경우 롤백을 간소화할 수 있습니다. Snowflake의 Git 리포지토리를 사용하면 이 모든 작업을 Snowflake의 보안 경계 내에서 수행할 수 있으며, 이는 프로덕션 준비 환경에 매우 중요합니다. |
선언적 구문 |
데이터베이스 변경 관리에 대한 선언적 접근법, 즉 Python 또는 SQL을 사용하여 Snowflake 오브젝트를 정의하고 관리하는 방식을 채택하면 가독성을 높이면서 복잡한 스크립트의 필요성을 없앨 수 있습니다. |
CI/CD 자동화 |
기존 CI/CD 도구 또는 Snowflake CLI과 통합하여 자동으로 명령을 실행하고 전체 파이프라인을 오케스트레이션하여 효율적이고 안정적인 배포를 수행할 수 있습니다. |
Snowflake DevOps의 빌딩 블록은 무엇입니까?¶
Snowflake는 DevOps 작업을 더 간단하고 안전하게 수행할 수 있도록 통합된 여러 기능을 제공합니다.
테이블 또는 작업을 위한 CREATE OR ALTER. |
CREATE OR ALTER 명령을 사용하여 데이터베이스 오브젝트 전체에 일관성을 위한 업데이트를 적용하여 데이터베이스 변경 관리를 간소화할 수 있습니다. 자세한 내용은 선언적 코드 및 버전 관리를 사용한 변경 사항 관리 섹션을 참조하십시오. |
EXECUTE IMMEDIATE FROM Snowflake 명령을 사용하면 Snowflake의 Git 리포지토리에서 SQL 및 Python 코드를 실행할 수 있습니다. 자세한 내용은 Jinja 템플릿을 사용하여 스크립트 매개 변수화 섹션을 참조하십시오. |
|
CI/CD 파이프라인을 구동하는 스크립트에서, 배포를 자동화하고, 버전 관리와 협업하고, 다른 CI/CD 도구와 통합하기 위해 Snowflake CLI 명령을 실행할 수 있습니다. 자세한 내용은 GitHub Actions를 사용한 CI/CD 작업 자동화 섹션을 참조하십시오. |
|
Snowflake의 Python APIs를 사용하면 데이터베이스, 스키마, 테이블, 작업 등 Snowflake 리소스를 관리할 수 있습니다. 자세한 내용은 Snowflake 작업을 사용하여 Snowflake 코드 실행을 조정합니다. 섹션을 참조하십시오. |
|
Git 리포지토리에서 프로젝트 구성 및 데이터 파이프라인(스키마, 테이블, 스크립트)을 가져와서 배포 워크플로를 트리거할 수 있습니다. 자세한 내용은 Snowflake와 연결된 Git 리포지토리에 자산을 유지하여 워크플로를 간소화할 수 있습니다. 섹션을 참조하십시오. |
DevOps 워크플로에서 Snowflake 기능 사용하기¶
기존 도구와 함께 Snowflake를 사용하면 다음과 같은 DevOps 목표를 달성할 수 있습니다.
Snowflake와 연결된 Git 리포지토리에 자산을 유지하여 워크플로를 간소화 할 수 있습니다.
Snowflake 계정에 리포지토리를 연결하면 기존 Git에 대한 투자를 활용할 수 있습니다. 이러한 연결이 구축되고 Snowflake 자체에 리포지토리가 로컬로 복제되면 Snowflake에서 직접 코드를 검색하고 실행할 수 있습니다.
개발, 테스트 및 프로덕션 환경을 별도로 유지 하여 위험을 최소화하십시오.
각 환경에 대해 별도의 Snowflake 데이터베이스를 사용하면 원치 않는 변경이 라이브 시스템에 영향을 미칠 위험을 최소화할 수 있습니다. 배포를 보다 쉽게 관리하려면 배포 프로세스를 매개 변수로 설정하는 스크립트를 사용합니다.
스크립트 및 선언적 코드를 사용하여 개발, 테스트 및 프로덕션을 위해 제어되고 반복 가능한 방식으로 데이터베이스 변경 사항을 관리 합니다.
GitHub 작업을 사용하여 코드 및 데이터 배포를 포함한 CI/CD 작업 을 자동화합니다.
Snowflake 작업을 사용하여 Snowflake 코드 실행을 오케스트레이션 합니다.
참고
Snowflake Extension for Visual Studio Code 를 사용하면 VS 코드에서 직접 Snowflake SQL 문을 작성하고 실행할 수 있습니다. VS Code를 Snowflake에 연결한 리포지토리와 동일한 리포지토리에 연결하면 VS Code에서 로컬로 코드를 개발하고, 작업 내용을 Git 리포지토리에 보관한 다음, Snowflake 내에서 코드에 액세스할 수 있습니다.
Snowflake와 연결된 Git 리포지토리에 자산을 유지하여 워크플로를 간소화할 수 있습니다.¶
데이터 자산, 코드 및 구성을 Git 리포지토리에서 중앙에서 관리하고, 버전을 제어하고, Snowflake의 리포지토리를 사용하면 일관성을 보장하고, 공동 작업을 간소화하며, 필요한 경우 롤백을 간소화할 수 있습니다.
Snowflake 계정을 Git 리포지토리에 연결하면 Snowflake가 리포지토리에서 복제된 파일의 코드를 실행할 수 있습니다. 그 결과, 리포지토리의 전체 복제본을 나타내는 Git 리포지토리 스테이지가 생성됩니다. Snowflake 내에서 특정 커밋, 분기 또는 태그에서 버전 제어된 파일에 액세스할 수 있습니다.
예를 들어, Snowflake에서 리포지토리 파일이 복제된 경우 EXECUTE IMMEDIATE FROM 명령을 사용하여 복제된 파일에서 코드를 실행할 수 있습니다. 이렇게 하면 SQL로 데이터베이스 오브젝트를 선언적으로 생성한 다음 GitHub Action과 같은 다른 코드에서 해당 SQL을 실행할 수 있습니다.

개발, 테스트, 프로덕션을 위한 별도의 환경을 유지합니다.¶
개발, 테스트, 프로덕션을 위한 별도의 환경을 유지함으로써 팀은 개발 활동을 프로덕션 환경에서 분리하여 의도치 않은 결과와 데이터 손상의 가능성을 줄일 수 있습니다.
워크플로를 여러 환경으로 분리하면 각 환경마다 고유한 Snowflake 데이터베이스(일반적으로 동일한 사본)가 생성됩니다.
Jinja 템플릿을 사용하여 스크립트 매개 변수화¶
개발 및 운영 환경 간에 본질적으로 동일한 방식으로 코드를 배포하고 실행할 수 있도록 환경 세부 정보(예: 배포 중에 사용할 데이터베이스)에 대한 참조를 매개 변수화할 수 있습니다. 이렇게 하면 CI/CD 파이프라인을 활성화하여 환경에 적합한 배포 대상을 선택할 수 있습니다.
스크립트를 매개 변수화하려면 간단한 스크립트 매개 변수화부터 Python과 유사한 언어의 광범위한 스크립팅까지 다양한 기능을 갖춘 널리 사용되는 템플릿 언어인 Jinja를 사용할 수 있습니다. Snowflake는 EXECUTE IMMEDIATE FROM 을 사용하여 템플릿화된 SQL 스크립트의 실행을 지원합니다.
예를 들어, 배포 대상을 변경하려면 Jinja에서 변수 대체를 사용하면 됩니다. SQL 스크립트에서는 {{...}}
를 사용하여 Jinja 변수를 표시합니다. EXECUTE IMMEDIATE FROM의 USING 절에 변수 값을 제공할 수 있습니다.
다음 SQL 라인은 이 데이터베이스와 이름이 비슷한 다른 데이터베이스를 구분하는 데이터베이스 이름의 일부에 대한 자리 표시자로 Jinja 변수 {{environment}}
를 사용합니다.
CREATE IF NOT EXISTS DATABASE MYDB_{{environment}};
예를 들어, Github Action의 jobs. <job_id>.steps[*].run 에서 CREATE DATABASE 명령을 사용할 수 있습니다.
run:
snow sql -q "EXECUTE IMMEDIATE FROM @myco_common.public.my_repo/branches/main/deploy_parameterized_pipeline.sql USING (environment => 'prod', retention_time => 1)" \
이 GitHub Action 워크플로 파일 발췌본의 코드에는 다음 명령이 포함되어 있습니다.
run
은 Snowflake CLI 의snow sql
명령을 실행합니다.snow sql
는repository myco_common.public.my_repo
Git 리포지토리 스테이지에 복제된 GitHub 리포지토리의main
분기에 있는deploy_parameterized_pipeline.sql
파일의 내용을 Snowflake에서 실행합니다.deploy_parameterized_pipeline.sql
에는 CREATE DATABASE 명령이 포함됩니다.
Snowflake CLI 를 사용하면 워크로드 전반에서 Snowflake에서 실행 중인 앱을 생성, 관리, 업데이트 및 확인할 수 있습니다.
선언적 코드 및 버전 관리를 사용한 변경 사항 관리¶
Git 리포지토리의 재사용 가능한 구성 파일을 사용하면 데이터베이스 리소스의 변경 사항을 더욱 쉽게 관리할 수 있습니다.
데이터베이스 오브젝트는 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;
from snowflake.core import Root
from snowflake.core.table import PrimaryKey, Table, TableColumn
my_table = root.databases["my_db"].schemas["my_schema"].tables["vacation_spots"].fetch()
my_table.columns.append(TableColumn(name="city", datatype="varchar", nullable=False]))
my_table.columns.append(TableColumn(name="airport", datatype="varchar", nullable=False]))
my_table.columns.append(TableColumn(name="avg_temperature_air_f", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="avg_relative_humidity_pct", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="avg_cloud_cover_pct", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="precipitation_probability_pct", datatype="float", nullable=False]))
my_table_res = root.databases["my_db"].schemas["my_schema"].tables["vacation_spots"]
my_table_res.create_or_alter(my_table)
참고
또한 Snowflake Python APIs 및 Snowflake CLI 를 사용하여 Snowflake 리소스를 관리할 수도 있습니다.
GitHub Actions를 사용한 CI/CD 작업 자동화¶
Jinja 템플릿을 사용하여 스크립트 매개 변수화 에서 간략하게 설명된 바와 같이 GitHub Actions 를 사용하여 CI/CD 파이프라인을 구성하는 작업을 자동화할 수 있습니다. GitHub Actions를 사용하면 빌드, 테스트 및 배포 작업을 자동화하는 워크플로를 정의할 수 있습니다.
이러한 워크플로에서는 Snowflake와 GitHub의 다른 기능을 사용하여 조각을 조합할 수 있습니다. 또는 다음 작업을 수행할 수 있습니다.
Snowflake 자격 증명을 GitHub 시크릿 에 저장하여 GitHub Actions가 Snowflake에 연결할 수 있도록 합니다.
Snowflake CLI 를 사용하여 Snowflake에서 명령을 실행합니다.
연결된 Git 리포지토리에서 검색되어 Snowflake가 보유한 파일에 포함된 코드를 실행하려면 Snowflake CLI를 사용합니다.
다음 예제의 GitHub Actions 워크플로 발췌본은 파이프라인을 배포합니다. 워크플로는 이전에 구성된 시크릿에서 필요한 값을 검색하여 Snowflake에서 인증합니다.
워크플로에서는 파이프라인을 배포하기 위해 snow sql
명령과 함께 다음 두 개의 SQL 명령을 실행합니다.
ALTER GIT REPOSITORY는 Snowflake의
repository myco_common.public.my_repo
Git 리포지토리 스테이지에 복제된 GitHub 리포지토리에서 최신 버전을 가져옵니다.EXECUTE IMMEDIATE FROM은 리포지토리의
main
분기에서deploy_parameterized_pipeline.sql
파일에 있는 코드를 실행합니다.
name: Deploy data pipeline to prod
# Controls when the action will run.
on:
push:
branches:
- main
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install Python packages
run: pip install -r requirements.txt
- name: Deploy data pipeline
env:
SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
SNOWFLAKE_ROLE: ${{ secrets.SNOWFLAKE_ROLE }}
SNOWFLAKE_WAREHOUSE: ${{ secrets.SNOWFLAKE_WAREHOUSE}}
run: |
snow sql -q "ALTER GIT REPOSITORY quickstart_common.public.quickstart_repo FETCH" --temporary-connection --account $SNOWFLAKE_ACCOUNT --user $SNOWFLAKE_USER --role $SNOWFLAKE_ROLE --warehouse $SNOWFLAKE_WAREHOUSE
snow sql -q "EXECUTE IMMEDIATE FROM @quickstart_common.public.quickstart_repo/branches/main/deploy_parameterized_pipeline.sql USING (environment => 'prod', retention_time => 1)" --temporary-connection --account $SNOWFLAKE_ACCOUNT --user $SNOWFLAKE_USER --role $SNOWFLAKE_ROLE --warehouse $SNOWFLAKE_WAREHOUSE
Snowflake 작업을 사용하여 Snowflake 코드 실행을 조정합니다.¶
Snowflake 작업 을 생성하여 Snowflake에서 SQL 문 실행을 오케스트레이션할 수 있습니다. 작업에는 일정에 따라 실행하고, 재시도하고, 실패 후 일시 중단하고, 다른 특정 작업이 완료된 후 실행하는 기능이 포함됩니다.
작업을 사용하면 뷰에 조인하고, 이메일 알림을 보내고, 애플리케이션의 다른 부분에 데이터를 공급하는 등의 작업을 수행할 수 있습니다.
이러한 SQL 문을 조정하는 작업을 만든 후에는 한 번의 실행으로 작업을 실행할 수 있습니다. 이 항목의 다른 곳에서 설명한 바와 같이, 예를 들어 EXECUTE IMMEDIATE FROM으로 실행하는 리포지토리 파일에 EXECUTE TASK 를 포함시켜 작업을 실행할 수 있습니다.
SQL을 사용하여 작업을 만드는 방법에 대한 자세한 내용은 CREATE TASK 섹션을 참조하십시오.
Python API를 사용하여 작업을 만드는 방법에 대한 자세한 내용은 Python을 사용하여 Snowflake 작업 및 작업 그래프 관리하기 섹션을 참조하십시오.
SQL 또는 Snowsight 를 사용하여 작업 실행 기록을 포함한 작업을 모니터링할 수 있습니다.
SQL을 사용하여 작업을 모니터링하는 방법에 대한 자세한 내용은 TASK_HISTORY 뷰 섹션을 참조하십시오.
Snowsight 에서 작업을 모니터링하는 방법에 대한 자세한 내용은 Snowsight 의 작업 및 작업 그래프 보기 섹션을 참조하십시오.
Python API를 사용하여 작업을 관리하는 방법에 대한 자세한 내용은 Python을 사용하여 Snowflake 작업 및 작업 그래프 관리하기 섹션을 참조하십시오.
다음 예제의 작업은 vacation_spots
테이블에서 선택합니다. 그런 다음 결과에 따라 작업에서 SYSTEM$SEND_EMAIL을 호출하여 이메일 알림을 보냅니다.
CREATE OR ALTER TASK email_notification
WAREHOUSE = 'quickstart_wh'
AFTER vacation_spots_update
AS
BEGIN
LET OPTIONS VARCHAR := (
SELECT TO_VARCHAR(ARRAY_AGG(OBJECT_CONSTRUCT(*)))
FROM vacation_spots
WHERE TRUE
AND punctual_pct >= 50
AND avg_temperature_air_f >= 70
-- STEP 5: INSERT CHANGES HERE
LIMIT 10);
IF (:OPTIONS = '[]') THEN
CALL SYSTEM$SEND_EMAIL(
'email_integration',
'<insert your email here>', -- INSERT YOUR EMAIL HERE
'New data successfully processed: No suitable vacation spots found.',
'The query did not return any results. Consider adjusting your filters.');
END IF;
LET QUERY VARCHAR := 'Considering the data provided below in JSON format, pick the best city for a family vacation in summer?
Explain your choice, offer a short description of the location and provide tips on what to pack for the vacation considering the weather conditions?
Finally, could you provide a detailed plan of daily activities for a one week long vacation covering the highlights of the chosen destination?\n\n';
LET RESPONSE VARCHAR := (SELECT SNOWFLAKE.CORTEX.COMPLETE('mistral-7b', :query || :options));
CALL SYSTEM$SEND_EMAIL(
'email_integration',
'<insert your email here>', -- INSERT YOUR EMAIL HERE
'New data successfully processed: The perfect place for your summer vacation has been found.',
:response);
EXCEPTION
WHEN EXPRESSION_ERROR THEN
CALL SYSTEM$SEND_EMAIL(
'email_integration',
'<insert your email here>', -- INSERT YOUR EMAIL HERE
'New data successfully processed: Cortex LLM function inaccessible.',
'It appears that the Cortex LLM functions are not available in your region');
END;
대화형 Snowflake DevOps 사용에 대한 안내는 Snowflake DevOps 시작하기 빠른 시작을 참조하십시오.