자습서: Snowpark Container Service로 Snowflake Native App 만들기¶
소개¶
이 자습서에서는 Snowflake Native App with Snowpark Container Services 를 만드는 방법을 설명합니다. Snowflake Native App with Snowpark Container Services 는 Snowflake에서 컨테이너 워크로드를 실행하는 Snowflake Native App 입니다. Snowflake Native Apps with Snowpark Container Services 은 보안, 로깅, 공유 데이터 콘텐츠, 애플리케이션 논리 등 Snowflake Native App Framework 의 모든 기능을 활용하면서 모든 컨테이너화된 서비스를 실행할 수 있습니다.
이 자습서에서는 Snowflake CLI 및 Snowsight 를 모두 사용하여 필요한 작업을 수행합니다.
알아볼 내용¶
이 자습서에서는 다음에 대해 설명합니다.
Snowflake CLI 를 사용하여 Snowflake Native App with Snowpark Container Services 프로젝트를 초기화합니다.
앱에 대한 Docker 이미지를 빌드합니다.
애플리케이션 패키지와 Snowflake Native App with Snowpark Container Services 에 필요한 애플리케이션 파일을 생성합니다.
컨테이너 내에서 서비스 함수를 호출하여 Snowflake Native App with Snowpark Container Services 를 테스트합니다.
전제 조건¶
이 자습서를 수행하려면 다음 전제 조건을 충족해야 합니다.
Snowpark Container Services를 지원하는 Snowflake 계정에 액세스합니다.
이 자습서에 사용된 역할을 생성하고 해당 역할에 필요한 권한을 부여하려면 ACCOUNTADMIN 역할을 사용할 수 있어야 합니다.
로컬 머신에 Snowflake CLI 버전
3.0.0
이상이 설치되어 있어야 합니다.로컬 머신에 Docker Desktop이 설치되어 있어야 합니다.
이 자습서에 대한 역할 설정¶
이 자습서에서는 tutorial_role
역할을 사용하여 Snowflake Native App with Snowpark Container Services 를 생성하는 과정을 안내합니다. 이 자습서를 진행하기 전에 ACCOUNTADMIN 역할이 있는 Snowflake 사용자는 이 역할을 구성하기 위해 다음 단계를 수행해야 합니다.
tutorial_role
역할을 생성하고 설정하려면 다음을 수행합니다.
tutorial_role
역할을 생성하려면 다음 명령을 실행합니다.CREATE ROLE tutorial_role;
자습서를 수행할 Snowflake 사용자에게
tutorial_role
을 부여하려면 다음 명령을 실행합니다.GRANT ROLE tutorial_role TO USER <user_name>;
여기서
user_name
자습서를 수행할 사용자의 이름을 지정합니다.
컨테이너 앱에 필요한 Snowflake 오브젝트를 만들고 사용하는 데 필요한 권한을 부여하려면 다음 명령을 실행합니다.
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE WAREHOUSE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE DATABASE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION; GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION;
이 섹션의 작업을 수행한 후 계정에 tutorial_role
역할이 부여된 사용자는 Snowflake Native App with Snowpark Container Services 를 생성하는 데 필요한 모든 Snowflake 오브젝트를 생성할 수 있는 권한을 갖게 됩니다. 이 자습서의 나머지 부분에서는 이 역할을 사용합니다.
실제 상황에서 공급자는 컴퓨팅 풀, 웨어하우스, 데이터베이스 등 컨테이너를 사용하여 앱을 개발하기 위해 유사한 권한이나 기존 오브젝트에 대한 액세스 권한이 필요할 수 있습니다.
계정에 필요한 오브젝트 만들기¶
이 섹션에서는 Snowflake Native App with Snowpark Container Services 에 필요한 몇 개의 Snowflake 오브젝트를 생성합니다.
Snowflake CLI 연결 설정¶
이 자습서에서 실행할 명령은 앱을 개발 중인 계정에 기본적으로 연결하도록 Snowflake CLI 를 구성한 것으로 가정합니다. 이 계정이 기본적으로 설정되어 있지 않은 경우 -c
명령줄 인자를 사용하여 다른 이름의 연결을 지정할 수 있습니다. 예:
snow sql -q "SELECT 1" -c connection_name
웨어하우스와 이미지 리포지토리 만들기¶
필요한 오브젝트를 생성하려면 Snowsight 또는 Snowflake CLI 를 통해 다음을 수행합니다.
Snowsight 의 현재 컨텍스트가
tutorial_role
역할을 사용하도록 설정하려면 다음 명령을 실행합니다.USE ROLE tutorial_role;
Snowflake CLI 를 사용 중인 경우, 대신
--role tutorial_role
을 사용할 수 있습니다.Snowflake Native App with Snowpark Container Services 에 대한 웨어하우스를 생성하려면 다음 명령을 실행합니다.
CREATE OR REPLACE WAREHOUSE tutorial_warehouse WITH WAREHOUSE_SIZE = 'X-SMALL' AUTO_SUSPEND = 180 AUTO_RESUME = true INITIALLY_SUSPENDED = false;
Snowflake Native App 이 SQL 명령과 저장 프로시저를 실행하려면 웨어하우스가 필요합니다.
컨테이너를 저장하는 데 사용되는 이미지 리포지토리를 만들려면 다음 명령을 실행합니다.
CREATE DATABASE tutorial_image_database; CREATE SCHEMA tutorial_image_schema; CREATE IMAGE REPOSITORY tutorial_image_repo;
이 섹션에서는 앱에 대한 쿼리를 실행하는 데 사용되는 웨어하우스와 컨테이너 이미지를 호스팅하는 이미지 리포지토리를 만들었습니다.
다음 섹션에서는 컨테이너에 대한 이미지를 생성하여 위에서 생성한 이미지 리포지토리에 업로드합니다.
Snowpark Container Services 서비스에 대한 이미지 빌드¶
이 섹션에서는 Docker 이미지를 빌드하고 이전 섹션에서 만든 이미지 리포지토리에 업로드합니다.
프로젝트 디렉터리 만들기¶
앱의 원본 코드는 로컬 파일 시스템에 존재하며 원하는 경우 버전 관리에서 확인할 수 있습니다. 먼저 Snowflake CLI 를 사용하여 Native Apps 프로젝트를 부트스트랩한 다음 하위 폴더에 컨테이너 서비스용 이미지를 빌드해 보겠습니다.
로컬 파일 시스템에서 다음 명령을 실행하여 이름이
na-spcs-tutorial
인 폴더를 만듭니다.snow init --template app_basic na-spcs-tutorial
참고
이 폴더에 파일과 하위 폴더를 추가하고 이후 하위 섹션에서 이 명령으로 생성된 파일을 편집합니다.
참고
snow init --help
를 실행하여 Snowflake Native App 개발 환경 설정을 위한 다른 템플릿을 확인합니다.na-spcs-tutorial
폴더에 이름이service
인 폴더를 만듭니다. 이 폴더에는 Snowflake에 빌드하여 게시할 컨테이너 기반 서비스의 소스 코드가 들어 있습니다.자습서에 필요한 Docker 파일을 얻으려면 zip 파일 을 로컬 파일 시스템에 다운로드합니다.
na-spcs-tutorial/service
폴더에 압축을 풉니다. 이 폴더에는 다음 파일이 포함되어야 합니다.echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
터미널 창을 열고 이 디렉터리로 변경합니다.
Docker 이미지를 빌드하고 컨테이너에 업로드¶
Docker 이미지를 빌드하고 이미지 리포지토리에 업로드하려면 다음을 수행합니다.
다음 Docker CLI 명령을 실행합니다. 명령에 현재 작업 디렉터리(.)를 지정해야 합니다.
docker build --rm --platform linux/amd64 -t my_echo_service_image:tutorial .
이 명령은 다음을 수행합니다.
다운로드한 zip 파일에 포함된 Docker 파일을 사용하여 Docker 이미지를 빌드합니다.
이미지
my_echo_service_image
의 이름 지정이미지에
tutorial
태그를 적용합니다.
이전 섹션에서 생성한 이미지 리포지토리의 URL을 식별하려면 다음 명령을 실행합니다.
REPO_URL=$(snow spcs image-repository url tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role) echo $REPO_URL
이미지 리포지토리의 URL은
$REPO_URL
변수에 캡처된 다음 콘솔에 인쇄됩니다. 이 값은 다음 단계에서 사용합니다.이미지 URL이 포함된 이미지에 대한 태그를 생성하려면 다음 Docker CLI 명령을 실행합니다.
docker tag <image_name> <image_url>/<image_name>
이 명령에는 두 개의 매개 변수가 필요합니다.
<image_name>
이미지와 태그의 이름을 지정합니다.<image_url>/<image_name>
이미지가 업로드되는 이미지 리포지토리의 URL과 원격 리포지토리에 저장할 이미지 이름 및 태그를 지정합니다.
이 튜토리얼을 위해서는
$REPO_URL
및my_echo_service_image:tutorial
을 사용합니다.docker tag my_echo_service_image:tutorial $REPO_URL/my_echo_service_image:tutorial
Snowflake 레지스트리로 인증하려면 다음 Snowflake CLI 명령을 실행합니다.
snow spcs image-registry login [-c connection_name]
이 명령은 Docker CLI가 Snowflake 계정의 이미지 리포지토리를 사용하는 데 필요한 자격 증명을 로드합니다. 기본값을 사용하지 않는 경우 연결 이름을 지정해야 합니다.
모든 작업이 성공하면
Login Succeeded
메시지가 표시됩니다.Docker 이미지를 이미지 리포지토리에 업로드하려면 다음
docker push
명령을 실행합니다.docker push $REPO_URL/<image_name>
이 명령은 이전 단계의
<image_name>
과 동일한 값을 사용합니다.docker push $REPO_URL/my_echo_service_image:tutorial
다음 명령을 실행하여 이미지가 성공적으로 업로드되었는지 확인합니다.
snow spcs image-repository list-images tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role
이 섹션에서는 echo 서비스가 포함된 Docker 이미지를 생성하고 자습서의 앞부분에서 생성한 tutorial_repository
이미지 리포지토리에 푸시했습니다.
다음 섹션에서는 이 이미지를 사용하는 애플리케이션 패키지를 만듭니다.
Snowflake Native App 개발¶
이 섹션에서는 다음 파일을 만듭니다.
- 프로젝트 정의 파일
생성할 Snowflake 오브젝트에 대한 정보가 포함된 YAML 파일입니다. 이 파일의 이름은
snowflake.yml
이며 Snowflake CLI 가 애플리케이션 패키지와 오브젝트를 계정에 배포하는 데 사용됩니다.- 매니페스트 파일
애플리케이션에 대한 기본 구성 및 콜백 정보가 포함된 YAML 파일입니다. 이 파일의 이름은
manifest.yml
입니다.- 설정 스크립트
컨슈머가 자신의 계정에 애플리케이션을 설치할 때 자동으로 실행되는 SQL 스크립트입니다. 이 파일은 매니페스트에서 참조하는 한 원하는 대로 호출할 수 있습니다.
첫 번째 파일은 Snowflake CLI 에서 사용하며, 후자의 두 파일은 Snowflake Native App Framework 에서 필요합니다.
이 자습서 전체에서 이러한 파일과 그 내용에 대해 자세히 알아보겠습니다. 또한 이 자습서의 뒷부분에서 애플리케이션을 보고 게시할 때 유용한 readme 파일도 만듭니다.
애플리케이션 패키지의 매니페스트 파일 만들기¶
애플리케이션 패키지에 필요한 매니페스트 파일을 만들려면 다음을 수행합니다.
na-spcs-tutorial/app/manifest.yml
을 다음과 같이 수정합니다.manifest_version: 1 artifacts: setup_script: setup_script.sql readme: README.md container_services: images: - /tutorial_image_database/tutorial_image_schema/tutorial_image_repo/my_echo_service_image:tutorial privileges: - BIND SERVICE ENDPOINT: description: "A service that can respond to requests from public endpoints." - CREATE COMPUTE POOL: description: "Permission to create compute pools for running services"
이 예제에는 다음이 포함됩니다.
artifacts
속성은 컨테이너를 사용하는 앱에 필요한 리소스의 위치를 지정하며, 여기에는 이전 단계에서 생성한 Docker 이미지의 위치 및 Snowsight 에 표시될 프로젝트 README가 포함됩니다.privileges
속성을 사용하면 서비스가 공개 요청에 응답하고 자체 컴퓨팅 풀을 생성할 수 있습니다. 이러한 속성은 자습서의 다음 단계에서 서비스를 인스턴스화하는 데 필요합니다.
애플리케이션 패키지에 대한 설정 스크립트 만들기¶
애플리케이션 패키지에 필요한 설치 스크립트를 만들려면 다음을 수행합니다.
다음을 포함하도록
na-spcs-tutorial/app/setup_script.sql
파일을 수정합니다.CREATE APPLICATION ROLE IF NOT EXISTS app_user; CREATE SCHEMA IF NOT EXISTS core; GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_user; CREATE OR ALTER VERSIONED SCHEMA app_public; GRANT USAGE ON SCHEMA app_public TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.start_app() RETURNS string LANGUAGE sql AS $$ BEGIN -- account-level compute pool object prefixed with app name to prevent clashes LET pool_name := (SELECT CURRENT_DATABASE()) || '_compute_pool'; CREATE COMPUTE POOL IF NOT EXISTS IDENTIFIER(:pool_name) MIN_NODES = 1 MAX_NODES = 1 INSTANCE_FAMILY = CPU_X64_XS AUTO_RESUME = true; CREATE SERVICE IF NOT EXISTS core.echo_service IN COMPUTE POOL identifier(:pool_name) FROM spec='service/echo_spec.yaml'; CREATE OR REPLACE FUNCTION core.my_echo_udf (TEXT VARCHAR) RETURNS varchar SERVICE=core.echo_service ENDPOINT=echoendpoint AS '/echo'; GRANT USAGE ON FUNCTION core.my_echo_udf (varchar) TO APPLICATION ROLE app_user; RETURN 'Service successfully created'; END; $$; GRANT USAGE ON PROCEDURE app_public.start_app() TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.service_status() RETURNS VARCHAR LANGUAGE SQL EXECUTE AS OWNER AS $$ DECLARE service_status VARCHAR; BEGIN CALL SYSTEM$GET_SERVICE_STATUS('core.echo_service') INTO :service_status; RETURN PARSE_JSON(:service_status)[0]['status']::VARCHAR; END; $$; GRANT USAGE ON PROCEDURE app_public.service_status() TO APPLICATION ROLE app_user;
애플리케이션 패키지에 대한 readme 만들기¶
na-spcs-tutorial/app/README.md
를 다음과 같이 수정합니다.Welcome to your first app with containers!
이 readme 파일은 앱을 설치한 컨슈머에게 표시됩니다.
프로젝트 정의 파일을 만듭니다.¶
이 섹션에서는 Snowflake CLI 에 필요한 프로젝트 정의 파일을 생성합니다.
na-spcs-tutorial/snowflake.yml
을 다음과 같이 수정합니다.definition_version: 2 entities: na_spcs_tutorial_pkg: type: application package manifest: app/manifest.yml artifacts: - src: app/* dest: ./ - service/echo_spec.yaml meta: role: tutorial_role warehouse: tutorial_warehouse na_spcs_tutorial_app: type: application from: target: na_spcs_tutorial_pkg debug: false meta: role: tutorial_role warehouse: tutorial_warehouse
이 섹션에서는 Snowflake 계정에 배포할 수 있는 로컬 파일 구조를 Snowflake Native App with Snowpark Container Services 로 정의했습니다. 다음 섹션에서는 Snowflake CLI 를 사용하여 이 배포를 수행합니다.
앱 만들기 및 테스트¶
Snowflake Native App with Snowpark Container Services 에 대한 매니페스트 파일, 설정 스크립트 및 서비스 사양을 정의한 후 Snowflake CLI 를 사용하여 계정에 배포하여 앱을 테스트할 수 있습니다.
애플리케이션 배포¶
스테이지 개발 모드에서 애플리케이션을 배포하려면 다음을 수행합니다.
na-spcs-tutorial
폴더에서 다음 명령을 실행하여 계정에 애플리케이션 패키지와 오브젝트를 생성합니다.snow app run [-c connection_name]
이 명령은 계정에서 이름이
na_spcs_tutorial_pkg
인 애플리케이션 패키지와 이름이na_spcs_tutorial_app
인 애플리케이션 오브젝트가 생성되었다는 확인을 표시합니다. 이 이름은 이전 섹션에서 생성한snowflake.yml
프로젝트 정의의 이름과 일치합니다.
콘솔에 URL 출력을 사용하여 애플리케이션을 볼 수 있습니다. 하지만 먼저 컨테이너 기반 서비스를 만드는 데 필요한 모든 권한이 있는지 확인해야 합니다.
이 작업은 다음 섹션에서 수행합니다.
권한 부여 및 앱 테스트¶
이 섹션에서는 앱에 필요한 권한을 부여하고 컨테이너에서 서비스를 호출하여 앱을 테스트합니다.
Snowsight 또는 Snowflake CLI 를 사용하여 SQL 명령을 실행할 수 있습니다.
권한을 부여하고 앱을 테스트하려면 다음 단계를 수행합니다.
참고
다음 구문으로 Snowflake CLI 에서 실행합니다.
snow sql -q "<sql>" --role tutorial_role --warehouse tutorial_warehouse이전 단계와 마찬가지로
-c connection_name
을 추가하여 기본 연결이 아닌 연결을 선택할 수 있습니다.
다음을 실행하여 앱에
CREATE COMPUTE POOL
권한을 부여합니다.grant create compute pool on account to application na_spcs_tutorial_app; grant bind service endpoint on account to application na_spcs_tutorial_app;
setup_script.sql
파일에서 정의한app_public.start_app
프로시저를 실행합니다.CALL na_spcs_tutorial_app.app_public.start_app();
이 프로시저에서는 컴퓨팅 풀을 생성하고, 서비스를 인스턴스화하고, 서비스 함수를 생성합니다.
다음을 실행하여 함수가 생성되었는지 확인합니다.
SHOW FUNCTIONS LIKE '%my_echo_udf%' IN APPLICATION na_spcs_tutorial_app;
참고
Snowflake Native App 의 일부로 실행되기 때문에 컨슈머는 실행 중인 서비스를 볼 수 없습니다. 예를 들어,
SHOW SERVICES IN APPLICATION na_spcs_tutorial_app;
을 실행해도 값이 반환되지 않습니다.서비스가 생성되었고 정상인지 확인하려면 다음 명령을 실행합니다.
CALL na_spcs_tutorial_app.app_public.service_status();
이 명령은 설정 스크립트에서 정의한
app_public.service_status
프로시저를 호출합니다.이 프로시저가
READY
를 반환하면 다음 단계로 진행합니다.서비스 함수를 호출하여 서비스에 요청을 보내고 응답을 확인하려면 다음 명령을 실행합니다.
SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
이전 섹션에서 업로드한 서비스에서 보낸
Bob said hello
메시지가 표시됩니다.
자습서에서 생성된 앱과 오브젝트 분해¶
이 앱은 컴퓨팅 풀을 사용하기 때문에 계정에 크레딧이 누적되고 실행 비용이 발생합니다. 앱이 리소스를 소비하지 않도록 하려면 앱이 생성한 계정 수준 오브젝트(예: COMPUTE POOL
)와 함께 애플리케이션 오브젝트를 분해해야 합니다.
현재 컴퓨팅 풀이 실행 중인지 확인하려면 다음 명령을 실행합니다.
snow object list compute-pool -l "na_spcs_tutorial_app_%"
애플리케이션 오브젝트에 의해 생성된
ACTIVE
컴퓨팅 풀이 있는 행이 표시되어야 합니다.다음 Snowflake CLI 명령을 실행하여 앱을 분해합니다.
snow app teardown --cascade [-c connection_name]
참고
CASCADE
옵션은 앱이 삭제되기 전에 앱이 소유한 모든 관련 계정 수준 오브젝트를 제거합니다. 이 옵션에는 Snowflake CLI 2.4.0 이상이 필요합니다.snow object list
명령을 다시 실행하여 컴퓨팅 풀이 삭제되었는지 확인합니다.
참고
snow app teardown
명령은 애플리케이션 패키지와 애플리케이션 오브젝트를 모두 삭제하므로 모든 상태 데이터가 손실됩니다.
자세히 알아보기¶
축하합니다! 이제, 이 자습서를 완료했을 뿐만 아니라 Snowflake Native App with Snowpark Container Services 을 개발하고 수명 주기를 게시했습니다.
그 과정에서 다음 작업을 수행했습니다.
Snowsight 및 Snowflake CLI 를 사용하여 Snowflake Native App Framework 로 애플리케이션을 빌드했습니다.
Snowflake CLI 에서 사용되는 연결을 구성하는 방법에 대한 자세한 내용은 Snowflake CLI 구성하기 및 Snowflake에 연결하기 섹션을 참조하십시오.
Snowsight 에 대한 자세한 내용은 워크시트 시작하기 및 Snowsight에서 워크시트로 작업하기 섹션을 참조하십시오.
Snowflake CLI 의 Native Apps에 대한 자세한 내용은 Snowflake CLI 에서 Snowflake Native App 사용하기 섹션을 참조하십시오.
모든 애플리케이션에 필요한 매니페스트와 설정 스크립트를 만들었습니다.
자세한 내용은 애플리케이션 패키지의 매니페스트 파일 만들기 및 설정 스크립트 만들기 섹션을 참조하십시오.
애플리케이션 논리와 애플리케이션의 데이터 콘텐츠를 위한 컨테이너로 작동하는 애플리케이션 패키지를 만들었습니다.
자세한 내용은 애플리케이션 패키지 만들기 섹션을 참조하십시오.
Docker CLI 및 Snowflake CLI 를 사용하여 컨테이너를 빌드하고 Snowflake에 업로드했습니다.
Snowpark Container Services를 사용하여
COMPUTE POOL
을 생성하고 Snowflake Native App 내부에 컨테이너를 인스턴스화합니다.