設定された Snowflake Native App アーティファクトを含むローカルフォルダーの準備

設定された成果物を含むローカル・フォルダーを作成する。

snow app bundle コマンドは、プロジェクトにローカルディレクトリを作成し、プロジェクト定義ファイルで指定したファイル構造をそのディレクトリに入れ、デコレーター( @sproc@udaf など)を含む Snowpark Python コードから、Snowflake Native App セットアップスクリプトに CREATE FUNCTION または CREATE PROCEDURE の宣言を生成します。詳細については、 snowflake.snowpark.functions.udaf など、選択した関数デコレーターに対応する Snowpark Python ドキュメントをご参照ください。

snow app deploy と:codenowrap:snow app run コマンドは、すでにこの機能を使用しています。しかし、明示的な:codenowrap:snow app bundle コマンドを自由に使えるようになったので、ステージにアップロードされる前にこのディレクトリを探索し、アーティファクトが期待通りに作成されたかを確認することができます。

設定された成果物を含むローカル・フォルダを作成するには、以下のようにします。

  1. 次のようなSnowflake snowflake.yml プロジェクト定義ファイルを作成または検証します。

    definition_version: 2
    entities:
      codegen_nativeapp_pkg:
        type: application package
        manifest: root_files/_manifest.yml
        artifacts:
          - src: root_files/README.md
            dest: README.md
          - src: root_files/_manifest.yml
            dest: manifest.yml
          - src: root_files/setup_scripts/*
            dest: setup_scripts/
          - src: python/user_gen/echo.py
            dest: user_gen/echo.py
          - src: python/cli_gen/*
            dest: cli_gen/
            processors:
              - snowpark
      codegen_nativeapp_pkg:
        type: application
        from:
          target: codegen_nativeapp_pkg
    
    Copy
  2. プロジェクト・ディレクトリから snow app bundle コマンドを実行し、設定した成果物を含む仮 output/deploy ディレクトリを作成します。

    snow app bundle
    
    Copy
  3. 出力またはデプロイディレクトリの内容が、snowflake.yml.ファイルで指定したルールと一致していることを確認します。PythonファイルでSnowparkアノテーション処理を呼び出した場合、ディレクトリ内の修正されたセットアップスクリプトで生成されたコードを見ることができます。

詳細については、 snow app bundle コマンドをご参照ください。

Snowparkアノテーション処理を使用して SQL コードを生成します。

限定的な SQL の経歴を持つ Snowflake Native App 開発者であれば、時間の経過とともに非常に大きく複雑になる可能性がある セットアップスクリプト を書いたり保守したりするのは面倒だと感じるかもしれません。セットアップスクリプトには、カスタマーがデータで使用できるすべてのアプリケーションロジックが含まれているため、Snowflake Native Appの開発には必須です。セットアップスクリプトのコアコンポーネントの1つは、関数やストアドプロシージャにSnowpark Python拡張関数を使用できることです。Python、Java、またはその他のSnowparkがサポートする言語でSnowparkコードを記述することに加えて、セットアップスクリプトで SQL 、これらの関数やプロシージャの対応する部分を記述する必要があります。

例えば、Snowpark Pythonを使って、次のように基本的な関数とストアドプロシージャを作成することができます。

# Example python file "echo.py" that a developer writes

def echo_fn(data):
    return 'echo_fn: ' + data

def echo_proc(session, data):
    return 'echo_proc: ' + data
Copy

そのファイルをステージにアップロードし、セットアップスクリプト SQL 、次のようなコードで参照する必要があります。

-- Sample setup_script.sql SQL file for a Snowflake Native App

CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_proc'
  IMPORTS=('/echo.py');

    GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
      TO APPLICATION ROLE app_instance_role;

-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');

GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
  TO APPLICATION ROLE app_instance_role;
Copy

SQL コード自動生成

注釈

SQL コードの自動生成を利用するには、Snowpark Python バージョン 1.15.0以上を使用する必要があります。

この余分な作業を軽減するために、 Snowflake CLI はセットアップスクリプトに必要な SQL を自動生成することができます。Snowpark Python は拡張関数デコレーター (@udf@sproc@udtf@udaf) と呼ばれる機能をサポートしており、 snowflake.snowpark.functions.udf 関数デコレーターを使用するなど、Python コードに注釈を付けることができます。 Snowflake CLI はこれらのデコレーターを使用して、セットアップスクリプトに必要な SQL コードを自動的に作成し、検証することができます。

例えば、先の例の関数には @udf デコレーターを使うことができます。

# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
  return 'echo_fn: ' + str
Copy

@udf デコレーターを使用すると、 Snowflake CLI snow app bundle (および:codenowrap:snow app bundle コマンドを内部的に呼び出す他のコマンド)に、Snowpark Python デコレーターを処理し、対応する SQL コマンドを生成し、セットアップスクリプトに自動的に含めるように指示します。したがって、セットアップ・スクリプトのために記述する必要のある SQL コードの量を最小限に抑えることができます。

-- Sample setup_script.sql SQL file for a Snowflake Native App

-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;

CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;

-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.9
  PACKAGES=('snowflake-snowpark-python')
  HANDLER='echo.echo_fn'
  IMPORTS=('/echo.py');

  GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
    TO APPLICATION ROLE app_instance_role;
Copy

Snowpark Python の使用を開始します。

Snowflake CLI の Snowpark デコレーターは、通常の Snowpark Python デコレーターと同じように動作しますが、 Snowflake Native App 用の Python コードファイルを書く際には、以下の違いに注意する必要があります。

  • これらのファイルで:codenowrap:Session オブジェクトを使用することはできません。 Snowflake CLI は、Snowflake に接続しないサンドボックス環境でこれらの Python ファイルを実行するからです。その結果、Snowparkの:codenowrap:Session を参照するとエラーになります。

  • @udf@sproc@udaf@udtf Snowpark Python デコレーターのみを使用できます。

  • これらのデコレーターを通常の関数として使用して、コードをSnowflakeオブジェクトとして登録することはできません。サポートされているデコレーターで明示的にアノテーションされたコードのみが認識されます。したがって、Pythonの関数は名前付き関数でなければなりません。Lambda関数はサポートされていません。

  • Snowflake CLI はセットアップスクリプトでファンクションやプロシージャを作成するために、Snowflakeが推奨する ステートメントである CREATE OR REPLACE を常に生成します。

デコレーター・プロパティの詳細

次の表は Python デコレーターのプロパティの一覧で、 Snowflake CLI がそれらをどのように使うかを説明しています。

Python デコレーターのプロパティ

プロパティ

詳細

name

オプション

SQL ステートメントを生成するために Snowflake CLI が使用する関数またはストアドプロシージャの名前。

このプロパティを省略すると、 Snowflake CLI は、 SQL ステートメントを生成するために Python 関数名を再利用します。

input_types

必須

この関数またはストアドプロシージャの各入力パラメーターの型。

この情報は、このデコレーター・パラメーターで指定するか、コードで直接型アノテーションを指定する必要があります。この情報がどちらの場所にもない場合、 Snowflake CLI はこの関数またはストアドプロシージャに対して SQL ステートメントを生成しません。

return_type

必須

この関数またはストアドプロシージャの戻り値の型。

この情報は、このデコレーター・パラメーターで指定するか、コードで直接型アノテーションを指定する必要があります。この情報がどちらの場所にもない場合、 Snowflake CLI はこの関数またはストアドプロシージャに対して SQL ステートメントを生成しません。

パッケージ

オプション

パッケージのリスト。snowflake-snowpark-python をバージョン番号の有無にかかわらず指定できます。このパッケージのバージョン番号を指定した場合、 Snowflake CLI は SQL 生成の一部としてそのバージョンを使用しないが、リスト内の他のパッケージのバージョン番号は保持します。

このプロパティを省略すると、 Snowflake CLI 、自動的に:codenowrap:snowflake-snowpark-python が唯一のパッケージとして追加され、生成される SQL ステートメントに反映されます。

imports

オプション

Snowflake関数またはストアドプロシージャがステージからインポートする必要があるファイルのリスト。文字列または文字列のタプルとして指定できます。タプルを指定した場合、 Snowflake CLI 、0番目のインデックスの文字列のみが使用されます。タプルの使用例については、 外部Pythonファイルを使用する をご参照ください。

インポートを指定しない場合、 Snowflake CLI は自動的に、 SQL を生成する関数またはストアドプロシージャを含む Python ファイルのインポートを追加します。インポートのパスは、プロジェクト定義ファイルに基づいて、デプロイのルートディレクトリにあるPythonファイルの dest パラメータによって決定されます。

execute_as

オプション

ストアド・プロシージャの実行時に使用するペルソナ。値は、 caller および owner などです。指定されていない場合、 Snowflake CLI のデフォルトは owner となります。このプロパティは関数には適用されないことに注意してください。

handler

N/A

関数またはストアドプロシージャのハンドラー。 Snowflake CLI はこのフィールドに自動的に入力します。

置換

未使用

Snowflake CLI はコード生成に true を仮定します。

セッション

必須

None である必要があります。省略された場合、 Snowflake CLI はエラーを返します。

is_permanent

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

stage_location

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

if_not_exists

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

厳しい

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

セキュア

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

不変

未使用

Snowflake CLI はこのフィールドを SQL 作成のために使用しません。

native_app_params

オプション

(Snowflake Native App のみ)

以下の Snowflake Native App パラメータを含む Python 辞書:

  • schema: Snowpark関数またはストアドプロシージャを含むスキーマの名前。このスキーマは、セットアップ・スクリプトですでに定義されている必要があります。Snowflakeでは、セットアップスクリプトファイル内のバージョン管理されたスキーマの名前に値を設定することを推奨しています。 Snowflake CLI は、生成された SQL ステートメント内のSnowpark関数またはプロシージャ名の前にこの値を付けます。 Snowflake CLI は、スキーマを作成してくれるわけではありません。

  • application_roles: 生成されたSnowpark関数またはプロシージャに USAGE 権限を付与するアプリケーション・ロールのリスト。 Snowflake CLI はアプリケーション・ロールを作成しません。 SQL ステートメント( GRANT USAGE ON FUNCTION < schema_name.func_name> TO APPLICATION ROLE <app_role> のような)を作成し、セットアップ・スクリプトに追加するだけです。

技術的にはオプションですが、プロジェクト定義ファイルで native_app_params プロパティを指定しないと、無効なセットアップスクリプトになる可能性があります。

Python ファイルをデスティネーションステージにアップロードするとき、 Snowflake CLI はデコレーターをコメントに変換するので、これらの UDFs やストアドプロシージャは現在のセッションでは作成されません。元のソースファイルは変更されないので、snow app bundle コマンドはべき等であり続けます。デプロイルートディレクトリのPythonファイルだけがコメントを含むように変更されます。snow app bundle コマンドを実行するたびに、デプロイルートは再作成されるからです。次の例は、 Snowflake CLI がデコレーターをコメントする方法を示しています。

# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#:    return_type=IntegerType(),
#:    input_types=[IntegerType(), IntegerType()],
#:    packages=["snowflake-snowpark-python==1.15.0"],
#:    native_app_params={
#:        "schema": "ext_code_schema",
#:        "application_roles": ["app_instance_role"],
#:    },
#: )
def add_sp(session_, x, y):
    return x + y
Copy

また、プロジェクト定義ファイルに processors プロパティを持つ Python ファイルのみが影響を受けます。