シークレットを管理し、Streamlitアプリを設定する¶
Streamlitアプリは、しばしば API キー、パスワード、およびその他の認証情報などの機密情報にアクセスする必要があります。Streamlitアプリでシークレットをどのように管理するかは、使用しているランタイム環境によって異なります。Streamlit in Snowflake は、ウェアハウスとコンテナランタイムの両方でシークレットにアクセスするための安全な組み込みメカニズムを提供します。Streamlitの構成では、各ランタイムにも異なる制限があります。
Streamlitライブラリでは、アプリは .streamlit/ ディレクトリを使用して構成とシークレットを保存します。
.streamlit/config.toml:テーマ、レイアウト、サーバーの動作などのアプリの設定をカスタマイズします。.streamlit/secrets.toml:API キーや認証情報などの機密情報を保管します(ローカル開発の場合)
Streamlit in Snowflake はこれらのファイルをサポートしていますが、ランタイム環境に応じていくつかの制限があります。次のテーブルは、ウェアハウスとコンテナランタイムにおけるこれらのファイルのサポートをまとめたものです。
機能 |
ウェアハウスランタイム |
コンテナランタイム |
|---|---|---|
|
構成オプションの限られたサブセット |
構成オプションのより広範なサブセット |
|
サポート対象外 |
サポートされていますが、非シークレットの環境変数に対してのみ推奨されます。 |
secrets.toml の場合、 Streamlit in Snowflake は、機密情報の管理に推奨される、より安全な組み込みのシークレット管理システムを提供します。次のセクションでは、アプリでSnowflakeのシークレットを使用する方法について説明します。
Snowflakeへの接続の管理¶
Snowflakeへの接続を管理するには、 st.connection("snowflake") を使用します。これにより、ローカルの開発環境とデプロイされたアプリの両方からSnowflakeに接続できます。
ウェアハウスのランタイムでは、Snowparkのアクティブなセッションを取得する get_active_session() 関数を使用できます。
重要
get_active_session() はスレッドセーフではなく、コンテナランタイムでは使用できません。
コンテナランタイムのシークレット¶
コンテナランタイムの|sis|アプリでは、|st.secrets|_を使用してSnowflakeシークレットにアクセスできます。これにより、APIキー、認証情報、その他の構成値などの機密情報を安全に保存して取得できます。ローカル開発でStreamlitが:file:`.streamlit/secrets.toml`に対して行うのと同様に、|sis|でもシークレットが環境変数に設定されます。
注釈
コンテナランタイムは:code:`_snowflake`モジュールにアクセスできません。:code:`_snowflake`のシークレット関数を使用する従来のウェアハウスランタイムアプリを移行する場合は、このセクションで説明しているように、これらの呼び出しを|st.secrets|_に置き換えてください。
コンテナランタイムでシークレットにアクセスする¶
次のPythonファイルを``@my_stage/app_folder/streamlit_app.py``にステージングします。ファイルのステージングについて詳しくは、:doc:`/user-guide/data-load-local-file-system-stage-ui`を参照してください。
Snowflakeアカウントでシークレットを作成します。
詳細については、 CREATE SECRET をご参照ください。
外部アクセス統合(EAI)を作成し、それにシークレットを割り当てます。
SECRETSパラメーターを使用してシークレットを参照するStreamlitアプリを作成します。
注釈
EAIとシークレットの両方をStreamlitオブジェクトに割り当てる必要があります。Streamlitオブジェクトに単独でシークレットを割り当てることはできません。
一般的な文字列のシークレット``my_secret``は、SECRETSパラメーターで文字列``"my_secret_name"``に関連付けられているため、Streamlitアプリのコードでは:code:`st.secrets["my_secret_name"]`を使用して、このシークレットにアクセスできます。
サポートされているシークレットのタイプと環境変数¶
コンテナランタイムは、一般的な文字列と基本認証のシークレットをサポートしています。|sis|は、シークレットを:code:`st.secrets`にマッピングすることに加えて、シークレットを環境変数にもマッピングします。環境変数名では大文字と小文字を区別します。基本認証シークレットの場合は、ユーザー名用(``_USERNAME``サフィックス)とパスワード用(``_PASSWORD``サフィックス)の2つの環境変数が作成されます。
シークレットタイプ |
:code:`st.secrets`でのアクセス |
環境変数でのアクセス |
|---|---|---|
一般的な文字列 |
|
|
基本認証(ユーザー名) |
|
|
基本認証(パスワード) |
|
|
注釈
クラウドプロバイダー、対称キー、OAuthのシークレットタイプは、現在サポートされていません。
一般的な文字列シークレット¶
一般的な文字列シークレットは、:code:`st.secrets`のトップレベルキーとして保存されます。
このシークレットには、ディクショナリ表記または属性表記を使用してアクセスできます。
基本認証シークレット¶
基本認証シークレットは、"username"``属性と"password"``属性を持つdictのようなオブジェクトとして保存されます。
このシークレットには、ディクショナリ表記または属性表記を使用してアクセスできます。
認証付きパッケージリポジトリのシークレット¶
シークレットは環境変数として自動的に公開されます。これにより、JFrog Artifactoryのようなプライベートパッケージリポジトリでの認証が可能になります。
ほとんどの認証付きパッケージリポジトリでは、基本認証シークレットを使用します。このシークレットは、``_USERNAME``および``_PASSWORD``のサフィックスが付いた環境変数に自動的に変換されます。別の命名規則が必要な場合は、一般的な文字列シークレットを使用し、各環境変数の名前を手動で設定します。uvが使用する環境変数について詳しくは、uvドキュメントの`パッケージインデックス<https://docs.astral.sh/uv/concepts/indexes/#providing-credentials-directly>`_をご参照ください。
例:プライベートなJFrog Artifactoryリポジトリへの認証¶
アプリのソースファイルを``@my_stage/app_folder``にステージングします。アプリのソースファイルには、``[[tool.uv.index]]``テーブルでプライベートパッケージインデックスを構成する:file:`pyproject.toml`ファイルを含める必要があります。
pyproject.toml`ファイルでアプリの依存関係を宣言する方法について詳しくは、:doc:/developer-guide/streamlit/app-development/dependency-management`をご参照ください。JFrogの認証情報を使用して基本認証シークレットを作成します。
プライベートリポジトリの外部アクセス統合を作成します。
注釈
DNSエラーを回避するために、必要に応じてリポジトリのクラウドプロバイダーをネットワークルールの値リストに含める必要があります。たとえば、リポジトリがAWSにある場合は、ネットワークルールに次の値リストが必要になる場合があります。
EAIとシークレットをStreamlitアプリにアタッチします。
基本認証シークレット``jfrog_creds``はSECRETSパラメーターで文字列``"UV_INDEX_MY_JFROG_REPO"``に関連付けられているため、ランタイムはuvで必要な``UV_INDEX_MY_JFROG_REPO_USERNAME``および``UV_INDEX_MY_JFROG_REPO_PASSWORD``の環境変数を自動的に注入します。
ローカルの:file:`.streamlit/secrets.toml`ファイルの優先順位¶
Snowflakeが管理するシークレットと、アプリのソースディレクトリにあるローカルの:file:.streamlit/secrets.toml`ファイルを組み合わせることができます。両方が存在する場合、Streamlitライブラリはそれらをマージします。ローカルで定義された:file:.streamlit/secrets.toml`ファイルは、Snowflakeが管理するシークレットよりも優先されます。
.streamlit/secrets.toml`はステージングされたファイルにプレーンテキストとして保存されるため、実際のシークレットを保存することはセキュリティのベストプラクティスではありません。機密性の高い認証情報には、Snowflakeの組み込みシークレット管理を使用してください。ローカルで定義された:file:.streamlit/secrets.toml`ファイルは、機密性のない構成値や環境固有の設定を保存するために使用してください。
Streamlitアプリのシークレットの削除または変更¶
|sis|アプリからすべてのシークレットを削除するには、:doc:`/sql-reference/sql/alter-streamlit`を指定したUNSET SECRETS句を使用します。
これにより、|sis|アプリからすべてのシークレットの関連付けが削除されます。基になるシークレットオブジェクトはSnowflakeアカウントに保持され、後で再び割り当てることができます。EAIの関連付けも削除するには、EXTERNAL_ACCESS_INTEGRATIONSプロパティの設定も解除します。
アタッチされているシークレットを更新または変更するには、SET SECRETSを指定した:doc:`/sql-reference/sql/alter-streamlit`を使用します。
例:認証付き外部APIを使用したコンテナランタイムStreamlitアプリの作成¶
この例では、シークレットのAPIキーを使用して外部APIを呼び出す|sis|アプリの作成方法について説明します。
次のPythonファイルを``@my_stage/weather_app/streamlit_app.py``にステージングします。
``requests``は``streamlit``の依存関係であるため、ランタイムのベースイメージに含まれています。そのため、依存関係ファイルを含めたり、パッケージインデックスを構成したりしなくても、ランタイムによって自動的にインストールされます。
シークレット、ネットワークルール、EAIを作成します。
Streamlitオブジェクトを作成します。
コンテナランタイム内でのCortex Agentの呼び出し¶
コンテナランタイムアプリでCortex Agentを呼び出すには、基になる Snowpark Container Services コンテナからセッショントークンを読み取り、 requests ライブラリを使用します。これは、 _snowflake.send_snow_api_request() に推奨される交換です。
ウェアハウスランタイムのシークレット¶
ウェアハウスのランタイムでは、 _snowflake モジュールを使用して、Streamlitアプリコード内のシークレットに直接アクセスできます。ウェアハウスランタイムは、ストアドプロシージャから _snowflake モジュールへのアクセスを継承し、これによりStreamlitオブジェクトで参照されるシークレットを取得できるようになります。
ウェアハウスランタイムでシークレットを使用するには次のようにします。
Snowflakeでシークレットオブジェクトを作成します。詳細については、 CREATE SECRET をご参照ください。
外部アクセス統合を作成し、それにシークレットを割り当てます。
SECRETS パラメーターを使用して、Streamlitオブジェクト内のシークレットを参照します。
外部アクセス統合とシークレットの両方をStreamlitオブジェクトに割り当てる必要があります。Streamlitオブジェクトに単独でシークレットを割り当てることはできません。
Streamlitアプリのコードで、
_snowflakeモジュールをインポートしてシークレットを取得します。
_snowflake モジュールを使用したシークレットへのアクセスの詳細については、 シークレットアクセスのためのPython API をご参照ください。
Streamlit構成¶
Streamlitアプリには、構成ファイル(.streamlit/config.toml)を含めることができます。このファイルを使うと、テーマ、レイアウト、動作など、アプリの様々な側面をカスタマイズできます。構成ファイルは TOML 形式で書き込まれます。使用可能な構成オプションの詳細については、Streamlitドキュメントの config.toml をご参照ください。
構成オプションのサポートは、ランタイム環境によって異なります。コンテナランタイムは通常、特に静的サービングのために、ウェアハウスランタイムよりも広範な構成オプションのサポートを提供します。次のテーブルは、ウェアハウスとコンテナランタイムでサポートされている構成セクションを示しています。
構成セクション |
ウェアハウスランタイム |
コンテナランタイム |
|---|---|---|
|
サポート対象外 |
限定サポート( |
|
サポート対象外 |
サポート対象外 |
|
サポート対象外 |
限定サポート( |
|
サポート対象外 |
サポート対象 |
|
サポート対象外 |
サポート対象外 |
|
サポート対象外 |
サポート対象外 |
|
サポート対象外 |
サポート対象(非推奨、代わりに環境変数を使用) |
|
サポート対象 |
サポート対象 |
|
サポート対象 |
サポート対象 |
|
サポート対象外 |
サポート対象(ただし、非シークレット環境変数の場合のみ推奨) |
|
サポート対象 |
該当なし |
[snowflake.sleep] セクションを使用してウェアハウスランタイムでスリープタイマーを構成する方法については、 Streamlitアプリのカスタムスリープタイマー を参照してください。
次のディレクトリ構造は、構成ファイルを使用したStreamlitアプリの例です。