Snowflake

SnowparkのPackagesとPackages Policy: 依存関係の安全な管理と制御

2026-03-26
更新: 2026-03-27
NicheeLab編集部

SnowparkではPython / Java / ScalaのコードをSnowflake上で直接実行できますが、 外部パッケージの利用には依存関係の宣言セキュリティ制御が必要です。PACKAGES句でconda管理パッケージを指定し、imports句でカスタムファイルをステージから取り込みます。 組織レベルではPackages Policyで許可/ブロックリストを適用し、 不正なパッケージの使用を防止します。

PACKAGES句によるパッケージ指定

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;

imports句でのカスタムファイル取り込み

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 SessionでのPACKAGES指定

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はアカウントレベルまたはデータベースレベルで 使用可能なパッケージを制御するガバナンス機能です。 セキュリティ監査要件やコンプライアンスに対応するため、 許可/ブロックリストでパッケージの利用を制限します。

-- 許可リスト方式(ホワイトリスト)の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'
)

試験で問われるポイント

  • SnowparkのパッケージはAnaconda(conda-forge)チャネルからのみ提供される(PyPI直接は不可)
  • PACKAGES句で宣言、imports句でカスタムファイル(whl/モデル)をステージから取り込む
  • Packages PolicyはALLOWLIST(ホワイトリスト)とBLOCKLIST(ブラックリスト)の2方式
  • ポリシーはアカウントレベルまたはデータベースレベルで適用可能
  • INFORMATION_SCHEMA.PACKAGESで利用可能パッケージを確認

問題で確認

SnowPro

問題 1

セキュリティチームが本番環境でSnowpark Python UDFが使用するパッケージを、事前承認済みのリストに限定したいと考えています。最も適切な方法はどれですか?

  1. 各UDFのPACKAGES句でバージョンを固定し、開発者に使用するパッケージを口頭で周知する
  2. CREATE PACKAGES POLICYでALLOWLISTを定義し、ALTER ACCOUNT SET PACKAGES POLICYでアカウントに適用する
  3. Network Policyを使ってAnacondaリポジトリへのアクセスを制限する
  4. UDFの作成権限を全開発者から剥奪し、管理者のみが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ランタイムに対して統一的にパッケージ制御を実施できます。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.