0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure Functionsの開発環境を、venvからuvに変更する

0
Last updated at Posted at 2026-06-10

いきさつ

  • Azure Functions(Python)の開発環境にuvの使い勝手、セキュリティ機能を採用したい
  • uvvenv を内包しているし、代替可能なはず

やること

  • 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 も作成されている。

pyproject.toml
[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

(一部抜粋)バージョン番号と、参照元などのコメントが追加された。

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 を定期実行して適宜更新を行う。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?