Automating Python UDFs and Procedures Deployment in Snowflake via CLI

はじめに
こんにちは!Finatextのソフトウェアエンジニアの和田と申します。Finatextグループ内のナウキャストで、データの開発基盤を作るチームに所属しています。
ナウキャストでは、データ基盤にSnowflakeを採用しています。
今回は2024年の2月にVersion2がリリースされ、Public PreviewとなったSnowflake CLIを使って構築した、Python UDFs・Stored Proceduresの自動デプロイの仕組みを紹介します。
また、Python UDFs・Stored Proceduresに独特の仕様に触れ、それに対応した具体的なリソースの構成についても紹介します。
自動デプロイをする上での既存の課題
現在、SnowflakeでPython UDFやストアドプロシージャを作成する際には、以下のような選択肢があります:
- インラインでSQLにソースコードを埋め込む
- Stage上にソースコードをアップロードし、それをimportする
これらの方法を使う場合、以下のような課題が発生します:
- 管理のための作り込み: ソースコードをGitHubなどのバージョン管理システムで管理するためには、まずStageにファイルをアップロードし、その後に
CREATE FUNCTION
などのSQL文を実行する必要があります。これらを自分たちで作り込むには一定の工数が必要となります。 - 自動化の難しさ: 例えばSnowSQLでこれらの作業をCI/CDツール(例えばGitHub Actions)から自動化しようとすると、Snowflakeへの接続やツールのセットアップに手間がかかります。
Snowflake CLIでの解決方法
ここで登場するのがSnowflake CLIです。このツールを使用することで、上記の課題を簡単に解決できます。具体的には以下のような利点があります:
- 簡単なコマンド:
snow snowpark build
やsnow snowpark deploy
のようなコマンドを使うだけで、StageへのアップロードからCREATE FUNCTION
の実行までを自動化できます。 - 簡単な導入:
pip install
で簡単にインストールできるため、セットアップが非常に簡単です。
Snowflake CLI
Snowflake CLIは開発者向けのオープンソースのツールです。Snowflakeのリソースを手軽に作成・管理することができます。
ドキュメントはこちら↓
実際に利用しているコマンドは以下の4つです。
snow connection test
… Snowflakeとの接続の確認snow snowpark init
… ソースコードを管理するディレクトリの初期化snow snowpark build
… ソースコードをまとめてzip化snow snowpark deploy
… Python UDFs・Stored Proceduresのデプロイ
具体的な実装例
実際にPython UDFs・Stored Proceduresをデプロイするまでの流れは下記です。
- ソースコードを配置するディレクトリの初期化
- GitリポジトリにPush
- Github Actionsで自動デプロイ
1. ソースコードを配置するディレクトリの初期化
snow snowpark init
コマンドで以下のようなディレクトリが作成されます。
example_snowpark/
├ app/
│ ├ __init__.py
│ ├ common.py
│ ├ functions.py
│ └ procedures.py
│
├ requirements.txt
└ snowflake.yml
pyファイルの構成などは異なりますが、ほとんど同じ構成を利用しています。後述の snow snowpark build
などのコマンドも上記の構成を前提として動作するため、あまり変えないほうが良いでしょう。
2. GitリポジトリにPush
ソースコードを配置し snowflake.yml
でPython UDFs・Stored Proceduresの設定をしたら、対象となるリポジトリにPushします。ここでは説明を省略しますが、実際にはここでpytestを利用したCIも設定しています。
3. Github Actionsで自動デプロイ
snow snowpark build
snow snowpark deploy
を利用して、自動でソースコードをデプロイします。
GitHub Actionsで下記のWorkflowを設定しています。
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "${{ inputs.PYTHON_VERSION }}"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install snowflake-cli-labs
snow --version
- name: Check Connection
run: |
chown $USER ${{ inputs.CONFIG_FILE }}
chmod 0600 "${{ inputs.CONFIG_FILE }}"
mkdir ~/.config/snowflake
cp ${{ inputs.CONFIG_FILE }} ~/.config/snowflake/config.toml
snow connection test
- name: Deploy
run: |
bash scripts/snowpark_deploy.sh ${{ inputs.WORKING_DIR }}
- name: Send notification about finished deployment when succeeded
...
#!/bin/bash
set -eu
TARGET_DIR=${1}
cd $TARGET_DIR
# build the source file zip
snow connection test
snow snowpark build
# deploy the functions
echo "Deploying functions to Snowpark..."
snow snowpark deploy --replace
作成にあたって、以下の注意点があります。
snow snowpark build
snow snowpark deploy
はsnowflake.yml
が配置されているディレクトリでしか実行できないsnow connection
で接続先の設定(user_name, databaseなど)をどこから参照するか考える必要がある。- 現状Snowflake CLIではkey pair認証の秘密鍵を設定する際にファイルしか指定できない(直接注入できない)ので、GitHub Actionsから利用するときはBasic認証(user_name, password)の方が利用しやすい。
このうち、接続先の設定については
config.toml
ファイル内に記載- 環境変数から指定
が選べます。パスワードなどは環境変数からの指定が好ましいです。
具体的なリソース構成
下図はプロジェクトのDEV環境のリソース構成と、自動デプロイの流れを示しています。masterブランチでPython UDFs・Stored Proceduresの変更がPushされると、GitHub Actions上で自動デプロイが起動します。

Python UDFs・Stored Proceduresを作成する上での注意点
上図のように、
- ソースコード格納先のStageを配置するコンテナ(Database・Schema)
- Python UDFs・Stored Proceduresの実体が作成されるコンテナ
を分離しています。
これは主に、コンテナのCloneを行った際のUDFs・Stored Proceduresの挙動と関連しています。
SnowflakeのZero Copy Cloningは
- QA用のテスト環境
- CI環境
などを作成したい際に低コストで利用できる便利な選択肢ですが、いくつか考慮しなければならない点があります。
その1つとして、UDFs・Stored ProceduresはClone時の挙動がその作成方法で変わるのは気を付けるべきポイントです。
- Clone対象のコンテナ内部のStageからファイルをimportしているUDFs・Stored ProceduresはCloneしない
- そうでないUDFs・Stored ProceduresはCloneする
という挙動となっており、シンプルにPython UDFs・Stored Proceduresの実体の作成先とソースコードの配置先を同じコンテナにすると、Cloneを利用する際に別途移行の作業が必要となってしまいます。
この点への対応策として上記の分離を行うことで、コンテナがCloneされたときに常にUDFs・Stored ProceduresもCloneされるようにしています。これで気軽にCloneを行って、パイプラインの検証を行えます!
まとめ
以上のようにSnowflake CLIを利用することで、簡単に自動デプロイの仕組みを構築することができます。みなさんぜひ使ってみてください!
仲間を募集中です!
Finatextホールディングスでは一緒に働く仲間を募集中です!様々なエンジニア系のポジションがあるので気軽に覗いてみてください!
また、7月10日にDataOps Nightを開催予定です!お気軽にご参加ください!