👋
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の移行では以下の点に注意が必要です:
-
仮想環境名: Azure App Serviceに合わせて
antenv
を使用 -
実行環境:
uv run
ではなく従来の仮想環境アクティベート方式 -
shell互換性:
source
ではなく.
(ドット+スペース)を使用 -
依存関係インストール:
--active
フラグで確実にアクティブ環境に
これらのポイントを押さえることで、uvの高速性を享受しながらAzure App Serviceでの安定したデプロイが実現できます。
uvは素晴らしいツールですが、既存インフラとの組み合わせでは細かな調整が必要です。段階的な移行と十分な検証をお勧めします。
Discussion