チュートリアル: Native Apps Frameworkを使用したアプリケーションの開発

概要

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

このチュートリアルでは Snowsight ウェブインターフェイスを使用しますが、 SnowSQL など、 SQL の実行をサポートする任意のSnowflakeクライアントを使用できます。

学習内容

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

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

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

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

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

  • Snowsight でアプリケーションを表示し、テストする。

  • プライベートリストの作成によりアプリケーションを公開する。

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

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

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

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

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

前提条件

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

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

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

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

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

    注釈

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

  • チュートリアルを実行する前に、現在のウェアハウスを設定する必要があります。セッションに対してウェアハウスを指定し、ウェアハウスを実行してからでないと、セッションでクエリやその他の DML ステートメントを実行できません。詳細については、 USE WAREHOUSE をご参照ください。

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

このセクションでは、セットアップスクリプトとマニフェストファイルを作成します。これらのファイルはどちらもNative Apps Frameworkで必要になります。

セットアップスクリプト

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

マニフェストファイル

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

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

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

セットアップスクリプトを作成するには、次を実行します。

  1. ローカルのファイルシステムに、 tutorial という名前のフォルダーを作成します。これはアプリケーションの外部ファイルのルートディレクトリになります。

    注釈

    このフォルダーには、後のセクションでさらにファイルやサブフォルダーを追加します。

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

  3. このフォルダーに、 setup.sql という名前の新規ファイルを作成します。

    注釈

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

  4. このファイルに以下の SQL ステートメントを追加します。

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

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

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

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

アプリケーションのReadme.mdファイルを作成するには、

  1. tutorial フォルダーに、 readme.md という名前のファイルを作成します。

  2. このファイルに以下のコンテンツを追加します。

    This is the readme file for the Hello Snowflake Application!
    
    Copy

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

Native Apps Frameworkには、アプリケーションごとにマニフェストファイルが必要です。マニフェストファイルには、アプリケーションのメタデータと構成パラメーター含まれます。

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

  1. tutorial フォルダーに、 manifest.yml という名前のファイルを作成します。

    注釈

    このファイルには manifest.yml という名前を付け、ファイルはプロジェクトのルートレベルに存在する必要があります。セットアップスクリプトを含む他のファイルへのパスは、このファイルの場所からの相対パスです。

  2. このファイルに以下のコンテンツを追加します。

    manifest_version: 1
    artifacts:
      setup_script: scripts/setup.sql
      readme: readme.md
    
    Copy

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

    注釈

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

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

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

/tutorial
  manifest.yml
  readme.md
  /scripts/
    setup.sql
Copy

このセクションでは、Native Apps Frameworkで必要なセットアップスクリプトとマニフェストファイルの作成方法を学びました。この2つのファイルに追加したコンテンツは基本的なものですが、すべてのアプリケーションにこれらのファイルが必要です。

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

アプリケーションパッケージを作成する

このセクションでは、アプリケーションに必要なリソースのコンテナーとして機能するアプリケーションパッケージを作成します。次のタスクを実行します。

  • アプリケーションパッケージを作成する。

  • アプリケーションパッケージ内に名前付きステージングを作成する。

アプリケーションパッケージを作成する

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

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

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

アプリケーションパッケージを作成するには、

  1. ロールに CREATE APPLICATION PACKAGE 権限を付与するには、以下のコマンドを実行します。

    GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE accountadmin;
    
    Copy

    注釈

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

  2. アプリケーションパッケージを作成するには、以下のコマンドを実行します。

    CREATE APPLICATION PACKAGE hello_snowflake_package;
    
    Copy

    注釈

    このコマンドを実行すると、現在のコンテキストは HELLO_SNOWFLAKE_PACKAGE に変わります。

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

    SHOW APPLICATION PACKAGES;
    
    Copy

    出力の name 列に HELLO_SNOWFLAKE_PACKAGE と表示されます。このコマンドの追加情報については、 SHOW APPLICATION PACKAGES をご参照ください。

このセクションでは、アプリケーションパッケージがアプリケーションで使用されるリソースのコンテナーであることを学びました。また、アプリケーションパッケージの作成方法も学びました。

名前付きステージを作成する

このセクションでは、Native Apps Frameworkで必要なファイルを格納するための名前付きステージを作成します。アプリケーションに含める外部コードファイルを格納するために、名前付きステージも必要です。これらのファイルを名前付きステージにアップロードすると、アプリケーションを作成するときに利用できるようになります。

名前付き内部ステージを作成するには、次を実行します。

  1. 前のセクションで作成したアプリケーションパッケージにコンテキストを設定するには、以下のコマンドを実行します。

    USE APPLICATION PACKAGE hello_snowflake_package;
    
    Copy
  2. 名前付きステージに必要なスキーマを作成するには、以下のコマンドを実行します。

    CREATE SCHEMA stage_content;
    
    Copy
  3. 名前付きステージを作成するには、以下のコマンドを実行します。

    CREATE OR REPLACE STAGE hello_snowflake_package.stage_content.hello_snowflake_stage
      FILE_FORMAT = (TYPE = 'csv' FIELD_DELIMITER = '|' SKIP_HEADER = 1);
    
    Copy

    このコマンドは、前のステップで作成したデータベースとスキーマに名前付きステージを作成します。

    注釈

    このコマンドの一部として FILE_FORMAT = (TYPE = 'CSV' FIELD_DELIMITER = '|' SKIP_HEADER = 1); を含める必要があります。これらはオプションではありません。

これで、アプリケーションパッケージの中に、アプリケーションのビルドに使用するファイルをアップロードする名前付きステージができました。

注釈

このチュートリアルでは、アプリケーションパッケージ内の名前付きステージを使用しますが、これは必須ではありません。アプリケーションパッケージ外部のデータベースとスキーマに存在する名前付きステージを使用することもできます。

名前付きステージにアプリケーションファイルをアップロードする

前のセクションでは、アプリケーションのコンテナーとして機能するアプリケーションパッケージを作成しました。また、アプリケーションパッケージ内に、必要なアプリケーションファイルを含む名前付きステージを作成しました。

このセクションでは、これらのファイルを名前付きステージにアップロードします。

アプリケーションファイルをアップロードするには、以下のうちの1つを実行します。

  • Snowsightを使用したファイルのステージング で説明されているように、 Snowsight を使用してアプリケーションファイルをアップロードします。

  • 以下のコマンドの実行により、 SnowSQL を使用してアプリケーションファイルをアップロードします。

    PUT file:///<path_to_your_root_folder>/tutorial/manifest.yml @hello_snowflake_package.stage_content.hello_snowflake_stage overwrite=true auto_compress=false;
    PUT file:///<path_to_your_root_folder>/tutorial/scripts/setup.sql @hello_snowflake_package.stage_content.hello_snowflake_stage/scripts overwrite=true auto_compress=false;
    PUT file:///<path_to_your_root_folder>/tutorial/readme.md @hello_snowflake_package.stage_content.hello_snowflake_stage overwrite=true auto_compress=false;
    
    Copy

    注釈

    上記の例のパスを変更して、プロジェクトのルートフォルダーへのパスを反映させます。

ワークシートで以下のコマンドを実行し、ファイルのアップロードが成功したことを確認します。

LIST @hello_snowflake_package.stage_content.hello_snowflake_stage;
Copy

このコマンドを実行すると、以下の出力に示すように各ファイルがリストされます。

+----------------------------------------+------+----------------------------------+-------------------------------+
| name                                   | size | md5                              | last_modified                 |
|----------------------------------------+------+----------------------------------+-------------------------------|
| hello_snowflake_stage/manifest.yml      |   80 | 9acab2ba718eebfa5f98f4e95c822db6 | Mon, 29 May 2023 22:51:04 GMT |
| hello_snowflake_stage/readme.md         |   64 | 1bc95f95109dc60a09b478dd95c31808 | Mon, 29 May 2023 22:51:05 GMT |
| hello_snowflake_stage/scripts/setup.sql |   64 | 7807ee1f2f27312799fc83c66ba775cf | Mon, 29 May 2023 22:51:04 GMT |
+----------------------------------------+------+----------------------------------+-------------------------------+
Copy

このセクションでは、アプリケーションファイルを名前付きステージにアップロードしました。これらのファイルは、アプリケーションの開発を続ける際に、アプリケーションパッケージで利用できるようになります。後のセクションで、アプリケーションに機能を追加する際、これらのファイルの改訂したファイルや新規ファイルをアップロードするために、このセクションに戻ります。

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

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

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

  • アプリケーションにバージョンを追加する。

  • アプリケーションをインストールしてテストする。

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

前のセクションでは、アプリケーションパッケージを作成しました。しかし、アプリケーションパッケージにはまだデータコンテンツやアプリケーションファイルは含まれていません。

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

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

  1. 前のセクションで作成した setup.sql ファイルの最後に、以下の SQL ステートメントを追加します。

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

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

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

  2. ストアドプロシージャのコードを setup.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.sql ファイルの最後に以下のステートメントを追加します。

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

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

  4. 改訂したセットアップスクリプトを名前付きステージにアップロードします。

    前のセクション(名前付きステージにアプリケーションファイルをアップロードする)を参照して、改訂したセットアップスクリプトをアップロードします。

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

アプリケーションをインストールする

前のセクションでは、ストアドプロシージャを含めるようにセットアップスクリプトを変更しました。

このセクションでは、アプリケーションをインストールし、 Snowsight を使用してストアドプロシージャを実行します。

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

  1. アプリケーションを作成するには、以下のコマンドを実行します。

    CREATE APPLICATION HELLO_SNOWFLAKE_APP
      FROM APPLICATION PACKAGE HELLO_SNOWFLAKE_PACKAGE
      USING '@hello_snowflake_package.stage_content.hello_snowflake_stage';
    
    Copy
  2. アプリケーションが正常に作成されたことを確認するには、以下のコマンドを実行します。

    SHOW APPLICATIONS;
    
    Copy

    出力の name 列で HELLO_SNOWFLAKE_APP が表示されます。

  3. 前のセクションで setup.sql に追加した HELLO ストアドプロシージャを実行するには、以下のコマンドを実行します。

    CALL core.hello();
    
    Copy

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

    +------------------+
    | HELLO            |
    |------------------|
    | HELLO SNOWFLAKE! |
    +------------------+
    
    Copy

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

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

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

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

  • ストアドプロシージャを実行してアプリケーションをインストールし、テストしました。後のセクションでは、アプリケーションを表示してテストする他の方法について学びます。

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

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

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

アプリケーションと共有するデータベースを作成する

このセクションでは、データコンテンツをアプリケーションと共有する方法を学びます。具体的には、アプリケーションパッケージのテーブルを共有します。

テーブルを作成し、アプリケーションパッケージにサンプルデータを挿入するには、

  1. アプリケーションパッケージにコンテキストを設定するには、以下のコマンドを実行します。

    USE APPLICATION PACKAGE hello_snowflake_package;
    
    Copy
  2. テーブルを作成し、共有データコンテンツを追加するには、以下のコマンドを実行します。

    CREATE SCHEMA IF NOT EXISTS shared_data;
    CREATE TABLE IF NOT EXISTS accounts (ID INT, NAME VARCHAR, VALUE VARCHAR);
    INSERT INTO accounts VALUES
      (1, 'Nihar', 'Snowflake'),
      (2, 'Frank', 'Snowflake'),
      (3, 'Benoit', 'Snowflake'),
      (4, 'Steven', 'Acme');
    
    Copy
  3. データコンテンツがテーブルに正しく挿入されたことを確認するには、以下のコマンドを実行します。

    SELECT * FROM accounts;
    
    Copy

    このコマンドの出力には、 IDNAME、および VALUE という3つの列が表示されます。以下の出力例のように、各行のデータも表示されます。

    +----+----------+-----------+
    | ID | NAME     | VALUE     |
    |----+----------+-----------|
    |  1 | Nihar    | Snowflake |
    |  2 | Frank    | Snowflake |
    |  3 | Benoit   | Snowflake |
    |  4 | Steven   | Acme      |
    +----+----------+-----------+
    
    Copy
  4. ACCOUNTS テーブルの使用権を付与するには、以下のコマンドを実行します。

    GRANT USAGE ON SCHEMA shared_data TO SHARE IN APPLICATION PACKAGE hello_snowflake_package;
    GRANT SELECT ON TABLE accounts TO SHARE IN APPLICATION PACKAGE hello_snowflake_package;
    
    Copy

    アプリケーションパッケージ内のオブジェクトに対するこれらの権限を付与すると、アプリケーションパッケージからインストールされたすべてのアプリケーションで accounts テーブルを利用できるようになります。

    注釈

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

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

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

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

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

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

    これらのステートメントは、ビューを含むバージョン管理されたスキーマを作成し、そのスキーマに対する USAGE 権限を付与します。Native Apps 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 スキーマにビューを作成し、ビューに対する必要な権限をアプリケーションロールに付与します。

  3. 改訂したセットアップスクリプトを名前付きステージにアップロードします。

    前のセクション 名前付きステージにアプリケーションファイルをアップロードする を参照して、このセクションで更新したファイルをアップロードします。

更新されたアプリケーションをテストする

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

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

  1. 既存のアプリケーションを削除するには、以下のコマンドを実行します。

    DROP APPLICATION hello_snowflake_app;
    
    Copy
  2. アプリケーションの新バージョンを作成するには、以下のコマンドを実行します。

    CREATE APPLICATION hello_snowflake_app
      FROM APPLICATION PACKAGE hello_snowflake_package
      USING '@hello_snowflake_package.stage_content.hello_snowflake_stage';
    
    Copy
  3. ビューが正常に機能することを確認するには、以下のコマンドを実行します。

    SELECT * FROM code_schema.accounts_view;
    
    Copy

    このコマンドの出力は、サンプルデータのセットアップ時に実行した SELECT コマンドの出力と同じです。

    +----+----------+-----------+
    | ID | NAME     | VALUE     |
    |----+----------+-----------|
    |  1 | Nihar    | Snowflake |
    |  2 | Frank    | Snowflake |
    |  3 | Benoit   | Snowflake |
    |  4 | Steven   | Acme      |
    +----+----------+-----------+
    
    Copy

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

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

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

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

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

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

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

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

  • アプリケーションが例のデータにアクセスするために使用するスキーマとビューを作成する。

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

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

HELLO_SNOWFLAKE_DATA データベースをセットアップするために実行したコマンドは、セットアップスクリプトと類似していることに注意してください。

アプリケーションに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.8'
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.8
      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 を作成し、アプリケーションロールに関数に対する権限を付与します。しかし、この例には IMPORTS 句があり、作成する外部Pythonファイルを参照します。

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

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

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

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

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

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

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

  1. 新規ファイルと改訂したファイルを名前付きステージにアップロードします。

    名前付きステージにアプリケーションファイルをアップロードする のセクションを参照して外部Pythonファイルをアップロードしてから、ここに戻ってチュートリアルを続けます。

    ファイルのアップロードに SnowSQL を使用している場合は、以下のコマンドを実行します。

    PUT file:///<path_to_your_root_folder>/tutorial/scripts/setup.sql @hello_snowflake_package.stage_content.hello_snowflake_stage/scripts overwrite=true auto_compress=false;
    PUT file:///<path_to_your_root_folder>/tutorial/python/hello_python.py @hello_snowflake_package.stage_content.hello_snowflake_stage/python overwrite=true auto_compress=false;
    
    Copy
  2. 既存のアプリケーションを削除するには、以下のコマンドを実行します。

    DROP APPLICATION hello_snowflake_app;
    
    Copy
  3. アプリケーションの新バージョンを作成するには、以下のコマンドを実行します。

    CREATE APPLICATION hello_snowflake_app
      FROM APPLICATION PACKAGE hello_snowflake_package
      USING '@hello_snowflake_package.stage_content.hello_snowflake_stage';
    
    Copy
  4. Pythonストアドプロシージャをテストするには、以下のコマンドを実行します。

    SELECT code_schema.addone(1);
    
    Copy
  5. 参照されたPython関数をテストするには、以下のコマンドを実行します。

    SELECT code_schema.multiply(1,2);
    
    Copy

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

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

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

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

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

アプリケーションにStreamlitアプリを追加する

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

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

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

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

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

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

    # Import python packages
    import streamlit as st
    from snowflake.snowpark.context import get_active_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 = get_active_session()
    
    #  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

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

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

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

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

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

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

    GRANT USAGE ON STREAMLIT code_schema.hello_snowflake_streamlit TO APPLICATION ROLE app_public;
    
    Copy
  3. 新規および更新されたアプリケーションファイルを名前付きステージにアップロードします。

    前のセクション 名前付きステージにアプリケーションファイルをアップロードする を参照して、作成したStreamlitファイルをアップロードしてから、ここに戻ってチュートリアルを続けます。

    ファイルのアップロードに SnowSQL を使用している場合は、以下のコマンドを実行します。

    PUT file:///<path_to_your_root_folder>/tutorial/scripts/setup.sql @hello_snowflake_package.stage_content.hello_snowflake_stage/scripts overwrite=true auto_compress=false;
    PUT file:///<path_to_your_root_folder>/tutorial/streamlit/hello_snowflake.py @hello_snowflake_package.stage_content.hello_snowflake_stage/streamlit overwrite=true auto_compress=false;
    
    Copy

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

  1. 改訂したセットアップスクリプトを名前付きステージにアップロードします。

    前のセクション(名前付きステージにアプリケーションファイルをアップロードする)を参照して、改訂したセットアップスクリプトをアップロードします。

  2. 以前のアプリケーションを削除するには、以下のコマンドを実行します。

    DROP APPLICATION hello_snowflake_app;
    
    Copy
  3. アプリケーションの新バージョンを作成するには、以下のコマンドを実行します。

    CREATE APPLICATION hello_snowflake_app
      FROM APPLICATION PACKAGE hello_snowflake_package
      USING '@hello_snowflake_package.stage_content.hello_snowflake_stage';
    
    Copy

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

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

  • Streamlitアプリを作成します。

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

このセクションでは、このチュートリアルで追加したすべての機能を含むバージョンをアプリケーションに追加します。そのために、 ALTER APPLICATION PACKAGE コマンドを使用して、以前に作成したアプリケーションパッケージを更新します。

アプリケーションにバージョンを追加するには、

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

    ALTER APPLICATION PACKAGE hello_snowflake_package
      ADD VERSION v1_0 USING '@hello_snowflake_package.stage_content.hello_snowflake_stage';
    
    Copy

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

    注釈

    VERSION 用に指定される値はラベルであり、数値や文字列ではありません。詳細については、 ALTER APPLICATION PACKAGE をご参照ください

    注釈

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

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

    SHOW VERSIONS IN APPLICATION PACKAGE hello_snowflake_package;
    
    Copy

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

    +---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------+
    | version | patch | label | comment | created_on                    | dropped_on | log_level | trace_level | state | review_status |
    |---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------|
    | V1_0    |     0 | NULL  | NULL    | 2023-05-30 10:33:39.768 -0700 | NULL       | OFF       | OFF         | READY | NOT_REVIEWED  |
    +---------+-------+-------+---------+-------------------------------+------------+-----------+-------------+-------+---------------+
    
    Copy

    詳細については、 SHOW VERSIONS をご参照ください

  3. バージョンに基づいてアプリケーションをインストールするには、以下のコマンドを実行します。

    DROP APPLICATION hello_snowflake_app;
    CREATE APPLICATION hello_snowflake_app
      FROM APPLICATION PACKAGE hello_snowflake_package
      USING VERSION V1_0;
    
    Copy

このセクションでは、アプリケーションのバージョンを含むようにアプリケーションパッケージを変更しました。

Snowsightでアプリケーションを表示する

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

Snowsight でアプリケーションを表示するには、次を実行します。

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

  2. ACCOUNTADMIN ロールに切り替えます

  3. Apps を開き、 Apps タブを選択します。

  4. Installed AppsHELLO_SNOWFLAKE_APP を選択します。

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

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

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

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

  7. HELLO_SNOWFLAKE_APP を選択し、リストからスキーマを選択します。

    スキーマのリストは、チュートリアル中にアプリケーションに追加したスキーマと対応しています。

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 で別のページに移動すると失われます。

アプリケーションを公開してインストールする

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

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

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

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

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

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

    SHOW VERSIONS IN APPLICATION PACKAGE hello_snowflake_package;
    
    Copy

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

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

    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 » 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. 左側のナビゲーションバーで、 Apps を選択します

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

  4. Get を選択します。

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

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

  7. Get を選択します。

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

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

詳細

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

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