いきさつ
- Azure Functions(Python)の開発環境にuvの使い勝手、セキュリティ機能を採用したい
-
uvはvenvを内包しているし、代替可能なはず
やること
-
venvからuvへのマイグレーション - パッケージのリスト本体を
pyproject.tomlに移す - Azure Functionsの動作環境で必要となる
requirements.txtは、リポジトリに含めるためにエクスポートを使っておく
やらないこと
- Azure Functionsの新規の開発環境構築
背景
uv audit とマルウェアチェックの登場
2026-06-08にリリースされた新機能で、
uvに、依存性の警告を行う uv audit と、外部アドバイザリを参照してマルウェアチェックを行いながらパッケージインストールや同期を行うためのオプトインフラグ UV_MALWARE_CHECK=1 が導入された。
Geminiによる翻訳:
uv addや、そのほか同期(sync)を発生させるコマンドを実行するたびに、uvはOSV(Open Source Vulnerabilities)に対し、現在ロックされている解決結果(resolution)にマルウェア(MAL)の勧告(advisories)が含まれていないか問い合わせます。もしロックファイル内のパッケージが既知のマルウェア勧告に一致した場合、悪意のあるコードが実行される前に同期処理が強制終了されます。
すでに Azure Functions機能拡張 で構築済みの開発環境がある
VS CodeのAzure Functions機能拡張 を使うと、UI操作で開発ディレクトリが構成される。
その際は venv + pip を前提としており、tasks.json のコマンドなどもpip前提で作成されているため、
uvベースへの切り替えが必要となる。
UVへの環境のマイグレーションを行う
1. uvインストール
https://github.com/astral-sh/uv を参照して行う。
なお、自分の環境は devcontainer なので、起動後のコンテナ内実施だけでなく、
Dockerfileにも忘れず書き込む。
2. 既存の .venv バックアップ
cp .venv _.venv
3. uvによるvenv環境作成
既存の.venvをクリアし、3.12を指定して作る
uv venv --clear --python 3.12
# 結果
Using CPython 3.12.3 interpreter at: /usr/local/bin/python3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
バージョン固定しておく
uv python pin 3.12
# 結果
Pinned `.python-version` to `3.12`
4.pyproject.toml を作成、依存パッケージ情報を移動する。
ruff等で作成していなければ、init --bare で作成。
本番用のrequirement.txt、開発用の requirements-dev.txt から依存性を移す。
早速、マルウェアチェックフラグの UV_MALWARE_CHECK=1 を使っていく。
export UV_MALWARE_CHECK=1
uv init --bare
uv add -r requirements.txt
uv add --dev -r requirements-dev.txt
出来上がった。以降はパッケージをここで管理する。
同時に、uv.lock も作成されている。
[project]
name = "project-name"
version = "1.0.0"
requires-python = ">=3.12"
dependencies = [
"azure-data-tables>=12.7.0",
"azure-functions>=1.24.0",
"azure-functions-durable>=1.5.0",
"azure-identity>=1.25.3",
"azure-storage-blob>=12.30.0",
"azure-storage-queue>=12.17.0",
"numpy>=2.4.6",
"pandas>=3.0.3",
"pydantic>=2.13.4",
"sqlalchemy>=2.0.50",
]
[dependency-groups]
dev = [
"pytest>=9.0.3",
"ruff==0.15.16"
]
5.requirements.txt を更新するためのコマンドを準備
Azure Functions実行環境では requirements.txt が必要なので、
リポジトリに含めるため、uv.lock で固定されているバージョンを指定して出力する。
uv export --format requirements.txt --no-dev --no-hashes --output-file requirements.txt
(一部抜粋)バージョン番号と、参照元などのコメントが追加された。
azure-core==1.41.0
# via
# azure-data-tables
# azure-identity
# azure-storage-blob
# azure-storage-queue
uv auditを使ってみる
uv audit
# 結果
warning: `uv audit` is experimental and may change without warning. Pass `--preview-features audit-command` to disable this warning.
Resolved 63 packages in 12ms
Found no known vulnerabilities and 1 adverse project status in 62 packages
Adverse statuses:
- pathlib is archived
なるほど。
https://pypi.org/project/pathlib/
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
動作確認
# venvに入ってから
func host start
# 結果
[2026-06-09T23:14:05.637Z] Host lock lease acquired by instance ID '00000000000000000000000010F5218C'.
動作OK
今後の運用について
-
UV_MALWARE_CHECK=1を永続化 - インストール時は、
uv add <package-name>/ uv syncを使う。 (pipコマンドは使わない) -
pyproject.yml(の依存性)を更新したら、requirements.txtに反映するようlefthook等のイベントトリガーを設定する - dependabot等の自動化をしていない場合でも、
uv auditを定期実行して適宜更新を行う。