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-toolbelt0.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の追加インストールも有効ですが、根本解決には適切なバージョン管理と依存関係の明示的な固定が不可欠です。