Snowflake Native App 아티팩트가 구성된 로컬 폴더 준비하기

아티팩트가 구성된 로컬 폴더 만들기

snow app bundle 명령은 프로젝트에 로컬 디렉터리를 생성하고, 프로젝트 정의 파일에서 지정한 파일 구조로 채우고, 데코레이터(예: @sproc 또는 @udaf)가 포함된 Snowpark Python의 Snowflake Native App 설정 스크립트에서 CREATE FUNCTION 또는 CREATE PROCEDURE 선언을 생성합니다. 자세한 내용은 snowflake.snowpark.functions.udaf 등과 같이 선택한 함수 데코레이터에 해당하는 Snowpark Python 설명서를 참조하십시오.

snow app deploysnow app run 명령은 이미 이 기능을 사용합니다. 하지만 이제 명시적인 snow app bundle 명령을 사용하면 스테이지에 업로드되기 전에 이 디렉터리를 탐색하여 아티팩트가 예상대로 생성되었는지 확인할 수 있습니다.

아티팩트가 구성된 로컬 폴더를 생성하려면 다음을 수행하십시오.

  1. Snowflake snowflake.yml 프로젝트 정의 파일을 생성하거나 확인합니다. 예:

    definition_version: 2
    entities:
      codegen_nativeapp_pkg:
        type: application package
        manifest: root_files/_manifest.yml
        artifacts:
          - src: root_files/README.md
            dest: README.md
          - src: root_files/_manifest.yml
            dest: manifest.yml
          - src: root_files/setup_scripts/*
            dest: setup_scripts/
          - src: python/user_gen/echo.py
            dest: user_gen/echo.py
          - src: python/cli_gen/*
            dest: cli_gen/
            processors:
              - snowpark
      codegen_nativeapp_pkg:
        type: application
        from:
          target: codegen_nativeapp_pkg
    
    Copy
  2. 프로젝트 디렉터리에서 snow app bundle 명령을 실행하여 구성된 아티팩트가 포함된 임시 output/deploy 디렉터리를 생성합니다.

    snow app bundle
    
    Copy
  3. 출력 또는 배포 디렉터리의 내용이 snowdropper.yml 파일에서 지정한 규칙과 일치하는지 확인합니다. Python 파일에서 Snowpark 주석 처리를 호출하면 디렉터리의 수정된 설정 스크립트에서 생성된 코드를 볼 수 있습니다.

자세한 내용은 snow app bundle 명령을 참조하십시오.

Snowpark 주석 처리를 사용하여 SQL 코드 생성하기

SQL 배경 지식이 부족한 Snowflake Native App 개발자는 시간이 지남에 따라 상당히 크고 복잡해질 수 있는 설정 스크립트 를 작성하고 유지 관리하는 것이 번거로울 수 있습니다. 설정 스크립트에는 고객이 자체 데이터와 함께 사용할 수 있는 모든 애플리케이션 로직이 포함되어 있으므로 Snowflake Native App을 개발하는 데 필수적인 부분입니다. 설정 스크립트의 핵심 구성 요소 중 하나는 함수와 저장 프로시저에 Snowpark Python 확장 프로그램 함수를 사용할 수 있는 기능입니다. Python, Java 또는 기타 Snowpark 지원 언어로 Snowpark 코드를 작성하는 것 외에도 설정 스크립트에서 SQL을 사용하여 해당 함수 및 프로시저의 해당 부분을 작성해야 합니다.

예를 들어, Snowpark Python을 사용하여 다음과 같이 기본 함수와 저장 프로시저를 생성할 수 있습니다.

# Example python file "echo.py" that a developer writes

def echo_fn(data):
    return 'echo_fn: ' + data

def echo_proc(session, data):
    return 'echo_proc: ' + data
Copy

그런 다음 파일을 스테이지에 업로드하고 다음과 같이 설정 스크립트 SQL 코드에서 참조해야 합니다.

-- Sample setup_script.sql SQL file for a Snowflake Native App

CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_proc'
  IMPORTS=('/echo.py');

    GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
      TO APPLICATION ROLE app_instance_role;

-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');

GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
  TO APPLICATION ROLE app_instance_role;
Copy

자동 SQL 코드 생성

참고

자동 SQL 코드 생성 기능을 활용하려면 Snowpark Python 버전 1.15.0 이상을 사용해야 합니다.

이러한 추가 작업을 줄이기 위해 Snowflake CLI 는 설정 스크립트에 필요한 SQL을 자동으로 생성할 수 있습니다. Snowpark Python은 확장 프로그램 함수 데코레이터(@udf, @sproc, @udtf, @udaf) 기능을 지원하여 snowflake.snowpark.functions.udf 함수 데코레이터를 사용하는 것과 같이 Python 코드에 주석을 추가할 수 있습니다. Snowflake CLI 는 이러한 데코레이터를 사용하여 설정 스크립트에 필요한 SQL 코드를 자동으로 생성하고 유효성을 검사할 수 있습니다.

예를 들어, 이전 예제의 함수에 @udf 데코레이터를 사용할 수 있습니다.

# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
  return 'echo_fn: ' + str
Copy

@udf 데코레이터를 사용하면 그림과 같이 Snowflake CLI snow app bundle (및 내부적으로 snow app bundle 명령을 호출하는 다른 명령)에 Snowpark Python 데코레이터를 처리하고 해당 SQL 명령을 생성하여 설정 스크립트에 자동으로 포함하도록 지시할 수 있습니다. 따라서 설정 스크립트에 작성해야 하는 SQL 코드의 양을 최소화할 수 있습니다.

-- Sample setup_script.sql SQL file for a Snowflake Native App

-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_fn'
  IMPORTS=('/echo.py');

  GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
    TO APPLICATION ROLE app_instance_role;
Copy

Snowpark Python 데코레이터 사용하기

Snowflake CLI 의 Snowpark 데코레이터는 일반 Snowpark Python 데코레이터와 동일하게 작동하지만, Snowflake Native App 용으로 특별히 Python 코드 파일을 작성할 때는 다음과 같은 차이점을 알고 있어야 합니다.

  • Snowflake CLI 는 Snowflake에 연결되지 않은 샌드박스 환경에서 이러한 Python 파일을 실행하므로 이러한 파일에서는 Session 오브젝트를 사용할 수 없습니다. 그 결과, Snowpark Session 을 참조하면 오류가 발생합니다.

  • @udf, @sproc, @udaf, @udtf Snowpark Python 데코레이터만 사용할 수 있습니다.

  • 이러한 데코레이터를 일반 함수로 사용하여 코드를 Snowflake 오브젝트로 등록할 수 없습니다. 지원되는 데코레이터로 명시적으로 주석이 달린 코드만 인식됩니다. 따라서 Python 함수는 명명된 함수여야 합니다. Lambda 함수는 지원되지 않습니다.

  • Snowflake CLI 는 설정 스크립트에서 함수와 절차를 생성할 때 항상 Snowflake에서 권장하는 대로 CREATE OR REPLACE 문을 생성합니다.

데코레이터 속성에 대한 추가 정보

다음 테이블에는 Python 데코레이터 속성이 나열되어 있으며 Snowflake CLI 가 이를 사용하는 방법이 설명되어 있습니다.

Python 데코레이터 속성

속성

세부 정보

이름

선택 사항

Snowflake CLI 가 SQL 문을 생성하는 데 사용하는 함수 또는 저장 프로시저의 이름입니다.

이 속성을 생략하면 Snowflake CLI 는 Python 함수 이름을 재사용하여 SQL 문을 생성합니다.

input_types

필수 사항

이 함수나 저장 프로시저에 대한 각 입력 매개 변수의 유형입니다.

이 정보는 데코레이터 매개 변수에서 제공하거나 코드에서 직접 유형 주석을 제공해야 합니다. 이 정보를 두 위치에서 사용할 수 없는 경우 Snowflake CLI 는 이 함수 또는 저장 프로시저에 대한 SQL 문을 생성하지 않습니다.

return_type

필수 사항

이 함수나 저장 프로시저의 반환 값을 입력합니다.

이 정보는 데코레이터 매개 변수에서 제공하거나 코드에서 직접 유형 주석을 제공해야 합니다. 이 정보를 두 위치에서 사용할 수 없는 경우 Snowflake CLI 는 이 함수 또는 저장 프로시저에 대한 SQL 문을 생성하지 않습니다.

packages

선택 사항

패키지의 목록입니다. 버전 번호를 포함하거나 포함하지 않고 snowflake-snowpark-python 을 지정할 수 있습니다. 이 패키지에 대한 버전 번호를 제공하면 Snowflake CLI 는 해당 버전을 SQL 생성의 일부로 사용하지 않지만, 목록에 있는 다른 패키지의 버전 번호는 유지합니다.

이 속성을 생략하면 Snowflake CLI 는 자동으로 snowflake-snowpark-python 을 유일한 패키지로 추가하고 생성된 SQL 문에 이를 반영합니다.

가져오기

선택 사항

Snowflake 함수 또는 저장 프로시저가 스테이지에서 가져와야 하는 파일 목록입니다. 문자열이나 문자열의 튜플로 지정할 수 있습니다. 튜플을 지정하는 경우 Snowflake CLI 는 0번째 인덱스에 있는 문자열만 사용합니다. 튜플 사용의 예시를 보려면 외부 Python 파일 사용하기 섹션을 참조하십시오.

가져오기를 지정하지 않으면 Snowflake CLI 는 SQL 을 생성하는 함수 또는 저장 프로시저가 포함된 Python 파일에 대한 가져오기를 자동으로 추가합니다. 가져오기 경로는 프로젝트 정의 파일에 따라 배포 루트 디렉터리에 있는 Python 파일의 dest 매개 변수에 의해 결정됩니다.

execute_as

선택 사항

저장 프로시저를 실행할 때 사용할 가상 사용자입니다. 가능한 값으로는 callerowner 가 있습니다. 지정되지 않은 경우, Snowflake CLI 는 owner 를 기본값으로 사용합니다. 이 속성은 함수에는 적용되지 않습니다.

핸들러

N/A

함수 또는 저장 프로시저의 처리기입니다. Snowflake CLI 는 이 필드를 자동으로 채웁니다.

replace

사용되지 않음

Snowflake CLI 는 코드 생성을 위해 true 를 가정합니다.

session

필수 사항

None 이어야 합니다. 생략하면, Snowflake CLI 는 오류를 throw합니다.

is_permanent

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

stage_location

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

if_not_exists

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

strict

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

secure

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

immutable

사용되지 않음

Snowflake CLI 는 SQL 생성에 이 필드를 사용하지 않습니다.

native_app_params

선택 사항

(Snowflake Native App 만 해당)

다음 Snowflake Native App 매개 변수가 포함된 Python 사전:

  • schema: Snowpark 함수나 저장 프로시저가 포함된 스키마의 이름입니다. 이 스키마는 이미 설정 스크립트에 정의되어 있어야 합니다. Snowflake는 이 값을 설정 스크립트 파일에서 버전이 지정된 스키마의 이름으로 설정할 것을 권장합니다. Snowflake CLI 는 생성된 SQL 문의 Snowpark 함수 또는 프로시저 이름 앞에 이 값을 접두사로 붙입니다. Snowflake CLI 는 사용자를 위해 스키마를 생성하지 않습니다.

  • application_roles: 생성된 Snowpark 함수 또는 프로시저에 USAGE 권한을 부여할 애플리케이션 역할 목록입니다. Snowflake CLI 는 애플리케이션 역할을 생성하지 않고 GRANT USAGE ON FUNCTION <schema_name.func_name> TO APPLICATION ROLE <app_role> 같은 SQL 문만 생성하여 설정 스크립트에 추가합니다.

기술적으로는 선택 사항이지만 프로젝트 정의 파일에 native_app_params 속성을 지정하지 않으면 설정 스크립트가 유효하지 않을 수 있습니다.

Python 파일을 대상 스테이지에 업로드할 때 Snowflake CLI 는 데코레이터를 주석으로 변환하여 현재 세션에서 이러한 UDFs 및 저장 프로시저가 생성되지 않도록 합니다. 원본 소스 파일은 변경되지 않으므로 snow app bundle 명령은 작동하지 않는 상태로 유지됩니다. snow app bundle 명령을 실행할 때마다 배포 루트가 다시 생성되므로 배포 루트 디렉터리에 있는 Python 파일만 주석을 포함하도록 변경됩니다. 다음 예제는 Snowflake CLI 설명 데코레이터를 설명하는 방법을 보여줍니다.

# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#:    return_type=IntegerType(),
#:    input_types=[IntegerType(), IntegerType()],
#:    packages=["snowflake-snowpark-python==1.15.0"],
#:    native_app_params={
#:        "schema": "ext_code_schema",
#:        "application_roles": ["app_instance_role"],
#:    },
#: )
def add_sp(session_, x, y):
    return x + y
Copy

또한 프로젝트 정의 파일에 processors 속성이 있는 Python 파일만 영향을 받습니다.