チュートリアル: Snowflake Native AppフレームワークによるSnowflake Native Appの開発

概要

このチュートリアルでは、 Snowflake Native App Framework を使用して Snowflake Native App を作成し、データと関連するビジネスロジックを他のSnowflakeアカウントと共有する方法について説明します。

チュートリアルでは、 Snowflake CLI と Snowsight の両方のウェブインターフェイスを使用します。

学習内容

このチュートリアルでは、次の方法を学習します。

  • アプリのデータとビジネスロジックを含むアプリケーションパッケージを作成する。

  • アプリケーションパッケージとデータを共有する。

  • アプリケーションパッケージにビジネスロジックを追加する。

  • アプリをローカルでテストする。

  • Snowsight でアプリを表示およびテストする。

  • プライベートリストを作成してアプリを公開する。

  • プライベートリストからアプリをインストールする。

  • Snowflake CLI を使用して、上記のステップの多くを実行する。

プロバイダーとコンシューマーについて

Snowflake Native App Framework のコンテキストでは、プロバイダーとは、コンシューマーである他のSnowflakeユーザーと共有するデータやビジネスロジックを持つロールや組織のことです。コンシューマーは、組織内の別のアカウント、会社内の別の組織、または別の会社のSnowflakeユーザーである場合があります。

このチュートリアルでは、ほとんどのタスクはプロバイダーが通常実行するものですが、アプリケーション開発者やデータベース管理者など、組織内の複数のロールが実行するタスクも含まれます。

このチュートリアルでは、コンシューマーアプリをインストールするために実行するアクションを模倣するタスクも実行します。

前提条件

  • 使用中のマシンに Snowflake CLI がインストールされている必要があります。

  • セッションコンテキストが必要であるため、すべての SQL コマンドを同じ SQL コマンドセッションで実行する必要があります。

    たとえば、これを Snowsight で実行するには、作業をしながらすべてのコードを同じワークシートに貼り付けます。セクションからセクションに進むにつれて、各セクションは前のセクションに基づいて構築されます。

  • ACCOUNTADMIN ロールが使用できなければなりません。

    このチュートリアルでは、 ACCOUNTADMIN ロールを使用してすべてのステップを実行します。ただし、一般的には、実行するアクションに対して特別に定義された権限を持つロールを使用します。たとえば、 UDFs とストアドプロシージャを作成する開発者、ロールと権限を管理するデータベース管理者、Snowflakeコラボレーションを使用して リストを管理する 管理者用に、それぞれ別のロールを設定することができます。

  • プライベートリストからアプリをインストールするには、2つ目のSnowflakeアカウントにアクセスする必要があります。このアカウントを使用して、コンシューマーがアプリをインストールする方法を模倣します。

    注釈

    Snowflake Native App Framework は、異なる組織のアカウントによるアプリの共有をサポートしていますが、このチュートリアルでは、両方のアカウントが同じ組織に属している必要があります。

  • 現在のウェアハウスを設定する必要があります。 USE WAREHOUSE をご参照ください。

アプリケーションファイルを作成する

このセクションでは、セットアップスクリプト、マニフェストファイル、プロジェクト定義ファイルを作成します。これらの最初の2つのファイルは Snowflake Native App Framework で必要となります。

セットアップスクリプト

コンシューマーが自分のアカウントにアプリをインストールするときに自動的に実行される SQL スクリプト。

マニフェストファイル

アプリに関する基本的な構成情報を含む YAML ファイル。

プロジェクト定義ファイル

作成するSnowflakeオブジェクトに関する情報を含む YAML ファイル。

このチュートリアルでは、これらのファイルとその内容について詳しく説明します。また、このチュートリアルの後のセクションでアプリを表示したり公開したりするときに役立つReadmeファイルも作成します。

新しいプロジェクトフォルダーの初期化

Snowflake CLI を使用して、ローカルファイルシステムで新しい Snowflake Native App プロジェクトを初期化します。

そのためには、次のコマンドを実行します。

snow init --template app_basic tutorial
Copy

このコマンドは、現在の作業ディレクトリ内に tutorial という名前のフォルダーを作成し、基本テンプレートに基づいて基本的な Snowflake Native App プロジェクトを作成します。これは、すべてのアプリケーションファイルのルートディレクトリです。

注釈

後のセクションでは、このフォルダーのファイルとサブフォルダーを変更および追加します。

注釈

ネイティブアプリケーションをすぐに起動して実行できるようにするために、他のテンプレートも用意されています。詳細については、 snow init --help をご参照ください。

セットアップスクリプトを作成する

app/setup_script.sql ファイルの内容を次のように変更または置き換えます。

-- Setup script for the Hello Snowflake! app.
Copy

この行をプレースホルダーとして追加するのは、セットアップスクリプトを空にはできないためです。

注釈

このチュートリアルでは、セットアップスクリプトの特定の構造とファイル名を参照します。しかし、独自のアプリを構築する際には、このファイルの名前やディレクトリ構造を自分で決めることができます。

アプリの README ファイルを作成する

Readmeファイルは、アプリケーションが何をするのかについての説明を提供します。 Snowsight でアプリを表示すると、Readmeが表示されます。

app/README.md の内容を次のように変更または置き換えます。

This is the readme file for the Hello Snowflake app.
Copy

マニフェストファイルを作成する

Snowflake Native App Framework では、アプリごとにマニフェストファイルが必要です。マニフェストファイルには、アプリのメタデータと構成パラメーターが含まれており、アプリの実行時の動作に影響を与えます。

注釈

このファイルの名前は manifest.yml にする必要があります。セットアップスクリプトを含む他のファイルへのパスは、このファイルの場所を基準とします。

app/manifest.yml の内容を次のように変更または置き換えます。

manifest_version: 1
artifacts:
   setup_script: setup_script.sql
   readme: README.md
Copy

setup_script プロパティは、マニフェストファイルの場所に対するセットアップスクリプトの場所を指定します。ここで指定するパスとファイル名は、上記で変更したセットアップスクリプトの相対的な場所と同じである必要があります。 readme プロパティも同じルールに従います。

注釈

manifest_versionartifacts、および setup_script プロパティは必須です。 readme パラメーターはオプションです。

プロジェクト定義ファイルを作成する

Snowflake CLI は、プロジェクト定義ファイルを使用して、Snowflakeにデプロイ可能なオブジェクトを記述します。このファイルの名前は snowflake.yml にする必要があります。このファイルは、デプロイされたアプリケーションパッケージとオブジェクトの名前、およびプロジェクトステージにアップロードされるファイルを制御します。

注釈

このファイルには snowflake.yml という名前を付け、ファイルはプロジェクトのルートレベルに存在する必要があります。 manifest.yml やセットアップスクリプトなどの他のファイルへのパスは、このファイルの場所を基準とします。

snowflake.yml の内容を次のように変更または置き換えます。

definition_version: 2
entities:
   hello_snowflake_package:
      type: application package
      stage: stage_content.hello_snowflake_stage
      manifest: app/manifest.yml
      artifacts:
         - src: app/*
           dest: ./
   hello_snowflake_app:
      type: application
      from:
         target: hello_snowflake_package
      debug: false
Copy

このチュートリアルの次のセクションでは、これらの各プロパティの使用方法について説明します。

このセクションで学んだことを復習する

このセクションのステップを実行した後、ディレクトリ構造は次のようになります。

/tutorial
  snowflake.yml
  README.md
  /app/
    manifest.yml
    README.md
    setup_script.sql
Copy

このセクションでは、 Snowflake Native App Framework に必要なセットアップスクリプトとマニフェストファイル、およびSnowflake CLI に必要なプロジェクト定義ファイルを作成する方法を学習しました。

セットアップスクリプトとマニフェストファイルの両方に追加した内容は基本的なものですが、すべてのアプリにこれらのファイルが必要です。

また、 Snowsight でアプリを表示するときや、アプリをリストとして公開するときに表示されるReadmeファイルも追加しました。

プロジェクト定義ファイルについて

このセクションでは、前のセクションで作成した プロジェクト定義 ファイル(snowflake.yml)の内容について学習します。プロバイダーアカウントの追加設定タスクも実行します。

アプリケーションパッケージの中核は、アプリに関する追加情報を含むように拡張されたSnowflakeデータベースです。その意味では、これは次を含むアプリのためのコンテナといえます。

  • 共有データのコンテンツ

  • アプリケーションファイル

アプリケーションパッケージを作成するには、ロールに CREATE APPLICATION PACKAGE 権限が必要です。Snowflake CLI を使用してこの権限を付与するには、次のコマンドを実行します。

snow sql -q 'GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE accountadmin' -c connection_name
Copy

ここで、 connection_name は、Snowflake CLI をインストールしたときに config.toml ファイルで指定した接続の名前です。

注釈

ACCOUNTADMIN ロールにはデフォルトでこの権限がありますが、アプリケーションパッケージを作成するには、使用するロールにこの権限が付与されていることを確認する必要があります。

プロジェクト定義ファイル(snowflake.yml)は、Snowflakeアカウントで作成されるオブジェクトの名前を定義します。

  • アプリケーションパッケージ(hello_snowflake_package

  • アプリケーションパッケージから作成されるアプリケーションオブジェクト(hello_snowflake_app

  • アプリケーションファイルを保持するステージ(stage_content.hello_snowflake_stage

ステージ名はスキーマ修飾名として指定されることに注意してください。このスキーマはアプリケーションパッケージ内に作成されます。この名前付きステージは、 Snowflake Native App Framework に必要なファイルを保存するために使用されます。このステージには、アプリのセットアップスクリプトまたは実行時に利用するファイルをすべて含める必要があります。

プロジェクト定義ファイルには、名前付きステージにコピーされるファイルを指定するルールのリストである artifacts というセクションもあります。

このルールでは、 app/ サブフォルダー内のすべてのものがステージのルートにコピーされることを指定します。これは、次のことを意味します。

  • tutorial/app/manifest.yml@hello_snowflake_package.stage_content.hello_snowflake_stage のルートにアップロードされます。

  • tutorial/app/README.md@hello_snowflake_package.stage_content.hello_snowflake_stage のルートにアップロードされます。

  • tutorial/app/setup_script.sql@hello_snowflake_package.stage_content.hello_snowflake_stage のルートにアップロードされます。

アプリケーションパッケージをまだ作成しておらず、これらのタスクを実行する SQL コマンドも実行していません。後のセクションでは、Snowflake CLI コマンドを実行してこれらのタスクを実行します。

最後に、アプリ定義内で debug: false を設定します。Snowflake CLI を使用してデプロイされたアプリケーションの場合、デバッグモードはデフォルトで有効になっています。

このセクションでは、アプリパッケージがアプリケーションで使用されるリソースのコンテナであることを学びました。また、プロジェクト定義ファイルでフィールドを設定する方法も学習しました。

アプリケーションロジックを追加して最初のアプリをインストールする

このセクションでは、アプリケーションパッケージにコードを追加し、最初のアプリをインストールします。そのために、以下のタスクを実行します。

  • セットアップスクリプトにストアドプロシージャを追加する。

  • ステージ開発モードでアプリをインストールしてテストします。

セットアップスクリプトにストアドプロシージャを追加する

このセクションでは、ストアドプロシージャのコードをローカルファイルシステムのセットアップスクリプトに追加して、アプリにストアドプロシージャを追加します。

セットアップスクリプトにストアドプロシージャを追加するには、

  1. このチュートリアルの前のセクションで作成した setup_script.sql ファイルの最後に次の SQL ステートメントを追加します。

    CREATE APPLICATION ROLE IF NOT EXISTS app_public;
    CREATE SCHEMA IF NOT EXISTS core;
    GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_public;
    
    Copy

    アプリのインストール中にセットアップスクリプトが実行されると、これらのステートメントによって app_public という名前のアプリケーションロールが作成されます。アプリケーションロールはデータベースロールに似ていますが、アプリのコンテキスト内でのみ使用できます。これらは、コンシューマーアカウントで作成されたアプリケーションオブジェクト内のオブジェクトへのアクセスを許可するために使用されます。

    この例では、ストアドプロシージャを格納するスキーマも作成し、そのスキーマの USAGE 権限をアプリケーションロールに付与しています。アプリケーションロールを作成し、スキーマなどのオブジェクトに対する権限をアプリケーションロールに付与することは、セットアップスクリプト内で一般的なパターンです。

  2. ストアドプロシージャのコードを setup_script.sql ファイルの最後に追加します。

    CREATE OR REPLACE PROCEDURE CORE.HELLO()
      RETURNS STRING
      LANGUAGE SQL
      EXECUTE AS OWNER
      AS
      BEGIN
        RETURN 'Hello Snowflake!';
      END;
    
    Copy

    この例では、文字列「Hello Snowflake!」を出力するストアドプロシージャを作成します。

  3. setup_script.sql ファイルの末尾に次のステートメントを追加します。

    GRANT USAGE ON PROCEDURE core.hello() TO APPLICATION ROLE app_public;
    
    Copy

    この例では、ストアドプロシージャに対する USAGE 権限をアプリケーションロールに付与しています。

このセクションでは、セットアップスクリプトにストアドプロシージャを追加しました。また、アプリケーションロールを作成し、このロールに USAGE 権限を付与しました。これにより、アプリのインストール時にセットアップスクリプトによってストアドプロシージャが作成されます。また、ストアドプロシージャを実行する権限もアプリに付与します。

ステージ開発モードでアプリをインストールしてテストする

これで、アプリケーションパッケージ、アプリ、プロジェクト定義ファイルで指定したその他すべてのエンティティを作成する準備が整いました。

これらのタスクを実行するには、次のSnowflake CLI コマンドを実行します。

snow app run -c connection_name
Copy

ここで connection_name は、Snowflake CLI をインストールしたときに config.toml ファイルで指定した接続名です。

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

  1. スキーマ stage_content およびステージ hello_snowflake_stage を使用して、アプリケーションパッケージ名 hello_snowflake_package を作成します。

  2. 必要なファイルをすべて名前付きステージにアップロードします。

  3. このステージのファイルを使用して、アプリ hello_snowflake_app を作成またはアップグレードします。

コマンドが正常に実行されると、 URL が出力され、アプリが Snowsight に表示されます。前のセクションで setup_script.sql に追加した HELLO ストアドプロシージャを実行するには、次のSnowflake CLI コマンドを実行します。

snow sql -q "call hello_snowflake_app.core.hello()" -c connection_name
Copy

このコマンドを実行すると、次のような出力が表示されます。

+------------------+
| HELLO            |
|------------------|
| Hello Snowflake! |
+------------------+
Copy

このセクションで学んだことを復習する

おめでとうございます。 Snowflake Native App Framework を使用して最初の Snowflake Native App を作成、インストール、テストしました。アプリには基本的な機能しかありませんが、アプリを構築するために使用したコンポーネントは、より複雑なアプリでも同じです。

このセクションでは、以下を完了しました。

  • セットアップスクリプトにストアドプロシージャを追加しました。セットアップスクリプトは、コンシューマーアカウントにアプリをインストールする方法を指定します。この後のセクションでは、アプリにデータコンテンツや他のタイプのアプリケーションロジックを追加します。

  • Snowflake CLI を使用して初めてアプリをデプロイしました。

  • ストアドプロシージャを実行して、インストールしたアプリをテストしました。

後のセクションでは、アプリを表示してテストする他の方法について学びます。

アプリにデータコンテンツを追加する

前のセクションでは、アプリケーションロジックをアプリに追加する方法を示すストアドプロシージャを含むアプリを作成しました。

このセクションでは、 HELLO_SNOWFLAKE_PACKAGE アプリケーションパッケージ内にデータベースを作成し、このデータベースをアプリと共有する権限を付与して、データコンテンツをアプリに含めます。

アプリと共有するテーブルを作成する

このセクションでは、データコンテンツをアプリと共有する方法を学びます。具体的には、アプリケーションパッケージにスキーマとテーブルに対する権限を付与することで、プロバイダーアカウントでテーブルを共有します。

  1. テーブルを作成し、アプリケーションパッケージにサンプルデータを挿入するには、フォルダー tutorial/scripts を作成し、そのフォルダー内にファイル shared_content.sql を作成します。このファイルに次のコンテンツを追加します。

    USE APPLICATION PACKAGE <% ctx.entities.hello_snowflake_package.identifier %>;
    
    CREATE SCHEMA IF NOT EXISTS shared_data;
    USE SCHEMA shared_data;
    CREATE TABLE IF NOT EXISTS accounts (ID INT, NAME VARCHAR, VALUE VARCHAR);
    TRUNCATE TABLE accounts;
    INSERT INTO accounts VALUES
      (1, 'Joe', 'Snowflake'),
      (2, 'Nima', 'Snowflake'),
      (3, 'Sally', 'Snowflake'),
      (4, 'Juan', 'Acme');
    -- grant usage on the ``ACCOUNTS`` table
    GRANT USAGE ON SCHEMA shared_data TO SHARE IN APPLICATION PACKAGE <% ctx.entities.hello_snowflake_package.identifier %>;
    GRANT SELECT ON TABLE accounts TO SHARE IN APPLICATION PACKAGE <% ctx.entities.hello_snowflake_package.identifier %>;
    
    Copy

    この例では、 <% ctx.entities.hello_snowflake_package.identifier %> はテンプレートで、Snowflake CLI コマンドを実行すると、 snowflake.yml ファイルから application package の解決済み識別子に置き換えられます。

    アプリケーションパッケージ内のオブジェクトにこれらの権限を付与すると、アプリケーションパッケージから作成されたすべてのオブジェクトで shared_data.accounts テーブルを使用できるようになります。この共有は、スクリプトの末尾にある権限 GRANT TO SHARE コマンドによって実行されます。

    注釈

    アプリ内のコンシューマーと共有するスキーマごとに、各スキーマに対する USAGE 権限をアプリケーションパッケージに付与する必要があります。次に、共有するスキーマ内のオブジェクトに SELECT 権限を付与する必要があります。

  2. アプリケーションパッケージを更新するときにこのスクリプトが実行されるように、プロジェクト定義ファイルにエントリを追加します。最終的なプロジェクト定義ファイルは次のようになります。

    definition_version: 2
    entities:
       hello_snowflake_package:
          type: application package
          stage: stage_content.hello_snowflake_stage
          manifest: app/manifest.yml
          artifacts:
             - src: app/*
               dest: ./
          meta:
             post_deploy:
                - sql_script: scripts/shared_content.sql
       hello_snowflake_app:
          type: application
          from:
             target: hello_snowflake_package
          debug: false
    
    Copy

注釈

スクリプトはローカルマシンから直接実行されるため、プロジェクト定義ファイルの artifacts セクションにパッケージスクリプトを追加する必要はありません(推奨もされません)。

注釈

パッケージスクリプトはアプリをデプロイするたびに実行されるため、べき等性のある方法で記述する必要があります。

データコンテンツにアクセスするためのビューを追加する

このセクションでは、セットアップスクリプトを更新して、アプリをインストールしたコンシューマーが前のセクションで作成した ACCOUNTS テーブルのデータにアクセスできるようにするビューを追加します。

データコンテンツにアクセスするためのビューを追加するには、

  1. ビューのスキーマを作成するには、セットアップスクリプトに以下を追加します。

    CREATE OR ALTER VERSIONED SCHEMA code_schema;
    GRANT USAGE ON SCHEMA code_schema TO APPLICATION ROLE app_public;
    
    Copy

    これらのステートメントは、ビューを含むバージョン管理されたスキーマを作成し、そのスキーマに対する USAGE 権限を付与します。 Snowflake Native App Framework は、バージョン管理されたスキーマを使用して、異なるバージョンのストアドプロシージャや関数を処理します。

  2. ビューを作成するには、セットアップスクリプトに以下を追加します。

    CREATE VIEW IF NOT EXISTS code_schema.accounts_view
      AS SELECT ID, NAME, VALUE
      FROM shared_data.accounts;
    GRANT SELECT ON VIEW code_schema.accounts_view TO APPLICATION ROLE app_public;
    
    Copy

    これらのステートメントは、 code_schema スキーマにビューを作成し、ビューに対する必要な権限をアプリケーションロールに付与します。

    この更新されたセットアップスクリプトは、次回Snowflake CLI を使用してアプリをデプロイするときにもステージにアップロードされます。

更新されたアプリをテストする

このサブセクションでは、アプリをアップグレードし、インストールされたアプリ内のビューを使用してサンプルテーブルをクエリします。

更新されたアプリをテストするには、次を実行します。

  1. コンシューマーアカウントにインストールされているアプリケーションパッケージとアプリケーションオブジェクトを更新するには、次のコマンドを実行します。

    snow app run -c connection_name
    
    Copy

    ここで、 connection_name は、Snowflake CLI をインストールしたときに config.toml ファイルで指定した接続の名前です。

    これにより、編集されたすべてのファイルがステージにアップロードされ、 scripts/shared_content.sql スクリプトが実行され、ステージ上のファイルを使用してアプリがアップグレードされます。

  2. ビューが正しく動作することを確認するには、次のコマンドを実行します。

    snow sql -q "SELECT * FROM hello_snowflake_app.code_schema.accounts_view" -c connection_name
    
    Copy

    このコマンドの出力は次のようになります。

    +----+----------+-----------+
    | ID | NAME     | VALUE     |
    |----+----------+-----------|
    |  1 | Joe      | Snowflake |
    |  2 | Nima     | Snowflake |
    |  3 | Sally    | Snowflake |
    |  4 | Juan     | Acme      |
    +----+----------+-----------+
    
    Copy

このセクションで学んだことを復習する

このセクションでは、以下のタスクを実行して、共有データコンテンツをアプリに含める方法を学びました。

  • アプリケーションパッケージ内に ACCOUNTS テーブルを作成し、そのテーブルにデータを挿入しました。

  • アプリケーションパッケージに ACCOUNTS テーブルに対する参照の使用権を付与しました。

  • アプリケーションパッケージの ACCOUNTS テーブルを参照するスキーマとビューを作成しました。

  • アプリケーションロールにスキーマの使用権を付与しました。

  • アプリケーションロールにビューの選択権を付与しました。

また、セットアップスクリプトを更新して、アプリケーションのインストール時に以下を実行するようにしました。

  • アプリがサンプルデータにアクセスするために使用するスキーマとビューを作成しました。

  • アプリケーションロールにスキーマの使用権を付与しました。

  • アプリケーションロールにビューの選択権を付与しました。

アプリにPythonコードを追加する

このセクションでは、Pythonコードを追加してアプリケーションロジックを強化し、アプリの機能を拡張します。このセクションでは、以下のPythonコードを含めます。

  • セットアップスクリプト内で自己完結した関数であるインラインPython UDF。

  • セットアップスクリプトの外部にあるPythonファイルを参照するPython UDF。

注釈

このセクションではPythonを使用した例を紹介しますが、Javaや JavaScript 同じ手法を適用できます。

インラインPython関数をユーザー定義関数(UDF)として追加する

このセクションでは、Python関数を UDF として追加します。

アプリにPython UDF を含めるには、セットアップファイルに以下のコードを追加します。

CREATE OR REPLACE FUNCTION code_schema.addone(i int)
RETURNS INT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
HANDLER = 'addone_py'
AS
$$
def addone_py(i):
  return i+1
$$;

GRANT USAGE ON FUNCTION code_schema.addone(int) TO APPLICATION ROLE app_public;
Copy

これらのコマンドは、アプリのインストール時に以下のタスクを実行します。

  • code_schema という名前のバージョン管理されたスキーマを作成します。

  • APP_PUBLIC アプリケーションロールにスキーマに対する使用権限を付与します。

  • code_schema スキーマで ADDONE() UDF を作成します。

  • APP_PUBLIC アプリケーションロールに関数に対する使用権限を付与します。

上記のコードの例で作成されたスキーマは、バージョン管理されたスキーマであることに注意してください。ユーザー定義関数とストアドプロシージャは、通常のスキーマではなくバージョン管理されたスキーマで定義する必要があります。これにより、アプリのアップグレードが同時コード実行を妨げることがなくなります。

外部Pythonモジュールを追加する

アプリに外部Pythonモジュールを追加するには、次を実行します。

  1. 以下のPython関数をセットアップスクリプトに追加します。

    CREATE or REPLACE FUNCTION code_schema.multiply(num1 float, num2 float)
      RETURNS float
      LANGUAGE PYTHON
      RUNTIME_VERSION = 3.9
      IMPORTS = ('/python/hello_python.py')
      HANDLER='hello_python.multiply';
    
    GRANT USAGE ON FUNCTION code_schema.multiply(FLOAT, FLOAT) TO APPLICATION ROLE app_public;
    
    Copy

    前の例と同様に、これらのステートメントはスキーマにPython UDF を作成し、アプリケーションロールに関数に対する権限を付与します。ただし、この例には、名前付きステージに作成して含める外部Pythonファイルを参照する IMPORTS 句が含まれています。

  2. tutorial フォルダーに python という名前のサブフォルダーを作成します。

  3. python サブフォルダーに hello_python.py という名前のファイルを作成します。

  4. 次を hello_python.py ファイルに追加します。

    def multiply(num1, num2):
      return num1*num2
    
    Copy

    この外部ファイルで定義された関数は、セットアップスクリプトで定義されたインライン関数と一致します。

  5. プロジェクト定義ファイルの既存の artifacts セクションに次を追加します。

    - python/hello_python.py
    
    Copy

このセクションでは、アプリにPython UDF を追加しました。この UDF は、アプリケーションパッケージから参照できる外部Pythonモジュールを参照します。

更新されたアプリをインストールしてテストする

アプリをインストールしてテストするには:

  1. アプリケーションパッケージとアプリを更新するには、次のコマンドを実行します。

    snow app run -c connection_name
    
    Copy

    ここで、 connection_name は、Snowflake CLI をインストールしたときに config.toml ファイルで指定した接続の名前です。

    このコマンドは、編集されたファイルと新しいファイルをステージにアップロードし、ステージ上のファイルを使用してアプリをアップグレードします。

  2. Pythonストアドプロシージャをテストするには、以下のコマンドを実行します。

    snow sql -q "SELECT hello_snowflake_app.code_schema.addone(1)" -c connection_name
    
    Copy
  3. 参照されたPython関数をテストするには、以下のコマンドを実行します。

    snow sql -q "SELECT hello_snowflake_app.code_schema.multiply(1,2)" -c connection_name
    
    Copy

このセクションで学んだことを復習する

このセクションでは、アプリに以下の新機能を追加しました。

  • インライン UDF として定義されたPython関数。

  • 外部コードを参照する UDF として定義されたPython関数。

また、アプリの更新バージョンをインストールして、各関数を実行し、これらの各例をテストしました。

アプリにStreamlitアプリを追加する

このセクションでは、Streamlitユーザーインターフェイスを追加して、 Snowflake Native App を完了します。Streamlitは、データサイエンスと機械学習アプリケーションを開発するためのオープンソースのPythonフレームワークです。アプリにStreamlitアプリを含めると、ユーザーとのインタラクションやデータ可視化を追加できます。

Streamlitアプリファイルを作成する

Streamlitアプリを作成するには、次を実行します。

  1. tutorial フォルダーに、 streamlit という名前のサブフォルダーを作成します。

  2. streamlit フォルダーに、 hello_snowflake.py という名前のファイルを作成します。

  3. このファイルに以下のコードを追加します。

    # Import python packages
    import streamlit as st
    from snowflake.snowpark import Session
    
    # Write directly to the app
    st.title("Hello Snowflake - Streamlit Edition")
    st.write(
       """The following data is from the accounts table in the application package.
          However, the Streamlit app queries this data from a view called
          code_schema.accounts_view.
       """
    )
    
    # Get the current credentials
    session = Session.builder.getOrCreate()
    
    #  Create an example data frame
    data_frame = session.sql("SELECT * FROM code_schema.accounts_view")
    
    # Execute the query and convert it into a Pandas data frame
    queried_data = data_frame.to_pandas()
    
    # Display the Pandas data frame as a Streamlit data frame.
    st.dataframe(queried_data, use_container_width=True)
    
    Copy
  4. プロジェクト定義ファイルの既存の artifacts セクションに次を追加します。

    - streamlit/hello_snowflake.py
    
    Copy

セットアップスクリプトにStreamlitオブジェクトを追加する

アプリでStreamlitオブジェクトを作成するには、次を実行します。

  1. setup_script.sql ファイルの末尾に、Streamlitオブジェクトを作成するための以下のステートメントを追加します。

    CREATE STREAMLIT IF NOT EXISTS code_schema.hello_snowflake_streamlit
      FROM '/streamlit'
      MAIN_FILE = '/hello_snowflake.py'
    ;
    
    Copy

    このステートメントはコアスキーマに STREAMLIT オブジェクトを作成します。

  2. APP_PUBLIC ロールがStreamlitオブジェクトにアクセスできるように、 setup_script.sql ファイルの末尾に以下のステートメントを追加します。

    GRANT USAGE ON STREAMLIT code_schema.hello_snowflake_streamlit TO APPLICATION ROLE app_public;
    
    Copy

更新されたアプリをインストールする

  1. アプリケーションパッケージとアプリを更新するには、次のコマンドを実行します。

    snow app run -c connection_name
    
    Copy

    ここで、 connection_name は、Snowflake CLI をインストールしたときに config.toml ファイルで指定した接続の名前です。

    このコマンドは、編集されたファイルと新しいファイルをステージにアップロードし、ステージ上のファイルを使用してアプリをアップグレードします。次に、このコマンドが出力する URL に移動して、新しいStreamlitの動作を確認できます。移動したら、アプリケーションの名前の横に表示される HELLO_SNOWFLAKE_STREAMLIT というタブをクリックします。

このセクションで学んだことを復習する

このセクションでは、以下を実行してStreamlitアプリを Snowflake Native App に追加しました。

  • Streamlitライブラリを使用してユーザーインターフェイスをレンダリングするPythonファイルを作成しました。

  • 共有データを表示するStreamlitアプリを Snowflake Native App に作成しました。

アプリにバージョンを追加する

前のセクションでは、「ステージ開発」モードを使用して変更をプッシュしてきました。ステージ開発モードを使用すると、新しいバージョンやパッチを作成しなくても、アプリ開発を迅速に反復できます。ただし、アプリケーションパッケージをリストし、他のSnowflakeユーザーと共有するには、アプリのバージョンを作成する必要があります。

このセクションでは、このチュートリアルで追加したすべての機能を含むバージョンをアプリに追加します。

  1. HELLO_SNOWFLAKE_PACKAGE アプリケーションパッケージにバージョンを追加するには、以下のコマンドを実行します。

    snow app version create v1_0 -c connection_name
    
    Copy

    前のセクションで名前付きステージにアップロードしたアプリケーションファイルに基づくバージョンを追加するために、このコマンドでアプリケーションパッケージを変更しました。

    注釈

    VERSION 用に指定される値はラベルであり、数値や文字列ではありません。

    注釈

    追加した新バージョンのパッチ番号は、 0 で自動的に作成されます。あるバージョンのパッチを追加すると、自動的にパッチ数が増えます。しかし、新バージョン、たとえば V1_1 を作成すると、そのバージョンのパッチ番号は 0 にリセットされます。

  2. バージョンがアプリケーションパッケージに追加されたことを確認するには、以下のコマンドを実行します。

    snow app version list -c connection_name
    
    Copy

    このコマンドは、次の出力に示すように、バージョンに関する追加情報を表示します。

    +---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------+
    | version | patch | label | comment | created_on                    | dropped_on | log_level | trace_level | state | review_status |
    |---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------|
    | V1_0    |     0 | NULL  | NULL    | 2024-05-09 10:33:39.768 -0700 | NULL       | OFF       | OFF         | READY | NOT_REVIEWED  |
    +---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------+
    
    Copy
  3. バージョンに基づいてアプリをインストールするには、以下のコマンドを実行します。

    snow app run --version V1_0 -c connection_name
    
    Copy

    既存のアプリは名前付きステージのファイルを使用して作成されたため、バージョンを使用してアプリをアップグレードするには、既存のアプリを削除し、このバージョンで再作成する必要があります。プロンプトに応じて「はい」と答えます。

このセクションでは、アプリケーションパッケージを変更してアプリのバージョンを含め、バージョン管理された開発モードを使用してアプリケーションオブジェクトを再作成しました。

Snowsightでアプリを表示する

このセクションでは、アプリを Snowsight で表示します。前のセクションでは、 SQL ステートメントを使用して、アプリをテストしたり、情報を検索したりしました。ただし、 Snowsight でアプリに関する情報を表示することもできます。展開されたStreamlitアプリを表示することもできます。

Snowsight でアプリを表示するには、次を実行します。

  1. Snowsight にサインインします。

  2. 次の操作を実行して、 ACCOUNTADMIN ロールに切り替えます。

    1. ナビゲーションメニューでユーザー名を選択し、アカウントメニューを開きます。

    2. アクティブなロールを選択します。例: PUBLIC

      ロールセレクターが表示されます。

    3. ACCOUNTADMIN ロールを選択します。

  3. Data Products » Apps を選択します。

  4. HELLO_SNOWFLAKE_APP を選択します。

    Read Me タブには、前のセクションで app/README.md ファイルに追加したコンテンツが表示されます。

  5. Streamlitアプリを表示するには、 HELLO_SNOWFLAKE_STREAMLIT を選択します。

    HELLO_SNOWFLAKE_DATA データベースのコンテンツは、Streamlitデータフレームに表示されます。

  6. ワークシートでアプリを開くには、 Projects » Worksheets を選択します。

  7. インストールされているワークシートのリストから HELLO_SNOWFLAKE_APP を選択します。

  8. 必要に応じて、アプリをインストールしたウェアハウスを選択してください。

SQL コマンドを使用して、Snowflakeワークシートからアプリをテストできます。たとえば、アプリケーションに追加した機能をテストするために、前のセクションで実行したコマンドを再実行することができます。

LIST @hello_snowflake_package.stage_content.hello_snowflake_stage;
CALL core.hello();
SELECT * FROM code_schema.accounts_view;
SELECT code_schema.addone(10);
SELECT code_schema.multiply(2,3);
Copy

注釈

このワークシートに追加した SQL ステートメントは、 Snowsight で別のページに移動すると失われます。

注釈

Snowflake CLI の snow app open コマンドを使用して、アプリのユーザーインターフェイスを直接表示することもできます。このコマンドは、システムで設定されたウェブブラウザーで適切な URL を開きます。

アプリの公開とインストール

このセクションでは、アプリケーションパッケージをデータコンテンツとして使用するプライベートリストを作成して、アプリを公開します。リストを作成した後、別のアカウントにログインしてリストをインストールします。

デフォルトのリリースディレクティブの設定

アプリケーションパッケージのリストを作成する前に、リリースディレクティブを設定する必要があります。リリースディレクティブは、どのバージョンのアプリをコンシューマーが利用できるかを指定します。

このチュートリアルでは、前のセクションで追加したバージョンを使用してデフォルトのリリースディレクティブを設定します。

アプリケーションパッケージのデフォルトのリリースディレクティブを設定するには、以下を実行します。

  1. アプリケーションパッケージに定義されているバージョンとパッチを表示するには、以下のコマンドを実行します。

    snow app version list -c connection_name
    
    Copy

    このコマンドは、アプリケーションパッケージに定義されているバージョンとパッチを表示します。

  2. デフォルトのリリースディレクティブをバージョン v1_0 とパッチ 0 に設定するには、以下のコマンドを実行します。

    snow sql -q "ALTER APPLICATION PACKAGE hello_snowflake_package SET DEFAULT RELEASE DIRECTIVE VERSION = v1_0 PATCH = 0"
    
    Copy

    このコマンドの出力を次の例に示します。

    +-----------------------------------------------------------+
    | status                                                    |
    |-----------------------------------------------------------|
    | Default release directive set to version 'V1_0', patch 0. |
    +-----------------------------------------------------------+
    
    Copy

このセクションでは、アプリケーションパッケージにどのようなバージョンとパッチが存在するかを確認しました。この情報を使用して、アプリケーションパッケージのデフォルトのリリースディレクティブを定義しました。

アプリケーションのリストを作成する

アプリケーションパッケージに対するリリースディレクティブの指定が完了したため、リストを作成し、リストのデータコンテンツとしてアプリケーションパッケージを追加します。これにより、アプリを他のSnowflakeユーザーと共有し、そのユーザーが自身のアカウントにアプリをインストールして使用できるようになります。

アプリのリストを作成するには:

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで Data Products » Provider Studio を選択します。

  3. + Listing を選択します。リスト作成ウィンドウが開きます。

  4. リストトの名前を入力します。

  5. In the Who can discover the listing セクションで Only specified consumers を選択して、リストを特定のアカウントとプライベートで共有します。

  6. + Select をクリックして、リストのアプリケーションパッケージを選択します。

  7. リストの説明を入力します。

  8. Add consumer accounts セクションでは、リストからアプリをインストールするためのコンシューマーエクスペリエンスのテストに使用するアカウントの識別子を追加します。

このセクションでは、共有データコンテンツとしてアプリケーションパッケージを含むプライベートリストを作成しました。

コンシューマーアカウントにアプリをインストールする

このセクションでは、前のセクションで作成したリストに関連するアプリをインストールします。コンシューマーが自身のアカウントにアプリをインストールする方法を模倣して、別のアカウントにリストをインストールします。

リストからアプリをインストールするには、次を実行します。

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで Data Products » Apps を選択します。

  3. Recently shared with you にあるリストのタイルを選択します。

  4. Get を選択します。

  5. アプリの顧客向けの名前を入力します。このチュートリアルでは、「Hello Snowflake App」を使用します。

  6. アプリをインストールするウェアハウスを選択します。

  7. Get を選択します。

  8. Open を選択してリストを表示するか、 Done を選択して終了します。

このセクションでは、アプリを他のSnowflakeユーザーと共有するためのリストを公開し、インストールする方法を学びました。

詳細

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

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