❄️

Snowflake CLI を活用した UDF/SPROCの自動デプロイ

に公開

この記事は、Nowcast Advent Calendar 2025 の18日目の記事です。

はじめに

こんにちは。株式会社ナウキャストでデータエンジニアをしている徳山です。現在所属している Data Holder Unit(DHU)では、マスターデータ(法人マスター、住所マスターなど)の整備を担当しています。

本記事では、マスターデータの整備に使用する UDF / SPROC (Stored Procedure) を管理・更新するための自動デプロイ (CD) の仕組みを紹介します。1年半前に Finatext の和田さんが書いた、Automating Python UDFs and Procedures Deployment in Snowflake via CLIを参考にしつつ、マスターデータチームのニーズと新しい CLI の仕様に合わせて内容を調整しました。

CD には Snowflake CLI v3.12.0 を使用しています。

Snowflake CLI を使用する以前のデプロイ方法

Snowflake CLI を使用する以前は Python スクリプトを使い、UDF / SPROC のデプロイを行っていました。関数を作成後に UDFRegistrationStoredProcedureRegistration を呼ぶことによって、Snowflake に UDF / SPROC をデプロイしていました。

この運用には、以下のような課題がありました。

  • どの UDF / SPROC が最新版かわからない: 複数のエンジニアが UDF / SPROC を更新していると、バージョン管理が困難でした。
  • 更新のたびに手動でデプロイする必要があり、ヒューマンエラーが起こりやすい: UDF / SPROC を編集した後、デプロイ作業を忘れてしまうことが度々ありました。

Snowflake CLI を使用した自動デプロイ

Snowflake CLI を導入することで、上記の問題を解決できました。

  • どの UDF / SPROC が最新版かわからない: CD を使い、特定のブランチにマージされたタイミングで自動的に UDF / SPROC をデプロイする仕組みを作成したため、環境は常に最新に保たれます。
  • 更新のたびに手動でデプロイする必要があり、ヒューマンエラーが起こりやすい: 自動でデプロイされるため、手動で操作する必要がなくなりました。

Snowflake CLI

Snowflake CLI は、SQL 操作だけでなく、開発者中心のワークロード向けに設計されたオープンソースのコマンドラインツールです。

マスターデータチームでは UDF / SPROC の機能のみを利用していますが、2025年12月の時点では、Streamlit in Snowflake、Snowflake Native App Framework、Snowpark Container Services、Snowpark などのワークロードの管理も可能です。

具体的な実装

UDF / SPROC をデプロイするまでの流れは以下の通りです。

  1. リポジトリに Snowflake CLI に対応したディレクトリを作成
  2. ブランチに push
  3. GitHub Actions で自動デプロイ

1) リポジトリに Snowflake CLI に対応したディレクトリを作成

Snowflake CLI に含まれている snow init コマンドを使用することで、テンプレートからプロジェクトディレクトリを作成できます。マスターデータチームでは、チームの要件に合わせて以下のディレクトリ構成を作成しました。

.
├── snowflake_project/
│   ├── sproc
│   ├── udf/
│   │   └── string_processing/
│   │       └── function1.py
│   └── config/
│       ├── dev_config.toml
│       └── prod_config.toml
└── snowflake.yml

2) ブランチに push

ディレクトリ内に snowflake.yml と UDF / SPROC のソースコードを配置したら、push します。
マスターデータチームでは Snowpark を使用しているため、Snowpark プロジェクト定義を作成しました。

UDF / SPROC を作成する際には snowflake.snowpark.pypi_shared_repository を使用することを強くお勧めします。pypi_shared_repository を使用することで、PyPI パッケージに接続し、PyPI に登録されているすべてのパッケージを利用可能になります。これにより、パッケージを zip ファイルとして Snowflake stage に手動でアップロードする手間が省けます。

3) GitHub Actions で自動デプロイ

GitHub Actions で以下の Workflow を作成し、CD を実行しています。

GitHub Workflow

jobs:
  deploy:
    timeout-minutes: 10
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
      - name: Install Snowflake CLI
        run: |
          wget -O snowflake-cli.deb https://sfc-repo.snowflakecomputing.com/snowflake-cli/linux_x86_64/3.12.0/snowflake-cli-3.12.0.x86_64.deb
          sudo dpkg -i snowflake-cli.deb
          snow --help
      - name: Append Private Key File
        run: |
          # private_key_fileにprivate keyを追加する処理
      - name: Check Connection
        run: |
          chmod 0600 "${{ inputs.CONFIG_FILE }}"
          mkdir ~/.snowflake
          cp ${{ inputs.CONFIG_FILE }} ~/.snowflake/config.toml
          snow connection test
      - name: Deploy
        run: |
          snow snowpark deploy --replace --project path_to_snowflake_directory/

Github Workflow内で使用されている config.toml

[connections]
[connections.default]
user = user_name
database = database
schema = schema
authenticator = "SNOWFLAKE_JWT"
private_key_file = path_to_private_key

dev_config.tomlにはdev環境用の変数、prod_config.tomlにはprod環境用の変数を置いています。

作成にあたって、以下の注意点があります。

  • snow snowpark deploy --replace を使用することで、デプロイされた UDF / SPROC が常に最新版であることを保証しています。

  • Finatext グループでは、パッケージを使用する際に Commit SHA で固定することが求められています。snowflake-cli-action の中では astral-sh/setup-uv@v6 がバージョンで固定(pin)された Action が使われていたため、今回は snowflake-cli を直接ダウンロードする形を取りました。読者の組織にそのような制限がなければ、snowflake-cli-action を使用する方が設定は容易だと思われます。

まとめ

本記事で紹介した通り、Snowflake CLI を導入することで、デプロイの自動化フローを容易に実装可能です。

Finatext Tech Blog

Discussion