チュートリアル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 ロールを作成してセットアップするには、以下の手順に従います。

  1. tutorial_role ロールを作成するには、次のコマンドを実行します。

    CREATE ROLE tutorial_role;
    
    Copy
  2. チュートリアルを実行する Snowflake ユーザーに tutorial_role を付与するには、以下のコマンドを実行します。

    GRANT ROLE tutorial_role TO USER <user_name>;
    
    Copy

    条件:

    user_name

    チュートリアルを行うユーザーの名前を指定します。

  3. コンテナアプリに必要な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;
    
    Copy

このセクションのタスクを実行すると、アカウントに tutorial_role ロールが付与されているユーザーには、 Snowflake Native App with Snowpark Container Services を作成するために必要なすべてのSnowflakeオブジェクトを作成する権限が付与されます。

このチュートリアルの残りの部分では、このロールを使用します。

実際の状況では、コンピューティングプール、ウェアハウス、データベースなどのコンテナを使用してアプリを開発するために、プロバイダーは同様の権限または既存のオブジェクトへのアクセスを必要とする場合があります。

アカウントに必要なオブジェクトを作成する

このセクションでは、コンテナーを使用してアプリに必要なSnowflakeオブジェクトを作成します。

ウェアハウスとイメージリポジトリを作成する

必要なオブジェクトを作成するには、 Snowsight または Snowflake CLI のいずれかを使用して、次を実行します。

  1. Snowsight の現在のコンテキストを tutorial_role ロールを使用するように設定するには、次のコマンドを実行します。

    USE ROLE tutorial_role;
    
    Copy

    Snowflake CLI を使用している場合は、代わりに --role tutorial_role を使用できます。

  2. 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;
    
    Copy

    Snowflake Native App では、 SQL コマンドとストアドプロシージャを実行するためにウェアハウスが必要です。

  3. コンテナを保存するために使用するイメージリポジトリを作成するには、次のコマンドを実行します。

    CREATE DATABASE tutorial_image_database;
    CREATE SCHEMA tutorial_image_schema;
    CREATE IMAGE REPOSITORY tutorial_image_repo;
    
    Copy

このセクションでは、作成したアプリのクエリ実行に使用するウェアハウスと、コンテナーイメージをホストするイメージリポジトリを作成しました。

次のセクションでは、コンテナー用のイメージを作成し、上記で作成したイメージリポジトリにアップロードします。

チュートリアル用にSnowflake CLI 接続を作成します。

このチュートリアルの Snowflake CLI コマンドを実行するには、チュートリアル用に Snowflake CLI 接続をセットアップする必要があります。

接続を作成するには、以下のタスクを実行します。

  1. ターミナルから以下のコマンドを実行します。

    snow connection add
    
    Copy
  2. 接続名は tut-connection と入力してください。

  3. Snowflake CLI 接続の追加情報を入力します。

    使用する具体的な値は、Snowflakeアカウントによって異なります。ただし、ロール、ウェアハウス、データベース、スキーマのプロパティには以下の値を使用する必要があります。

    パラメーター

    必要値

    接続のロール

    tutorial_role

    接続用ウェアハウス

    tutorial_warehouse

    接続用データベース

    tutorial_image_database

    接続スキーマ

    tutorial_image_schema

  4. 以下のコマンドを実行して接続を確認します。

    snow connection test -c tut-connection
    
    Copy

    このコマンドの出力は以下のようになるはずです。

    +----------------------------------------------------------------------------------+
    | 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                                             |
    +----------------------------------------------------------------------------------+
    
    Copy

注意

tut-connection 接続を作成しない場合は、ロール、データベース、ウェアハウスの接続プロパティに正しい値を指定した接続を使用する必要があります。

アプリのプロジェクトを設定

前のセクションでは、チュートリアル用に Snowflake CLI 接続をセットアップしました。

このセクションでは、 Snowflake CLI を使ってアプリのプロジェクトを作成します。プロジェクトには、アプリに必要なすべてのアセットが含まれています。これらのファイルはローカルファイルシステムに保存され、開発ワークフローの一部としてバージョン管理システムで管理することができます。

Snowflake CLI を使用してプロジェクトファイルを作成します。

  1. プロジェクト・ファイルを作成するには、以下のコマンドを実行します。

    snow init --template app_basic na-spcs-tutorial
    
    Copy
  2. プロジェクト識別子の値を入力してください。

    このフォルダにファイルやサブフォルダを追加したり、このコマンドが作成したファイルを編集したりするのは、後のセクションで行います。

このコマンドは、 app_basic プロジェクトテンプレートを使用して、 na-spcs-tutorial という名前のフォルダーを作成します。

na-spcs-tutorial フォルダー内に、このコマンドは以下のファイルとフォルダーを作成します:

├── README.md
├── app
    └── manifest.yml
    └── README.md
    └── setup_script.sql
├── snowflake.yml
Copy

後のセクションでは、これらのファイルを変更し、アプリにリソースを追加します。

サービス・ファイルをアプリ・プロジェクトに追加します。

前のセクションでは、アプリケーションに必要なデフォルトのアプリケーションファイルを含むプロジェクトを作成しました。このセクションでは、アプリのコンテナーを作成するために必要なファイルを追加します。

  1. na-spcs-tutorial フォルダー内に service というフォルダーを作成します。

    このフォルダーには、これから構築してSnowflakeに公開するコンテナベースのサービスのソースコードが含まれています。

  2. チュートリアルに必要なDockerファイルを入手するには、 na_spcs_tutorial.zip ファイルをローカルのファイルシステムにダウンロードしてください。

  3. 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
Copy

Snowpark Container Servicesサービスのイメージを構築する

このセクションでは、Dockerイメージをビルドし、前のセクションで作成したイメージリポジトリにアップロードします。

Dockerイメージをビルドし、イメージリポジトリにアップロードします。

Dockerイメージをビルドしてイメージリポジトリにアップロードするには、以下の手順に従ってください。

  1. ターミナルウィンドウから、 na-spcs-tutorial/service フォルダに移動します。

  2. 次のDocker CLI コマンドを実行します。コマンドには現在の作業ディレクトリ(.)を指定する必要があることに注意してください。

    docker build --rm --platform linux/amd64 -t my_echo_service_image:tutorial .
    
    Copy

    このコマンドは次を実行します。

    • ダウンロードしたzipファイルに含まれるDockerファイルを使用して、Dockerイメージを構築する

    • イメージの名前 my_echo_service_image

    • イメージに tutorial タグを適用します。

  3. 前のセクションで作成したイメージリポジトリの URL を確認するには、次のコマンドを実行します。

    REPO_URL=$(snow spcs image-repository url tutorial_image_database.tutorial_image_schema.tutorial_image_repo -c tut-connection)
    echo $REPO_URL
    
    Copy

    イメージリポジトリの URL が $REPO_URL 変数に取り込まれ、コンソールに表示されます。この値は次のステップで使用します。

  4. イメージ URL を含むイメージのタグを作成するには、次のDocker CLI コマンドを実行します。

    docker tag <image_name> <image_url>/<image_name>
    
    Copy

    このコマンドには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
    
    Copy
  5. Snowflakeレジストリで認証するには、次のSnowflake CLI コマンドを実行します。

    snow spcs image-registry login -c tut-connection
    
    Copy

    このコマンドは、Snowflakeアカウント内のイメージリポジトリを使用するためにDocker CLI に必要な認証情報をロードします。デフォルトを使用しない場合は、接続名を指定する必要があります。

    すべてが成功した場合、 Login Succeeded というメッセージが表示されます。

  6. Dockerイメージをイメージリポジトリにアップロードするには、次の docker push コマンドを実行します。

    docker push $REPO_URL/<image_name>
    
    Copy

    前のステップの <image_name> と同じ値を使用すると、このコマンドは次のようになります。

    docker push $REPO_URL/my_echo_service_image:tutorial
    
    Copy
  7. 次のコマンドを実行して、イメージが正常にアップロードされたことを確認します。

    snow spcs image-repository list-images tutorial_image_database.tutorial_image_schema.tutorial_image_repo -c tut-connection
    
    Copy

このセクションでは、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ファイルも作成します。

デフォルトマニフェストファイルの変更

アプリのマニフェストファイルを変更するには、次の手順に従います:

  1. 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"
    
    Copy

    この例には、次が含まれています。

    • artifacts プロパティは、前のステップで作成したDockerイメージの場所や、 Snowsight に表示されているプロジェクト README など、コンテナー付きアプリで必要なリソースの場所を指定します。

    • privileges プロパティを使用すると、サービスはパブリックリクエストに応答できるだけでなく、独自のコンピューティングプールを作成することもできます。これらのプロパティは、チュートリアルの次のステップでサービスをインスタンス化するために必要です。

デフォルトのセットアップスクリプトを変更

アプリケーションパッケージのデフォルトのセットアップスクリプトを変更するには、以下の手順に従います:

  1. 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;
    
    Copy

デフォルトの README

アプリの README ファイルを変更するには、以下の手順に従ってください:

  1. na-spcs-tutorial/app/README.md を次のように変更します。

    Welcome to your first app with containers!
    
    Copy

この README ファイルは、コンシューマーがアプリをインストールした後に表示されます。

デフォルトのプロジェクト定義ファイルの変更

このセクションでは、 Snowflake CLI で使用されるプロジェクト定義ファイルを変更します。

  1. 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
    
    Copy

このセクションでは、 Snowflake Native App with Snowpark Container Services としてSnowflakeアカウントにデプロイできるローカルファイル構造を定義しました。次のセクションでは、 Snowflake CLI を使用してこのデプロイを実行します。

アプリを作成およびテストする

マニフェストファイル、セットアップスクリプト、 Snowflake Native App with Snowpark Container Services のサービス仕様を定義した後、 Snowflake CLI を使用してアカウントにデプロイすることで、アプリをテストできます。

ステージにファイルをアップロードし、アプリケーションオブジェクトを作成します。

開発モードでアプリを作成するには、以下の手順に従ってください。

  1. ターミナルで、 na-spcs-tutorial フォルダに移動します。

  2. 以下のコマンドを実行して、アカウントにアプリケーション・パッケージとオブジェクトを作成します。

    snow app run -c tut-connection
    
    Copy

    このコマンドは、 na_spcs_tutorial_pkg というアプリケーションパッケージと、 na_spcs_tutorial_app というアプリケーションオブジェクトがアカウントに作成されたことの確認を表示します。これらの名前は、前のセクションで変更した snowflake.yml プロジェクト定義の名前に対応しています。

コンソールへの URL 出力を使用してアプリケーションを表示できます。ただし、最初にコンテナベースのサービスを作成するために必要なすべての権限があることを確認する必要があります。

権限を付与し、アプリをテストする

このセクションでは、アプリに必要な権限を付与し、コンテナー内のサービスを呼び出してアプリをテストします。

Snowsight または Snowflake CLI のいずれかを使用して SQL コマンドを実行できます。

権限を付与してアプリをテストするには、Snowflakeワークシートから以下の手順を実行します。

  1. 次を実行して、アプリに 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;
    
    Copy
  2. setup_script.sql ファイルで定義した app_public.start_app プロシージャを実行します。

    CALL na_spcs_tutorial_app.app_public.start_app();
    
    Copy

    このプロシージャでは、コンピューティングプールを作成し、サービスをインスタンス化して、サービス関数を作成します。

  3. 次を実行して、関数が作成されたことを確認します。

    SHOW FUNCTIONS LIKE '%my_echo_udf%' IN APPLICATION na_spcs_tutorial_app;
    
    Copy

    注釈

    実行中のサービスは Snowflake Native App の一部として実行されるため、コンシューマーは見ることができません。たとえば、 SHOW SERVICES IN APPLICATION na_spcs_tutorial_app; を実行しても何も返されません。

  4. サービスが作成され、正常であることを確認するには、次のコマンドを実行します。

    CALL na_spcs_tutorial_app.app_public.service_status();
    
    Copy

    このステートメントは、セットアップスクリプトで定義した app_public.service_status プロシージャを呼び出します。プロシージャは、このサービスのコンテナーに関する情報を返します。

    status 列の値が READY でない場合、サービスコンテナーのステータスが READY になるまで、ステートメントを再度実行します。

  5. サービス関数を呼び出してサービスにリクエストを送信し、応答を確認するには、次のコマンドを実行します。

    SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
    
    Copy

    先のセクションで構成したサービスから次のようなメッセージが表示されます:

    ``Bob said hello``
    
    Copy

チュートリアルで作成したアプリとオブジェクトを分解する

注意

このチュートリアルの終了後に チュートリアル3: コンテナーでアプリをアップグレードする を実行する予定の場合は、このセクションの手順を実行しないでください。このチュートリアルで作成したコンテナー付きアプリは、アップグレードチュートリアルの前提条件です。

アプリはコンピューティングプールを使用するため、アカウントにクレジットが蓄積され、実行に費用がかかります。アプリケーションがリソースを消費しないようにするには、アプリケーション・オブジェクトと、アプリケーション・オブジェクトが作成したアカウントレベルのオブジェクト(Compute Poolなど)の両方を破棄する必要があります。

  1. Compute Poolが現在実行中であることを確認するには、以下のコマンドを実行してください。

    snow object list compute-pool -l "na_spcs_tutorial_app_%"
    
    Copy

    Compute Poolが実行されている場合は、アプリケーションオブジェクトによって作成された ACTIVE Compute Poolの行が表示されます。

  2. 以下の Snowflake CLI コマンドを実行して、アプリをティアダウンします:

    snow app teardown --cascade --force -c tut-connection
    
    Copy

    このコマンドは、アプリによって作成されたすべてのSnowflakeオブジェクトを削除します。 --force オプションがない場合、アプリケーション・パッケージにはバージョンが含まれているため、このコマンドはアプリケーション・パッケージを削除しません。

  3. Compute Poolが削除されたことを確認するために、もう一度以下のコマンドを実行してください。

    snow object list compute-pool -l "na_spcs_tutorial_app_%"
    
    Copy

    このコマンドは、Compute Poolが正常に削除された場合には no data を返します。

注釈

snow app teardown コマンドはアプリケーションパッケージとアプリケーションオブジェクトの両方を削除します。したがって、ステートフルなデータはすべて失われます。

詳細

おめでとうございます。このチュートリアルを終了しただけでなく、 Snowflake Native App with Snowpark Container Services の開発と公開のライフサイクルに取り組みました。

その際、次も学びました。