以下の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持って、飛行機に乗って、インストールしに行ったなぁ。それはそれで楽しかったけど 笑)