SnowparkではPython / Java / ScalaのコードをSnowflake上で直接実行できますが、 外部パッケージの利用には依存関係の宣言とセキュリティ制御が必要です。PACKAGES句でconda管理パッケージを指定し、imports句でカスタムファイルをステージから取り込みます。 組織レベルではPackages Policyで許可/ブロックリストを適用し、 不正なパッケージの使用を防止します。
Python UDFやストアドプロシージャの作成時にPACKAGES句で Anacondaチャネルのパッケージを指定します。 バージョンは完全一致またはワイルドカード指定が可能です。
-- Python UDFでパッケージを指定
CREATE OR REPLACE FUNCTION predict_churn(
tenure INT, monthly_charges FLOAT
)
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = (
'snowflake-snowpark-python',
'scikit-learn==1.4.*',
'pandas>=2.0.0,<3.0.0',
'numpy'
)
HANDLER = 'predict'
AS $
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np
def predict(tenure, monthly_charges):
# モデルロジック
return float(np.random.random())
$;
-- ストアドプロシージャでのパッケージ指定
CREATE OR REPLACE PROCEDURE transform_data(table_name STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python', 'pandas')
HANDLER = 'run'
AS $
from snowflake.snowpark import Session
def run(session: Session, table_name: str) -> str:
df = session.table(table_name)
result = df.group_by("category").count()
result.write.save_as_table("aggregated_output", mode="overwrite")
return f"Processed {table_name}"
$;-- 利用可能なPythonパッケージの一覧
SELECT *
FROM INFORMATION_SCHEMA.PACKAGES
WHERE LANGUAGE = 'python'
ORDER BY PACKAGE_NAME;
-- 特定パッケージのバージョン確認
SELECT PACKAGE_NAME, VERSION
FROM INFORMATION_SCHEMA.PACKAGES
WHERE LANGUAGE = 'python'
AND PACKAGE_NAME = 'scikit-learn'
ORDER BY VERSION DESC;
-- Snowpark Python SDKの利用可能バージョン
SELECT VERSION
FROM INFORMATION_SCHEMA.PACKAGES
WHERE LANGUAGE = 'python'
AND PACKAGE_NAME = 'snowflake-snowpark-python'
ORDER BY VERSION DESC;Anacondaに存在しないカスタムパッケージや学習済みモデルファイルは、 ステージにアップロードしてimports句で指定します。
-- カスタムwhlファイルをステージにアップロード
PUT file:///tmp/my_custom_lib-1.0-py3-none-any.whl
@ml_stage/libs/
AUTO_COMPRESS = FALSE;
-- 学習済みモデルファイルをアップロード
PUT file:///tmp/model.joblib
@ml_stage/models/
AUTO_COMPRESS = FALSE;
-- imports句でカスタムファイルを指定するUDF
CREATE OR REPLACE FUNCTION score_customer(features VARIANT)
RETURNS FLOAT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python', 'scikit-learn', 'joblib')
IMPORTS = (
'@ml_stage/libs/my_custom_lib-1.0-py3-none-any.whl',
'@ml_stage/models/model.joblib'
)
HANDLER = 'score'
AS $
import sys
import os
import joblib
IMPORT_DIR = sys._xoptions.get("snowflake_import_directory")
model = joblib.load(os.path.join(IMPORT_DIR, "model.joblib"))
def score(features):
return float(model.predict([list(features.values())])[0])
$;Snowpark Python SDKのSession経由でもパッケージを動的に追加できます。
-- Snowpark Sessionでのパッケージ追加
-- session.add_packages('pandas', 'scikit-learn==1.4.0')
-- session.add_import('@stage/model.joblib')
-- session.add_requirements('requirements.txt')
-- Notebookやストアドプロシージャ内での典型的な使用パターン:
-- from snowflake.snowpark import Session
-- session = Session.builder.configs(connection_params).create()
-- session.add_packages(['pandas==2.1.0', 'numpy'])
-- df = session.table('my_table').to_pandas()
-- # pandas / numpyを使った処理...Packages Policyはアカウントレベルまたはデータベースレベルで 使用可能なパッケージを制御するガバナンス機能です。 セキュリティ監査要件やコンプライアンスに対応するため、 許可/ブロックリストでパッケージの利用を制限します。
-- 許可リスト方式(ホワイトリスト)のPackages Policy
CREATE PACKAGES POLICY prod_python_policy
LANGUAGE PYTHON
ALLOWLIST = (
'snowflake-snowpark-python',
'pandas',
'numpy',
'scikit-learn',
'joblib',
'xgboost'
)
COMMENT = '本番環境で許可されたPythonパッケージのみ使用可';
-- ブロックリスト方式のPackages Policy
CREATE PACKAGES POLICY dev_python_policy
LANGUAGE PYTHON
BLOCKLIST = (
'subprocess32',
'os-sys'
)
COMMENT = '開発環境:セキュリティリスクのあるパッケージのみブロック';
-- アカウントレベルでポリシーを適用
ALTER ACCOUNT SET PACKAGES POLICY prod_python_policy;
-- データベースレベルでポリシーを適用
ALTER DATABASE analytics SET PACKAGES POLICY dev_python_policy;
-- ポリシーの確認
SHOW PACKAGES POLICIES;
-- ポリシーの解除
ALTER ACCOUNT UNSET PACKAGES POLICY;| 環境 | 推奨方式 | 設計の考え方 |
|---|---|---|
| 本番(Production) | ALLOWLIST | 検証済みパッケージのみ許可。新規追加は承認フロー経由 |
| ステージング | ALLOWLIST(やや緩め) | 本番候補のパッケージを試験的に許可 |
| 開発(Development) | BLOCKLIST | 危険なパッケージのみ禁止し、自由度を確保 |
| サンドボックス | ポリシーなし | 実験目的のため制限なし |
PACKAGES句でバージョンを指定しないと、Snowflakeが最新の互換バージョンを自動選択します。 本番UDFでは必ずメジャー・マイナーバージョンを固定し、再現性を確保してください。
-- バージョン固定の推奨パターン
PACKAGES = (
'pandas==2.1.4',
'scikit-learn==1.4.2',
'numpy==1.26.4'
)
-- ワイルドカード(マイナーバージョンまで固定)
PACKAGES = (
'pandas==2.1.*'
)
-- 範囲指定
PACKAGES = (
'pandas>=2.0.0,<3.0.0'
)SnowPro
問題 1
セキュリティチームが本番環境でSnowpark Python UDFが使用するパッケージを、事前承認済みのリストに限定したいと考えています。最も適切な方法はどれですか?
正解: B
Packages PolicyのALLOWLIST方式により、許可されたパッケージのみをUDF/ストアドプロシージャで使用可能に制限できます。口頭周知は強制力がなく、Network PolicyはAnacondaリポジトリの制御用ではありません。UDF作成権限の剥奪は過度に制限的です。
Snowparkで利用可能なPythonパッケージはどのリポジトリから取得されますか?
SnowflakeはAnaconda(conda-forge)チャネルから厳選されたパッケージをホストしています。pip(PyPI)からの直接インストールはサポートされず、Anacondaチャネルに存在しないパッケージを使用したい場合はステージにwhlファイルをアップロードしてimports句で指定する方法を取ります。利用可能なパッケージの一覧はINFORMATION_SCHEMA.PACKAGESビューで確認できます。
Packages Policyの許可リストとブロックリストはどう使い分けますか?
ALLOWLIST(許可リスト)はホワイトリスト方式で、明示的に許可したパッケージのみ使用可能にします。BLOCKLIST(ブロックリスト)はブラックリスト方式で、特定のパッケージのみ禁止し他はすべて許可します。セキュリティ要件が厳しい本番環境ではALLOWLIST方式、開発環境ではBLOCKLISTで既知の問題があるパッケージのみ禁止する使い方が一般的です。
Packages PolicyはUDF以外にもストアドプロシージャに適用されますか?
はい。Packages PolicyはPython UDF、Python UDTF、Pythonストアドプロシージャ、Snowpark DataFrameのSession.add_packages()すべてに適用されます。ポリシーはアカウントレベルまたはデータベースレベルで設定でき、すべてのSnowparkランタイムに対して統一的にパッケージ制御を実施できます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...