Snowflake NativeAPI tutorial

Snowflake NativeAPI tutorial | Tableau-id Press -タブロイド-

以下のtutorialで、Snowflake NativeAPI を作成してみました。
https://docs.snowflake.com/en/developer-guide/native-apps/tutorials/getting-started-tutorial#introduction

※前提として、作成するユーザーも取り込むユーザーも ACCOUNTADMINの権限が必要です。

 

読みながらやってみたのですが、最初にデータベースの全体像があるとよりわかりやすいかも…と思ったので載せます。

このtutorialでは、以下のものを作成します。

ACCOUNTSテーブル

・上記を参照するVIEW(ACCOUNTS_VIEW)

・HELLO と表示するプログラム

・UDF2種類(ADDONE、MULTIPLY(FLOAT, FLOAT)))

・VIEWを表示するNATIVEAPI

 

では、始めて行きましょう。

1.導入

pythonの仮想環境を作成

conda create -n snowcli python=3.9

仮想環境に入る

conda activate snowcli

SnowCLIをインストール

pip install snowflake-cli-labs

Snowflake CLI接続コマンドを使用して資格情報を追加

snow connection add

間違って入力しても、後から修正できます。

Name for this connection:  好きな名前で。今回は api_test にしました。

Name for this connection:  xxxxxxx.ap-northeast-1.aws みたいに入れる

Snowflake username: XXX ACCOUNTADMINの権限があるユーザー

Snowflake password [optional]: XXX

Role for the connection [optional] ACCOUNTADMIN

Warehouse for the connection [optional]:  XXX

この他は省略で構いません。(ひたすらEnter)

接続情報ファイルが作成されます。

C:\Users\XXX\AppData\Local\snowflake\config.toml

間違った場合はこのファイルを編集しましょう。

 

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


tutorialでは以下のコマンドで作成する、とあります。

snow app init tutorial
が エラーになってしまったので、手動で作成します。(多分 私がマシンを変えたばかりで、gitも入ってないから...と思います)

同じようにエラーになった方は以下の構成で空ファイルを作成してください。(後の工程でgitが入ってないと怒られちゃうので、ここで入れてもいいかも...)

 

tutorialにしたがって、セットアップスクリプト、README、マニフェストファイル、プロジェクト定義ファイル の中身を書きます。

 

3.プロジェクト定義ファイルの理解

ロールに CREATE APPLICATION PACKAGE 権限を付ける

このとき、config.toml  のロールが ACCOUNTADMIN でないと怒られます。

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

 

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

tutorialにしたがって、セットアップ スクリプトにロジックを追加して、ステージ開発モードでアプリをインストールします。

snow app run -c api_test

ストアド プロシージャを実行してみます。

下記のような状態になります。ここまでくると outputディレクトリが作成されます。

 

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

tutorialにしたがって、shared_content.sql にテーブルとVIEW を作成するロジック と権限付与 を記載します。

そして、プロジェクト定義ファイルにも 追加します。(snowflake.yml)

アプリケーション パッケージとアプリケーション オブジェクトを更新します。

snow app run -c api_test

ここで警告がでます。

警告: native_app.package.scripts は非推奨です。native_app.package.post_deploy を使用するように移行してください。

2回目からは、2回目用のスクリプトを用意して、snow app deploy してくださいね、 ということらしい。

https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/native-apps/project-definitions

今回は初回だもん、という気持ちで このまま進めます 笑。

 

VIEWが表示されるか確認しましょう。

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

でたでた♬

 

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

UDF(SELECT 文から呼ぶ関数)を2種類、作成します。直接定義する関数と、pythonファイルを取り込んで定義する関数です。

tutorialにしたがって、セットアップ ファイルに追加します。

また、hello_python.py  、および プロジェクト定義ファイルにも追加します。

何か変更したら、アプリケーション パッケージとアプリケーション オブジェクトを更新します。(警告は無視しちゃいます。正式リリース後はちゃんとデプロイ用を準備しましょう)

snow app run -c api_test

作成したUDFをテストしましょう。

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

こんな感じに表示されるはずです。

 

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

tutorialにしたがって、hello_snowflake.py を編集します。セットアップファイルにも追加します。

何か変更したら、アプリケーション パッケージとアプリケーション オブジェクトを更新します。

 

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

他の Snowflake ユーザーと共有するには、アプリのバージョンを作成する必要があります。

snow app version create v1_0 -c api_test

ここで git を入れていないため、エラーになりました。

git for windows をインストールします。

pathを通します。(環境変数にgit.exeがあるディレクトリを追加)

GIT_PYTHON_REFRESH環境変数を設定します。

set GIT_PYTHON_REFRESH=quiet

さぁ気を取り直して、アプリのバージョンを作成し、バージョンがアプリケーション パッケージに追加されたことを確認します。

snow app version list -c api_test

バージョンが付きました♪(朝っぱらからAPI作ったさ。)

バージョンに基づいてアプリをインストールします。

snow app run --version V1_0 -c api_test

 

9.Snowsightでアプリを表示する

tutorialにしたがって、Snowsight に入り、アプリを起動してみましょう。

 

10.アプリを公開してインストールする

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

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

怒られました。

Couldn’t find connection for default connection default. Specify connection name or configure default connection.

接続情報のデフォルトを設定しないとだめらしい。

snow connection set-default "api_test"

接続情報のデフォルトを設定してからなら、リリース ディレクティブを設定できました♬

tutorialにしたがって、アプリケーションのリストを作成し、コンシューマアカウントにアプリをインストールします。

ここはエラーが出なかったので省略で。。。

 

コンシューマーアカウントで、こんな風に表示されたら成功です♡

NativeAPIって凄いですよね。Snowflakeのアカウントさえあれば、インストール作業がなく、セキュアな環境で共有できるんです♪

(MD持って、飛行機に乗って、インストールしに行ったなぁ。それはそれで楽しかったけど 笑)