Snowflake CLI で Streamlit in Snowflake の GitHub Actions 経由でのデプロイを試してみた
はじめに
Snowflake CLI を使用し、Streamlit in Snowflake の GitHub Actions 経由のデプロイを試してみましたので、その内容を本記事でまとめます。
前提条件
作成する Streamlit アプリは、以下の記事の環境をそのまま使用しています。そのため、ローカルでのアプリ実行などはできる状態です。
この時点でのディレクトリ構成は以下の通りです。
my_sis_app/
├── .keys/ # ローカルのみ(Git管理しない)
├── .streamlit/ # ローカルのみ(Git管理しない)
│ └── secrets.toml
├── output/ # 生成物
│ └── bundle/
├── pyproject.toml
├── snowcli.toml # ローカルのみ(Git管理しない)
├── snowflake.yml
├── streamlit_app.py
└── yasuhara_streamlit_app.egg-info/ # 生成物
GitHub Actions に向けたリポジトリ準備
.gitignore を作成
検証開始時点では特に Git 管理していなかったので、まず.gitignoreを作成しました。
touch .gitignore
.gitignoreの内容は以下の通りです。
# Secrets / keys
.streamlit/secrets.toml
.keys/
# Local venv
.venv/
# Generated by Snowflake CLI / builds
output/
*.egg-info/
# Python cache
__pycache__/
*.pyc
# Snowflake CLI config
snowcli.toml
.keys/や.streamlit/secrets.tomlはローカル実行のための機密情報を含むため、Git では管理しない想定です。また output/ や *.egg-info/ は実行・デプロイ過程で生成されるファイルです。
ワークフロー用の Snowflake CLI 設定(config.toml)を作成
GitHub Actions から Snowflake CLI を実行するために、接続名だけを定義したconfig/config.tomlを作成します(認証情報は GitHub Secrets から環境変数から取得します)。
mkdir -p config
cat > config/config.toml << 'EOF'
default_connection_name = "workflow"
[connections.workflow]
EOF
作成したファイルの内容は以下の通りです。
default_connection_name = "workflow"
[connections.workflow]
Git リポジトリを初期化
リポジトリを初期化します。
git init
git status
ローカルで初回コミットまで済ませます。
git add .gitignore config/ pyproject.toml snowflake.yml streamlit_app.py
git commit -m "Initial commit"
GitHub 側で新規リポジトリを作成し、リモートリポジトリとして設定
GitHub 上で新規リポジトリを作成した後、表示された URL を origin として登録します。
git remote add origin git@github.com:<ユーザー>/<リポジトリ名>.git
main ブランチを push します。
git push -u origin main
Snowflake 側:GitHub Actions 用のサービスユーザーを作成
デプロイは GitHub Actions 経由で行うため、Snowflake 側に サービスユーザーを作成し、キーペア認証を設定します。ロールは前提条件の記事で作成済みのものを使用しています。
USE ROLE USERADMIN;
CREATE OR REPLACE USER yasuhara_git_user
DEFAULT_ROLE = yasuhara_st_creator
DEFAULT_SECONDARY_ROLES = ()
TYPE = SERVICE;
GRANT ROLE yasuhara_st_creator TO USER yasuhara_git_user;
ALTER USER yasuhara_git_user SET RSA_PUBLIC_KEY = 'MII・・・';
GitHub Actions の実行元 IP からのみアクセスを許可したいため、ネットワークポリシーを設定します。
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE NETWORK POLICY yasuhara_github_actions_network_policy
ALLOWED_NETWORK_RULE_LIST = ('SNOWFLAKE.NETWORK_SECURITY.GITHUBACTIONS_GLOBAL');
-- ポリシーをユーザーレベルで適用
ALTER USER yasuhara_git_user SET NETWORK_POLICY = yasuhara_github_actions_network_policy;
GitHub 側:Secrets を追加
GitHub Actions から Snowflake CLI の認証に使用する情報を GitHub Secrets に登録します。今回は以下を登録しました。
SNOWFLAKE_ACCOUNTSNOWFLAKE_USERSNOWFLAKE_PRIVATEKEY

GitHub Actions:ワークフローファイルを追加
リポジトリ直下に .github/workflows を作成し、デプロイ用ワークフローを追加します。
mkdir -p .github/workflows
code .github/workflows/deploy_streamlit_app.yml
ワークフローファイルの内容は以下のようにしました。最低限、Streamlit のデプロイのみを行う構成です。
name: Deploy Streamlit App to Snowflake
on:
push:
branches:
- main
workflow_dispatch:
jobs:
deploy-to-snowflake:
runs-on: ubuntu-latest
env:
SNOWFLAKE_CONNECTIONS_WORKFLOW_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_PRIVATE_KEY_RAW: ${{ secrets.SNOWFLAKE_PRIVATEKEY }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_WAREHOUSE: "X_SMALL_WH"
SNOWFLAKE_CONNECTIONS_WORKFLOW_ROLE: "yasuhara_st_creator"
SNOWFLAKE_CONNECTIONS_WORKFLOW_AUTHENTICATOR: "SNOWFLAKE_JWT"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Snowflake CLI
uses: Snowflake-Labs/snowflake-cli-action@v1.5
with:
cli-version: "latest"
default-config-file-path: 'config/config.toml'
- name: Deploy to Snowflake
run: |
snow streamlit deploy yasuhara_streamlit --replace
ワークフローファイルについては以下が参考になります。
追加・コミットします。
git add .github/workflows/deploy_streamlit_app.yml
git commit -m "Add workflow"
git push
これで main へ push したタイミングで、GitHub Actions 経由のデプロイが実行されます。
アプリを変更
開発ブランチでローカル検証 → PR(プルリクエスト) → デプロイまでの手順を試してみます。
ローカルで動作確認
開発ブランチを作成します。
git checkout -b feature/add-note
アプリを修正します。ここでは簡単にタイトル直下に1行メッセージを追加しました。
import streamlit as st
import pendulum
st.title("コンテナランタイムのローカルからの開発テスト")
+st.write("開発ブランチでのローカル検証用に1行追加しました。")
st.subheader("PyPI package test: pendulum")
st.write("Now (Tokyo):", pendulum.now("Asia/Tokyo").to_iso8601_string())
# Snowflake接続確認(ローカルでは .streamlit/secrets.toml の [connections.snowflake] を使う)
st.subheader("Snowflake session check")
conn = st.connection("snowflake")
session = conn.session()
row = session.sql("""
select
current_account() as acct,
current_user() as usr,
current_role() as role,
current_timestamp() as ts
""").collect()[0]
st.json(row.as_dict())
ローカルで動作を確認します。
streamlit run streamlit_app.py
下図赤枠のメッセージが追加されています。

変更をコミットして push します。
git add streamlit_app.py
git commit -m "Add a note to the app"
git push -u origin feature/add-note
プルリクエストを作成し main へマージします。

GitHub Actions でデプロイ確認
マージ後、ワークフローが実行されます。

その後、Snowsight で確認すると Streamlit アプリが更新されていることを確認できました。

さいごに
最小構成ではありますが、Snowflake CLI で Streamlit in Snowflake の GitHub Actions 経由のデプロイを試してみました。
本記事の内容がどなたかの参考になれば幸いです。







