チュートリアル: Snowpark Container Servicesを使用して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 Native App with Snowpark Container Services プロジェクトを初期化するには、 Snowflake CLI を使用します。
アプリのDockerイメージを構築します。
Snowflake Native App with Snowpark Container Services のアプリケーションパッケージと必要なアプリケーションファイルを作成します。
コンテナ内でサービス関数を呼び出して、 Snowflake Native App with Snowpark Container Services をテストします。
前提条件¶
このチュートリアルを実行するには、次の前提条件を満たしている必要があります。
Snowpark Container Serviceをサポートする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>
このコマンドには2つのパラメーターが必要です。
<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]
このコマンドは、Snowflakeアカウント内のイメージリポジトリを使用するためにDocker CLI に必要な認証情報をロードします。デフォルトを使用しない場合は、接続名を指定する必要があります。
すべてが成功した場合、
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 で使用され、後の2つは 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 Native App with Snowpark Container Services としてSnowflakeアカウントにデプロイできるローカルファイル構造を定義しました。次のセクションでは、 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 内にコンテナをインスタンス化しました。