Skip to content

appengine ImportError

問題の説明

ImportError: cannot import name 'appengine' from 'requests.packages.urllib3.contrib' エラーは、Kubeflow Pipelines (KFP) を使用して機械学習パイプラインを実行中に突然発生します。具体的な特徴は次の通りです:

  • パイプラインとスケジューラはこれまで正常に動作していたが、設定変更(例: .yamlファイルの更新)を契機にエラーが発生
  • コンポーネントコード自体は変更していないにも関わらず、実行開始直後にエラーが発生
  • クラウド環境(特にGoogle Cloud Vertex AI)でのKFP使用時に頻発
  • エラーの直接的原因はrequestsurllib3ライブラリ間の依存関係の競合

発生条件

エラーは以下の環境で頻繁に確認されています:

  • kfpバージョン 2.0.0-beta.15 以前
  • Python 3.9以下のベースイメージ使用時
  • requests-toolbelt 0.10.1 などの古い依存パッケージがある環境

根本原因

このエラーは主に以下の互換性問題に起因します:

  1. ライブラリバージョン競合
    requestsが新バージョンのurllib3(2.0.0+)を完全にサポートしていない

  2. 依存関係の連鎖的破綻
    kfpが間接的に依存するパッケージ(requests-toolbeltgqltwineなど)が古いurllib3に依存している

  3. appengineモジュールの移動
    新しいurllib3ではappengineモジュールの場所が変更されたが、古いrequestsが旧位置を参照しようとする

効果的な解決策

方法1: kfpバージョンのアップグレード (推奨)

根本的な解決策としてkfpを互換性が確保されたバージョンに更新します:

bash
# kfp v1 ユーザー向け
pip install kfp==1.8.21 --upgrade

# kfp v2 (Vertex AI) ユーザー向け
pip install kfp==2.0.0b16 --upgrade

バージョン確認方法

現在のバージョンは次のコマンドで確認できます:

bash
pip show kfp

方法2: 依存パッケージの明示的固定

アップグレードが不可能な場合、依存関係を手動で固定します:

docker
# Dockerfile での解決例
FROM python:3.9

# 互換性のあるバージョンを明示指定
RUN pip install urllib3==1.26.15 \
    requests-toolbelt==0.10.1 \
    gql==3.5.0

コンポーネント定義ではpackages_to_installで指定:

python
@component(
    base_image="python:3.9",
    packages_to_install=["appengine-python-standard", "urllib3==1.26.15"]
)
def your_component(...):
    # コンポーネントロジック

方法3: 関連パッケージの一括更新

間接的な依存パッケージが原因の場合の解決策:

bash
# 問題を引き起こす主なパッケージを更新
pip install --upgrade requests-toolbelt==1.0.0 gql==3.5.0 twine

# Poetryユーザーの場合(バージョン1.4.2以上が必要)
poetry self update

方法4: Pythonベースイメージの更新

新しいPythonバージョンで互換性問題を回避:

python
# コンポーネント定義でbase_imageを更新
@component(
    base_image="python:3.11",
    # ...
)

補足対策

パッケージ競合の解消

システムレベルのパッケージ競合が疑われる場合:

bash
# 競合するパッケージを削除
sudo pip3 uninstall urllib3 requests requests-toolbelt

# 依存関係を再構築(Certbot例)
sudo apt update
sudo apt install --reinstall certbot python3-certbot

依存関係の健全性確認

環境の健全性をチェックするコマンド:

bash
# 各パッケージのインストールパス確認
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 予防的対策

  1. 定期的にkfpをアップデート
  2. 主要依存パッケージをrequirements.txtで固定
  3. CI/CDパイプラインでバージョン互換性テストを実装
  4. コンポーネントごとに独立した環境を構築 :::

まとめ

appengine ImportErrorはkfpの特定バージョンと依存ライブラリ間の互換性問題です。恒久的な解決にはkfp==2.0.0b16または1.8.21へのアップグレードが最適です。一時的な回避策としてurllib3==1.26.15の固定やappengine-python-standardの追加インストールも有効ですが、根本解決には適切なバージョン管理と依存関係の明示的な固定が不可欠です。