appengine ImportError
問題の説明
ImportError: cannot import name 'appengine' from 'requests.packages.urllib3.contrib'
エラーは、Kubeflow Pipelines (KFP) を使用して機械学習パイプラインを実行中に突然発生します。具体的な特徴は次の通りです:
- パイプラインとスケジューラはこれまで正常に動作していたが、設定変更(例: .yamlファイルの更新)を契機にエラーが発生
- コンポーネントコード自体は変更していないにも関わらず、実行開始直後にエラーが発生
- クラウド環境(特にGoogle Cloud Vertex AI)でのKFP使用時に頻発
- エラーの直接的原因は
requests
とurllib3
ライブラリ間の依存関係の競合
発生条件
エラーは以下の環境で頻繁に確認されています:
kfp
バージョン 2.0.0-beta.15 以前- Python 3.9以下のベースイメージ使用時
requests-toolbelt
0.10.1 などの古い依存パッケージがある環境
根本原因
このエラーは主に以下の互換性問題に起因します:
ライブラリバージョン競合
requests
が新バージョンのurllib3
(2.0.0+)を完全にサポートしていない依存関係の連鎖的破綻
kfp
が間接的に依存するパッケージ(requests-toolbelt
、gql
、twine
など)が古いurllib3
に依存しているappengineモジュールの移動
新しいurllib3
ではappengine
モジュールの場所が変更されたが、古いrequests
が旧位置を参照しようとする
効果的な解決策
方法1: kfpバージョンのアップグレード (推奨)
根本的な解決策としてkfp
を互換性が確保されたバージョンに更新します:
# kfp v1 ユーザー向け
pip install kfp==1.8.21 --upgrade
# kfp v2 (Vertex AI) ユーザー向け
pip install kfp==2.0.0b16 --upgrade
バージョン確認方法
現在のバージョンは次のコマンドで確認できます:
pip show kfp
方法2: 依存パッケージの明示的固定
アップグレードが不可能な場合、依存関係を手動で固定します:
# Dockerfile での解決例
FROM python:3.9
# 互換性のあるバージョンを明示指定
RUN pip install urllib3==1.26.15 \
requests-toolbelt==0.10.1 \
gql==3.5.0
コンポーネント定義ではpackages_to_install
で指定:
@component(
base_image="python:3.9",
packages_to_install=["appengine-python-standard", "urllib3==1.26.15"]
)
def your_component(...):
# コンポーネントロジック
方法3: 関連パッケージの一括更新
間接的な依存パッケージが原因の場合の解決策:
# 問題を引き起こす主なパッケージを更新
pip install --upgrade requests-toolbelt==1.0.0 gql==3.5.0 twine
# Poetryユーザーの場合(バージョン1.4.2以上が必要)
poetry self update
方法4: Pythonベースイメージの更新
新しいPythonバージョンで互換性問題を回避:
# コンポーネント定義でbase_imageを更新
@component(
base_image="python:3.11",
# ...
)
補足対策
パッケージ競合の解消
システムレベルのパッケージ競合が疑われる場合:
# 競合するパッケージを削除
sudo pip3 uninstall urllib3 requests requests-toolbelt
# 依存関係を再構築(Certbot例)
sudo apt update
sudo apt install --reinstall certbot python3-certbot
依存関係の健全性確認
環境の健全性をチェックするコマンド:
# 各パッケージのインストールパス確認
python3 -m pip show urllib3
python3 -m pip show requests
# 依存ツリーの表示
pipdeptree --warn silence | grep -E 'urllib3|requests'
根本原因と予防策
appengine
ImportErrorは、主に次の状況で発生します:
セキュリティ更新の副作用
urllib3
の重大アップデート(例: CVE修正)が後方互換性を破壊間接的依存パッケージの影響
kfp
から直接参照されないパッケージ(例:gql
,twine
)が依存関係を壊す
:::important 予防的対策
- 定期的に
kfp
をアップデート - 主要依存パッケージをrequirements.txtで固定
- CI/CDパイプラインでバージョン互換性テストを実装
- コンポーネントごとに独立した環境を構築 :::
まとめ
appengine
ImportErrorはkfp
の特定バージョンと依存ライブラリ間の互換性問題です。恒久的な解決にはkfp==2.0.0b16
または1.8.21
へのアップグレードが最適です。一時的な回避策としてurllib3==1.26.15
の固定やappengine-python-standard
の追加インストールも有効ですが、根本解決には適切なバージョン管理と依存関係の明示的な固定が不可欠です。