チュートリアル2: コンテナーでアプリを作成する¶
概要¶
Snowflake Native App Framework は、プロバイダーはSnowflake Data Cloud内でアプリを構築、販売、配布することができます。プロバイダーは、Snowflakeのコア機能を活用してコンシューマーとデータやアプリケーションロジックを共有するアプリケーションを作成できます。 Snowflake Native App のロジックには、ストアドプロシージャやユーザー定義関数 (UDFs) などの関数があります。プロバイダーは、Snowflake Marketplaceのリストまたはプライベートリストを通じて、コンシューマーとアプリケーションを共有することができます。
Snowflake Native App Snowpark Container Servicesを実装することで、Snowflakeエコシステム内でのコンテナー化されたアプリのデプロイ、管理、スケーリングを容易にすることができます。このチュートリアルでは、Snowflake でコンテナーワークロードを実行する Snowflake Native App である Snowflake Native App with Snowpark Container Services の作成方法について説明します。 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 をテストします。
Snowflake環境のセットアップ¶
このチュートリアルを実行するには、次の前提条件を満たしている必要があります。
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オブジェクトを作成します。
ウェアハウスとイメージリポジトリを作成する¶
必要なオブジェクトを作成するには、 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;
このセクションでは、作成したアプリのクエリ実行に使用するウェアハウスと、コンテナーイメージをホストするイメージリポジトリを作成しました。
次のセクションでは、コンテナー用のイメージを作成し、上記で作成したイメージリポジトリにアップロードします。
チュートリアル用にSnowflake CLI 接続を作成します。¶
このチュートリアルの Snowflake CLI コマンドを実行するには、チュートリアル用に Snowflake CLI 接続をセットアップする必要があります。
接続を作成するには、以下のタスクを実行します。
ターミナルから以下のコマンドを実行します。
snow connection add
接続名は
tut-connection
と入力してください。Snowflake CLI 接続の追加情報を入力します。
使用する具体的な値は、Snowflakeアカウントによって異なります。ただし、ロール、ウェアハウス、データベース、スキーマのプロパティには以下の値を使用する必要があります。
パラメーター
必要値
接続のロール
tutorial_role
接続用ウェアハウス
tutorial_warehouse
接続用データベース
tutorial_image_database
接続スキーマ
tutorial_image_schema
以下のコマンドを実行して接続を確認します。
snow connection test -c tut-connection
このコマンドの出力は以下のようになるはずです。
+----------------------------------------------------------------------------------+ | key | value | |-----------------+----------------------------------------------------------------| | Connection name | tut-connection | | Status | OK | | Host | USER_ACCOUNT.snowflakecomputing.com | | Account | USER_ACCOUNT | | User | tutorial_user | | Role | TUTORIAL_ROLE | | Database | TUTORIAL_IMAGE_DATABASE | | Warehouse | TUTORIAL_WAREHOUSE | +----------------------------------------------------------------------------------+
注意
tut-connection
接続を作成しない場合は、ロール、データベース、ウェアハウスの接続プロパティに正しい値を指定した接続を使用する必要があります。
アプリのプロジェクトを設定¶
前のセクションでは、チュートリアル用に Snowflake CLI 接続をセットアップしました。
このセクションでは、 Snowflake CLI を使ってアプリのプロジェクトを作成します。プロジェクトには、アプリに必要なすべてのアセットが含まれています。これらのファイルはローカルファイルシステムに保存され、開発ワークフローの一部としてバージョン管理システムで管理することができます。
Snowflake CLI を使用してプロジェクトファイルを作成します。¶
プロジェクト・ファイルを作成するには、以下のコマンドを実行します。
snow init --template app_basic na-spcs-tutorial
プロジェクト識別子の値を入力してください。
このフォルダにファイルやサブフォルダを追加したり、このコマンドが作成したファイルを編集したりするのは、後のセクションで行います。
このコマンドは、 app_basic
プロジェクトテンプレートを使用して、 na-spcs-tutorial
という名前のフォルダーを作成します。
na-spcs-tutorial
フォルダー内に、このコマンドは以下のファイルとフォルダーを作成します:
├── README.md
├── app
└── manifest.yml
└── README.md
└── setup_script.sql
├── snowflake.yml
後のセクションでは、これらのファイルを変更し、アプリにリソースを追加します。
サービス・ファイルをアプリ・プロジェクトに追加します。¶
前のセクションでは、アプリケーションに必要なデフォルトのアプリケーションファイルを含むプロジェクトを作成しました。このセクションでは、アプリのコンテナーを作成するために必要なファイルを追加します。
na-spcs-tutorial
フォルダー内にservice
というフォルダーを作成します。このフォルダーには、これから構築してSnowflakeに公開するコンテナベースのサービスのソースコードが含まれています。
チュートリアルに必要なDockerファイルを入手するには、
na_spcs_tutorial.zip
ファイルをローカルのファイルシステムにダウンロードしてください。ZIPファイルの中身を
na-spcs-tutorial/service
フォルダに解凍します。このフォルダーには次のファイルが含まれている必要があります。echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
プロジェクトのディレクトリ構造の確認¶
アプリ用のプロジェクトを作成し、サービスとDockerコンテナー用のファイルを追加したら、プロジェクトは na-spcs-tutorial
フォルダー内に以下のような構造になっているはずです。
├── app
└── manifest.yml
└── README.md
└── setup_script.sql
├── README.md
├── service
└── echo_service.py
├── echo_spec.yaml
├── Dockerfile
└── templates
└── basic_ui.html
├── snowflake.yml
Snowpark Container Servicesサービスのイメージを構築する¶
このセクションでは、Dockerイメージをビルドし、前のセクションで作成したイメージリポジトリにアップロードします。
Dockerイメージをビルドし、イメージリポジトリにアップロードします。¶
Dockerイメージをビルドしてイメージリポジトリにアップロードするには、以下の手順に従ってください。
ターミナルウィンドウから、
na-spcs-tutorial/service
フォルダに移動します。次の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 -c tut-connection) 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 tut-connection
このコマンドは、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 -c tut-connection
このセクションでは、echoサービスを含むDockerイメージを作成し、チュートリアルの前半で作成した tutorial_repository
イメージリポジトリにプッシュしました。
次のセクションでは、このイメージを使用するアプリケーション・パッケージを作成します。
Snowflake Native App を開発する¶
前のセクションでは、 Snowflake CLI を使って、プロジェクトテンプレートに基づいたプロジェクトファイルを作成しました。このテンプレートは、アプリが必要とするファイルのデフォルトバージョンを作成しました。
このセクションでは、アプリのデフォルトファイルを更新します.
- プロジェクト定義ファイル
作成する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 TABLE () LANGUAGE SQL EXECUTE AS OWNER AS $$ BEGIN LET stmt VARCHAR := 'SHOW SERVICE CONTAINERS IN SERVICE core.echo_service; LET res RESULTSET := (EXECUTE IMMEDIATE :stmt); RETURN TABLE(res); END; $$; GRANT USAGE ON PROCEDURE app_public.service_status() TO APPLICATION ROLE app_user;
デフォルトの README¶
アプリの 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 tut-connection
このコマンドは、
na_spcs_tutorial_pkg
というアプリケーションパッケージと、na_spcs_tutorial_app
というアプリケーションオブジェクトがアカウントに作成されたことの確認を表示します。これらの名前は、前のセクションで変更したsnowflake.yml
プロジェクト定義の名前に対応しています。
コンソールへの URL 出力を使用してアプリケーションを表示できます。ただし、最初にコンテナベースのサービスを作成するために必要なすべての権限があることを確認する必要があります。
権限を付与し、アプリをテストする¶
このセクションでは、アプリに必要な権限を付与し、コンテナー内のサービスを呼び出してアプリをテストします。
Snowsight または Snowflake CLI のいずれかを使用して SQL コマンドを実行できます。
権限を付与してアプリをテストするには、Snowflakeワークシートから以下の手順を実行します。
次を実行して、アプリに
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
プロシージャを呼び出します。プロシージャは、このサービスのコンテナーに関する情報を返します。status
列の値がREADY
でない場合、サービスコンテナーのステータスがREADY
になるまで、ステートメントを再度実行します。サービス関数を呼び出してサービスにリクエストを送信し、応答を確認するには、次のコマンドを実行します。
SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
先のセクションで構成したサービスから次のようなメッセージが表示されます:
``Bob said hello``
チュートリアルで作成したアプリとオブジェクトを分解する¶
注意
このチュートリアルの終了後に チュートリアル3: コンテナーでアプリをアップグレードする を実行する予定の場合は、このセクションの手順を実行しないでください。このチュートリアルで作成したコンテナー付きアプリは、アップグレードチュートリアルの前提条件です。
アプリはコンピューティングプールを使用するため、アカウントにクレジットが蓄積され、実行に費用がかかります。アプリケーションがリソースを消費しないようにするには、アプリケーション・オブジェクトと、アプリケーション・オブジェクトが作成したアカウントレベルのオブジェクト(Compute Poolなど)の両方を破棄する必要があります。
Compute Poolが現在実行中であることを確認するには、以下のコマンドを実行してください。
snow object list compute-pool -l "na_spcs_tutorial_app_%"
Compute Poolが実行されている場合は、アプリケーションオブジェクトによって作成された
ACTIVE
Compute Poolの行が表示されます。以下の Snowflake CLI コマンドを実行して、アプリをティアダウンします:
snow app teardown --cascade --force -c tut-connection
このコマンドは、アプリによって作成されたすべてのSnowflakeオブジェクトを削除します。
--force
オプションがない場合、アプリケーション・パッケージにはバージョンが含まれているため、このコマンドはアプリケーション・パッケージを削除しません。Compute Poolが削除されたことを確認するために、もう一度以下のコマンドを実行してください。
snow object list compute-pool -l "na_spcs_tutorial_app_%"
このコマンドは、Compute Poolが正常に削除された場合には
no data
を返します。
注釈
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 内にコンテナをインスタンス化しました。