👋

Azure App ServiceでPipからuvに移行する際の落とし穴と解決策

に公開

Pythonのパッケージマネージャーとしてuvが注目を集めています。その高速性と信頼性から、既存のpip環境からの移行を検討している方も多いでしょう。しかし、Azure App ServiceとAzure Pipelinesの組み合わせでは、単純な置き換えでは済まない落とし穴があります。

今回、実際の移行作業で遭遇した問題と解決策をまとめました。

移行で遭遇した主な問題

1. 仮想環境名の不一致

問題: uvはデフォルトで.venvを作成しますが、Azure App Serviceはantenvを期待します。

エラー例:

.: cannot open .venv/bin/activate: No such file

2. uvコマンドがデプロイ環境で使用不可

問題: ビルド時にインストールしたuvがデプロイパッケージに含まれません。

エラー例:

uv: command not found

3. POSIX shell互換性の問題

問題: sourceコマンドがAzure App Serviceのstartup scriptで動作しません。

エラー例:

source: not found

4. 仮想環境への依存関係未インストール

問題: uv syncが意図した仮想環境にパッケージをインストールしない。

エラー例:

No module named hypercorn.__main__

解決策

azure-pipelines.yml(ビルドステージ)

- script: |
    curl -LsSf https://astral.sh/uv/install.sh | sh
    source ~/.bashrc
    uv venv antenv
    source antenv/bin/activate
    uv sync --group UAT --active

  workingDirectory: $(projectRoot)
  displayName: "Install dependencies with uv"

ポイント:

  • uv venv antenv: Azure App Service互換の仮想環境名
  • source antenv/bin/activate: 仮想環境のアクティベート
  • --active: アクティブな仮想環境に確実にインストール

azure-pipelines.yml(デプロイステージ)

startUpCommand: >
  apt-get update &&
  apt-get install -y cron &&
  service cron start &&
  (echo "0 15 * * * /home/site/wwwroot/app_log_rotate.sh" | crontab -) &&
  . antenv/bin/activate &&
  python3 -m hypercorn --bind 0.0.0.0:8000 main:app

ポイント:

  • . antenv/bin/activate: POSIX shell互換の書き方
  • --bind 0.0.0.0:8000: ポート明示指定

開発環境での統一

本番環境との差異をなくすため、ローカル開発でもantenvを使用することを推奨:

# 既存の.venvを削除
rm -rf .venv

# antenvで新規作成
uv venv antenv
uv sync --group UAT
source antenv/bin/activate

まとめ

uvの移行では以下の点に注意が必要です:

  1. 仮想環境名: Azure App Serviceに合わせてantenvを使用
  2. 実行環境: uv runではなく従来の仮想環境アクティベート方式
  3. shell互換性: sourceではなく. (ドット+スペース)を使用
  4. 依存関係インストール: --activeフラグで確実にアクティブ環境に

これらのポイントを押さえることで、uvの高速性を享受しながらAzure App Serviceでの安定したデプロイが実現できます。

uvは素晴らしいツールですが、既存インフラとの組み合わせでは細かな調整が必要です。段階的な移行と十分な検証をお勧めします。

Discussion