Streamlit in Snowflakeで実現するデータアプリ開発

現在、データ基盤構築の業務の中でSnowflakeを活用しています。その中でSnowflakeの一つの機能であるStreamlit in Snowflakeの導入を経験しました。今回、Streamlit in SnowflakeをSnowsight上から利用可能にするための方法を[Snowflakeドキュメント](https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit)を参考にまとめます。

# Streamlitとは 
[Streamlit](https://streamlit.io/) は、機械学習やデータサイエンスのためのカスタムウェブアプリを、簡単に作成・共有をすることを可能にするオープンソースのWebアプリケーションフレームワークです。データの可視化や分析結果の共有のようなタスクを行うWebアプリケーションを簡単に作成することができます。また、Pythonでの実装が可能で、迅速なデータアプリの構築と展開を行うことができます。

# Snowflakeとは 
[Snowflake](https://www.snowflake.com/ja/)は、Snowflake社が提供するクラウドベースのSaaS(Software as a Service)型データプラットフォームです。

# Streamlit in Snowflakeとは 
Streamlitを用いたデータアプリケーションをSnowflakeのデータクラウド上で安全に構築、展開、共有するための機能です。具体的には、Snowsight上でアプリケーションコードの実装を行い、処理に応じてSnowflakeで管理しているデータに対してアクセスし、利用することでデータアプリケーションとして機能します。また、作成されたデータアプリケーションについては、ロールベースのアクセス制御に基づく共有が可能です。



# Streamlit in Snowflakeの利用 

### 制限事項とサポートされていない機能
[制限とサポートされていない機能](https://docs.snowflake.com/ja/developer-guide/streamlit/limitations)がある中で、導入時に一部の制約に引っかかりました。
具体的には、Streamlit in Snowflakeでアクセス許可すべき、ドメイン「\*.snowflake.app」を許可する必要があるという制約がある中で、上記ドメインに該当するURLへのアクセス許可がされておらず、部分的なアクセス制限にかかりstreamlitアプリの起動ができないという問題が発生しました。
Streamlit in Snowflakeでアクセス許可すべき、ドメイン「\*.snowflake.app」を許可する設定を行うことで対応しましたが、今後このようなことがないように制限事項とサポートされていない機能については、既存のインフラの設定を理解した上で設計時に注意して確認する必要があると思いました。

### 権限 
Streamlit アプリを表示するには、Snowflake アカウントがあり、サインインしている必要があります。また、格納先データベースとスキーマのUSAGE権限と、格納先スキーマに対するCREATE STREAMLIT権限をアクセスロールに付与して、それを継承した機能ロールをユーザに付与しておくなど、適切なアクセス制御が必要になります。
前述の通り、次の権限が付与されたロールを使用する必要があります。

###### グローバル、データベース、スキーマ権限
| 権限 | オブジェクト型 | 説明 |
|:----------------|------------:|:------------|
| CREATE STREAMLIT| グローバル、データベース、スキーマ| Streamlitアプリの作成と表示ができるようにします。  |
| CREATE STAGE | グローバル、データベース、スキーマ      | ステージの複製など、スキーマで新しいステージを作成できるようにします。       |

###### Streamlitの権限
| 権限 | 説明 |
|:----------------|:------------|
| USAGE | Streamlitアプリの表示と実行を可能にします。 |

### Streamlitアプリの作成方法 
Streamlitアプリは、SQLで作成する方法とSnowsight上から作成する方法の2通りがあります。今回はSnowsight上でのStreamlitアプリ構築環境の実現にフォーカスを当てて対応しました。Snowsight上からのStreamlitアプリ作成時には、アプリタイトル・Streamlitアプリの格納先・使用するウェアハウスの設定が必要です。また、Streamlitアプリの初めての作成時には、Anacondaの規約の承認を求められる場合があります。

#### SQLでの作成 
STREAMLIT オブジェクトは、Streamlit アプリに必要なファイルをカプセル化する Snowflake のデータベース オブジェクトです。他のオブジェクト同様、以下のようにSQLを実行することで、Streamlitアプリが作成できます。

```sql
CREATE [ OR REPLACE ] STREAMLIT [ IF NOT EXISTS ] <name>
  ROOT_LOCATION = '<stage_path_and_root_directory>'
  MAIN_FILE = '<path_to_main_file_in_root_directory>'
  [ QUERY_WAREHOUSE = <warehouse_name> ]
  [ COMMENT = '<string_literal']
```

#### Snowsight上での作成 
Snowsight上からGUIを操作して、アプリ作成を行います。

1. 左のタブのProjects＞Streamlit＞"＋Streamlit App"を押下

2. パラメータ設定を行い、"Create"を押下し、Streamlitアプリを作成
[作成時のデフォルトのパラメータの状態]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323243/4125d97f-a876-0649-0319-dc1a96ef92f1.png)
※App titleにはアカウント名とアプリ作成時の時間の情報がデフォルトで設定されます。
※App warehouseにはユーザが権限をもつウェアハウス名がデフォルトで設定されます。

Createボタン押下後、App warehouseに設定したウェアハウスを使用して、デフォルトの実装をもとにStreamlitアプリが起動します。作業開始時は、Streamlitアプリ作成用のワークシートにデフォルトの処理がPythonで実装されているので、始めはそちらの処理を上書きして、新しい処理を実装する流れでStreamlitアプリ開発を行います。

# Stremalitアプリ導入までの振り返り
ユーザとネットワークポリシーは作成済みの前提で、Stremalit in Snowflakeを導入するための実装を確認します。実装後にアプリ作成ができることを確認するところまでをこちらで振り返ります。

 １. Snowsight上のワークシートから、Stremalitアプリ利用のための環境構築のためのクエリを実行

```sql
--※クエリ実行時の利用ロールは記載の中で考慮しません。

-- ウェアハウスの作成
CREATE WAREHOUSE STREAMLIT_WHS WAREHOUSE_SIZE='XSMALL';

-- Streamlitアプリ格納先のデータベースとスキーマ作成
CREATE DATABASE ANALYST_OBJECT_DB;
CREATE SCHEMA ANALYST_OBJECT_DB.STREAMLIT_SCHEMA;

-- 機能ロールの作成と各種オブジェクトの権限付与
CREATE ROLE USE_STREAMLIT_ROLE;
GRANT USAGE ON DATABASE ANALYST_OBJECT_DB TO ROLE USE_STREAMLIT_ROLE;
GRANT USAGE ON SCHEMA ANALYST_OBJECT_DB.STREAMLIT_SCHEMA TO ROLE USE_STREAMLIT_ROLE;
GRANT CREATE STREAMLIT ON SCHEMA ANALYST_OBJECT_DB.STREAMLIT_SCHEMA TO ROLE;
GRANT CREATE STAGE ON SCHEMA ANALYST_OBJECT_DB.STREAMLIT_SCHEMA TO ROLE ;
GRANT USAGE ON WAREHOUSE STREAMLIT_WHS TO ROLE USE_STREAMLIT_ROLE;

-- ユーザへの機能ロールのアタッチ
GRANT ROLE USE_STREAMLIT_ROLE TO USER <ユーザ名>;

-- ユーザへのデフォルトウェアハウスの設定
ALTER USER <ユーザ名> SET DEFAULT_WAREHOUSE="STREAMLIT_WHS";

-- ※利用したいデータが格納されているデータベース/スキーマへの権限の付与は適宜必要です。
```


上記、実行後に作成したロールへ切り替えて、Stremalitアプリを作成します。

 ２. 作成したロールへの切り替え

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323243/1a2f2633-6c5f-147d-080f-dbcd4df439cc.png)

 ３. Stremalitのアプリ作成

Projects＞Streamlit＞"+ Streamlit App" を押下
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323243/954063a8-00fd-5da7-0f7a-3fca1ef0a351.png)

各種パラメータ情報を設定して、"Create"を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323243/688b2909-7011-80a8-097e-4c8b326432ca.png)

アプリ作成手順完了後、デフォルトアプリが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323243/582c95c3-8224-64cb-be5d-ea895a9ecb43.png)


# 導入後の利用とサポートへの問い合わせでわかったこと
  * Streamlitアプリは無操作から15分後にウェアハウスが自動停止します
  * Streamlitアプリはアプリを作成したロールのみ、Streamlitアプリの編集権限を持ちます
  * StreamlitアプリのUSAGE権限では、Streamlitアプリの編集はできません

# 所感
Snowsight経由での作成では設定値がデフォルトでされている部分もありつつ、サンプルコードの実装もあるというところで、思ったより試しやすいなと感じました。その反面、アプリ使用時の振る舞いをしっかり理解しておかないと、コストが想定よりもかかってしまうので、利用する際は通常のワークシートでの利用よりも注意しなければいけないと思いました。特に、記事記載時点では、無操作時から15分間はウェアハウスが自動停止しない仕様になっているため、不要なコストを発生させないようアプリ操作終了時には起動したウェアハウスを停止することは徹底したいです。
今回は導入までを経験できたので、実際にPythonでアプリを実装する部分についても触れて、Streamlitアプリのユースケースを理解していきたいと思います。