Windows ARM64(Copilot+ PC)で Python + Azure SDK をセットアップする完全ガイド
はじめに
Surface Pro X、Copilot+ PC、Surface Pro 11 など、ARM64 プロセッサ(Snapdragon X Elite / Plus)搭載の Windows マシンが急速に普及しています。バッテリー持ちが良く、ファンレスで静かな開発マシンとして魅力的ですが、Python で Azure 開発をしようとすると、いきなり壁にぶつかります。
Azure SDK が使えると何がうれしいのか
Azure SDK(azure-identity, azure-storage-blob, azure-cosmos 等)を使うと、Python から Azure のリソースを安全かつ簡単に操作できます。
# Azure SDK を使うと、たった数行で Blob Storage にファイルをアップロードできる
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential() # 認証は自動!
client = BlobServiceClient(
account_url="https://myaccount.blob.core.windows.net",
credential=credential
)
blob_client = client.get_blob_client("my-container", "report.pdf")
with open("report.pdf", "rb") as f:
blob_client.upload_blob(f, overwrite=True)
特に重要なのが DefaultAzureCredential です。このクラスは実行環境を自動判別し、ローカルでは az login の認証、Azure 上では Managed Identity を使い分けます。つまり、コードを一切変えずにローカルでもクラウドでも動くアプリを書けます。
Azure SDK なしだと、REST API を直接叩いてアクセスキーの HMAC-SHA256 署名を手計算する…といった面倒なコードが必要になります。
cryptography パッケージがなぜ問題になるか
cryptography は Python の暗号処理ライブラリです。SSL/TLS 通信、証明書検証、デジタル署名など、セキュリティの根幹を担います。直接使う機会は少なくても、Azure SDK の azure-identity が内部で依存しているため、これがインストールできないと Azure SDK 自体が動きません。
問題は、このパッケージが Python + C + Rust という 3 つの言語で書かれており、pip install 時にネイティブバイナリが必要なことです。通常はビルド済みバイナリ(wheel)が PyPI に公開されていますが、Windows ARM64 用の wheel だけが存在しません。そのため、ソースコードからのビルドが必要になります。
ぶつかるエラー
ERROR: Failed building wheel for cryptography
ImportError: DLL load failed while importing _rust: 指定されたプロシージャが見つかりません。
回避策:WSL2 という選択肢もある
手っ取り早い回避策として WSL2(Windows Subsystem for Linux) があります。WSL2 の Ubuntu 上では Linux ARM64 の wheel が利用可能なので、pip install azure-identity 一発で入ります。
ただし、以下のような場合は Windows ネイティブでの開発が必要になります:
- PowerShell スクリプトと組み合わせたい
- VS Code のネイティブ Python 拡張機能をフル活用したい
- Windows 固有の API(COM, Win32)を使うプロジェクト
- Docker を使わずにローカルで直接実行・デバッグしたい
本記事では、WSL2 に頼らず Windows ARM64 ネイティブ環境で Azure SDK をセットアップする手順を、背景知識も含めて丁寧に解説します。
この記事で解決できること
| 困りごと | 解決方法 |
|---|---|
pip install azure-identity が失敗する |
cryptography をソースビルドする |
DLL load failed で import できない |
sitecustomize.py で DLL ロード順を制御する |
| ローカルから Azure リソースにアクセスできない |
DefaultAzureCredential + RBAC を設定する |
背景:なぜこの手順が必要なのか
wheel の提供状況
cryptography の PyPI には主要プラットフォーム向けのビルド済み wheel が公開されていますが、すべてに対応しているわけではありません:
| OS | アーキテクチャ | wheel の有無 |
|---|---|---|
| Windows | x64 | ✅ あり |
| Windows | ARM64 | ❌ なし |
| macOS | ARM64 (Apple Silicon) | ✅ あり |
| Linux | x64 | ✅ あり |
| Linux | ARM64 | ✅ あり |
Windows ARM64 だけが取り残されている状態です。そのため、自分でソースコードからビルドする必要があります。
ソースビルドに必要なもの
cryptography は 3 つの言語で書かれているため、ビルドには 3 つのツールチェーンが必要です:
cryptography のソースコード
├── Python 部分 → pip が処理(追加ツール不要)
├── C 部分 → MSVC(Microsoft Visual C++)が必要
└── Rust 部分 → Rust コンパイラ(rustc)が必要
└── OpenSSL にリンク → OpenSSL 開発ライブラリが必要
さらに、ARM64 向けの .pyd(Python 拡張モジュール)を作るには、各ツールが ARM64 をターゲットとして出力できる必要があります。
用語解説
ビルド手順に入る前に、登場する用語をまとめておきます。
Rust(ラスト)
Mozilla が開発したシステムプログラミング言語。メモリ安全性と高速性を両立しています。cryptography パッケージはバージョン 35 以降、暗号処理の一部を Rust で実装しています。そのため、ソースビルドには Rust コンパイラ(rustc) が必要です。
MSVC(Microsoft Visual C++)
Microsoft の C/C++ コンパイラとリンカのセット。Visual Studio Build Tools に含まれます。cryptography は C 言語で書かれた部分もあるため、MSVC のリンカ(link.exe) が必要です。
重要なのは、ARM64 の実行ファイルを作るには ARM64 用のリンカとライブラリが必要なこと。デフォルトでは x64 用しかインストールされないため、ARM64 コンポーネントを明示的に追加する必要があります。
OpenSSL
暗号通信のデファクト標準ライブラリ。TLS/SSL 接続、証明書検証などに使われます。cryptography パッケージは OpenSSL にリンクして暗号処理を行うため、ビルド時に OpenSSL のヘッダファイル(.h)とライブラリ(.lib) が必要です。
DefaultAzureCredential
「はじめに」で紹介した、Azure SDK の認証クラス。実行環境に応じて最適な認証方法を自動選択します:
| 実行環境 | 使われる認証方法 |
|---|---|
| Azure App Service | Managed Identity(マネージド ID) |
ローカル(az login 済み) |
Azure CLI の資格情報 |
| GitHub Actions | フェデレーション ID トークン |
本記事のゴールは、ローカル環境でこの DefaultAzureCredential を動作させることです。
RBAC(Role-Based Access Control)
Azure のリソースに対して「誰が」「何をできるか」をロール(役割)で制御する仕組み。例えば Storage Blob Data Contributor ロールを付与すると、Blob の読み書き削除が許可されます。ローカルから DefaultAzureCredential で Azure リソースにアクセスするには、az login ユーザーに適切なロールを付与する必要があります。
sitecustomize.py
Python が起動時に自動的に読み込むファイル。site-packages/ ディレクトリに置くと、どの Python スクリプトを実行しても最初に自動実行されます。本記事では OpenSSL の DLL ロード順を制御するために使用します。
前提条件
- Windows 11 ARM64(Surface Pro X / Copilot+ PC / Dev Kit 等)
- Python 3.12+(ARM64 ネイティブ版)
- winget コマンドが使えること
-
Azure CLI がインストール済みで
az login済みであること(Azure リソースにアクセスする場合)
確認コマンド:
# Python が ARM64 版か確認
python -c "import platform; print(platform.machine())"
# → ARM64 と表示されればOK(x86_64 の場合は x64 エミュレーション版)
セットアップ手順
Step 1. Rust コンパイラのインストール
cryptography のソースコードに含まれる Rust コードをコンパイルするために必要です。
winget install Rustlang.Rustup
rustup default stable
rustc --version
# → rustc 1.xx.x (aarch64-pc-windows-msvc) と表示されればOK
aarch64-pc-windows-msvc と表示されれば、ARM64 用の Rust コンパイラが正しくインストールされています。
Step 2. Visual Studio Build Tools 2022 のインストール
C/C++ コードのコンパイルとリンクに必要な MSVC ツールチェーンです。
winget install Microsoft.VisualStudio.2022.BuildTools `
--override "--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --passive"
ARM64 コンポーネントの追加(⚠️ 管理者権限が必要):
デフォルトでは x64 用のリンカとライブラリしかインストールされません。ARM64 向けにビルドするには ARM64 コンポーネントを明示的に追加します。
$installer = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe"
Start-Process -Verb RunAs -FilePath $installer -ArgumentList @(
"modify",
"--installPath", "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools",
"--add", "Microsoft.VisualStudio.Component.VC.Tools.ARM64",
"--passive"
) -Wait
確認(True が返ればOK):
Test-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\*\lib\arm64"
Step 3. OpenSSL ARM64 開発ライブラリのインストール
cryptography がリンクする暗号ライブラリです。ヘッダファイル(.h)とスタティックライブラリ(.lib)の両方が必要なため、Dev 版をインストールします。
winget install ShiningLight.OpenSSL.Dev
# → C:\Program Files\OpenSSL-Win64-ARM にインストールされる
Step 4. 仮想環境の作成
プロジェクトごとに隔離された Python 環境を作成します。
python -m venv .venv
.\.venv\Scripts\Activate.ps1
Step 5. cryptography のソースビルド
ここが最も複雑な手順です。MSVC と OpenSSL の場所をビルドシステムに教えるため、複数の環境変数を設定してから pip install を実行します。
# --- MSVC の場所を解決 ---
$msvcVer = (Get-ChildItem "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC" |
Sort-Object Name -Descending | Select-Object -First 1).Name
$msvcBase = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\$msvcVer"
# --- Windows SDK の場所を解決 ---
$sdkVer = (Get-ChildItem "${env:ProgramFiles(x86)}\Windows Kits\10\Include" |
Where-Object { $_.Name -match '^\d+\.' } |
Sort-Object Name -Descending | Select-Object -First 1).Name
# --- 環境変数の設定 ---
# PATH: ARM64 ネイティブの link.exe を使う(Hostarm64\arm64)
$env:PATH = "$msvcBase\bin\Hostarm64\arm64;$env:PATH"
# INCLUDE: コンパイラがヘッダファイルを探す場所
$env:INCLUDE = "$msvcBase\include;" + `
"${env:ProgramFiles(x86)}\Windows Kits\10\Include\$sdkVer\ucrt;" + `
"${env:ProgramFiles(x86)}\Windows Kits\10\Include\$sdkVer\shared;" + `
"${env:ProgramFiles(x86)}\Windows Kits\10\Include\$sdkVer\um"
# LIB: リンカがライブラリを探す場所(arm64 サブフォルダを指定)
$env:LIB = "$msvcBase\lib\arm64;" + `
"${env:ProgramFiles(x86)}\Windows Kits\10\Lib\$sdkVer\ucrt\arm64;" + `
"${env:ProgramFiles(x86)}\Windows Kits\10\Lib\$sdkVer\um\arm64"
# --- OpenSSL の場所を指定 ---
$env:OPENSSL_DIR = "C:\Program Files\OpenSSL-Win64-ARM"
# ⚠️ ライブラリは lib\ 直下ではなく lib\VC\arm64\MD\ にある
$env:OPENSSL_LIB_DIR = "C:\Program Files\OpenSSL-Win64-ARM\lib\VC\arm64\MD"
$env:OPENSSL_INCLUDE_DIR = "C:\Program Files\OpenSSL-Win64-ARM\include"
# --- ビルド&インストール ---
pip install cryptography --no-binary cryptography
各環境変数の意味
| 環境変数 | 設定内容 | なぜ必要か |
|---|---|---|
PATH |
MSVC の ARM64 link.exe があるディレクトリ | x64 の link.exe が使われると ARM64 バイナリが作れない |
INCLUDE |
MSVC ヘッダ + Windows SDK ヘッダ(ucrt, shared, um) | C コンパイラが #include を解決するため |
LIB |
MSVC lib + Windows SDK lib(arm64 サブフォルダ) | リンカが .lib ファイルを見つけるため |
OPENSSL_DIR |
OpenSSL のルートディレクトリ |
cryptography のビルドスクリプトが参照 |
OPENSSL_LIB_DIR |
OpenSSL の .lib ファイルの場所 |
デフォルトの lib\ 直下にはないため明示指定 |
OPENSSL_INCLUDE_DIR |
OpenSSL のヘッダファイルの場所 |
#include <openssl/ssl.h> を解決するため |
Step 6. ランタイム DLL 競合の回避
ビルドに成功しても、import 時にこのエラーが出ることがあります(出ない環境もあります):
ImportError: DLL load failed while importing _rust: 指定されたプロシージャが見つかりません。
原因: ビルドした cryptography の Rust 拡張(_rust.pyd)は実行時にも OpenSSL の DLL を必要とします。しかし、C:\Windows\System32 にも OpenSSL DLL が存在する場合があり、Python がそちらを先にロードしてしまいます。ビルド時に使った OpenSSL とバージョンやエクスポートシンボルが異なるため、ロード失敗します。
検索順序:
1. C:\Windows\System32\libcrypto-3.dll ← ❌ 間違ったバージョン
2. C:\Program Files\OpenSSL-Win64-ARM\bin\libcrypto-3-arm64.dll ← ✅ 正しいバージョン
解決策: sitecustomize.py を venv 内に作成し、Python 起動時に正しい DLL を先にロードします。このエラーが出ない場合でも、予防的に設置しておくことをお勧めします。
# .venv/Lib/site-packages/sitecustomize.py
"""
Windows ARM64 向け OpenSSL DLL プリロード
System32 の OpenSSL DLL との競合を回避するため、
ビルド時に使用した OpenSSL の DLL を先にロードする。
"""
import os
import sys
if sys.platform == "win32":
_openssl_bin = r"C:\Program Files\OpenSSL-Win64-ARM\bin"
if os.path.isdir(_openssl_bin):
os.add_dll_directory(_openssl_bin)
import ctypes
try:
ctypes.WinDLL(os.path.join(_openssl_bin, "libcrypto-3-arm64.dll"))
ctypes.WinDLL(os.path.join(_openssl_bin, "libssl-3-arm64.dll"))
except OSError:
pass # OpenSSL not installed — fall through
Step 7. Azure SDK のインストール
cryptography が動作するようになったので、Azure SDK を通常通りインストールできます。
プロジェクトで使うパッケージをまとめてインストールするなら、requirements.txt にまとめるのがベストプラクティスです:
# requirements.txt
azure-identity # 認証(DefaultAzureCredential)— ほぼ必須
azure-storage-blob # Blob Storage
azure-cosmos # Cosmos DB
azure-ai-documentintelligence # Document Intelligence (AI)
openai # Azure OpenAI
azure-mgmt-resource # Azure Resource Manager(リソース管理)
azure-monitor-opentelemetry # Application Insights(監視)
pip install -r requirements.txt
最低限で始めるなら、認証パッケージ+使いたいサービスの 2 つだけで OK です:
# 例: Blob Storage を使う場合
pip install azure-identity azure-storage-blob
Step 8. 動作確認
python -c "from azure.identity import DefaultAzureCredential; print('azure-identity OK')"
python -c "from azure.storage.blob import BlobServiceClient; print('azure-storage-blob OK')"
両方とも OK と表示されれば完了です 🎉
(任意)ローカルから Azure リソースにアクセスする
DefaultAzureCredential をローカルで使うには、az login ユーザーに Azure リソースへのアクセス権を付与する必要があります。
Blob Storage の場合
# 自分のオブジェクト ID を取得
$objectId = (az ad signed-in-user show --query id -o tsv)
# Blob ストレージへの読み書き権限を付与
az role assignment create `
--assignee-object-id $objectId `
--assignee-principal-type User `
--role "Storage Blob Data Contributor" `
--scope "/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RG>/providers/Microsoft.Storage/storageAccounts/<ACCOUNT>"
Cosmos DB の場合
az cosmosdb sql role assignment create `
--account-name <ACCOUNT> `
--resource-group <RG> `
--role-definition-name "Cosmos DB Built-in Data Contributor" `
--principal-id $objectId `
--scope "/"
動作確認(Blob の例)
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential()
client = BlobServiceClient(
account_url="https://<ACCOUNT>.blob.core.windows.net",
credential=credential
)
# コンテナ一覧を取得
for container in client.list_containers():
print(container["name"])
トラブルシューティング
| エラー | 原因 | 対処 |
|---|---|---|
link.exe not found |
MSVC の PATH が設定されていない | Step 5 の $env:PATH 設定を確認 |
LNK4272: library machine type 'x64' conflicts with target 'ARM64' |
ARM64 の MSVC コンポーネントが未インストール | Step 2 の ARM64 追加を実行 |
Could not find OpenSSL |
OpenSSL の環境変数が未設定 | Step 5 の OPENSSL_* 3 変数を確認 |
OpenSSL library not found at lib |
OPENSSL_LIB_DIR が正しくない |
lib\VC\arm64\MD を指定する(lib 直下ではない) |
DLL load failed: 指定されたプロシージャが見つかりません |
System32 の OpenSSL が先にロードされている | Step 6 の sitecustomize.py を設定 |
AuthorizationPermissionMismatch |
RBAC ロールが未付与、または反映待ち | RBAC を設定し、数分待って再試行 |
OpenSSL 3's legacy provider failed to load |
警告のみ。動作に影響なし | 無視してOK |
error: can't find Rust compiler |
Rust 未インストールまたは PATH が通ってない | Step 1 を実行し、ターミナルを再起動 |
よくある質問
Q. Azure App Service にデプロイするときもこの手順は必要?
不要です。 Python の Azure App Service は一般的に Linux(x64 / ARM64)で動作するため、PyPI からビルド済みの wheel が自動的にインストールされます。Windows App Service の場合も x64 環境なので同様に wheel が利用可能です。この手順は Windows ARM64 のローカル開発時のみ必要です。
Q. ビルド後にターミナルを閉じたら、次回もビルドし直し?
不要です。 pip のキャッシュにビルド済みの wheel が保存されます。次回 pip install cryptography はキャッシュから取得されるため、ビルド環境の再構築は不要です。
# キャッシュの確認
pip cache list cryptography
Q. 新しい venv を作ったらどうなる?
pip install cryptography でキャッシュから取得されるのでビルドは不要です。ただし、sitecustomize.py は venv ごとに作成する必要があります。
Q. WSL2 を使えばこの手順を回避できる?
はい。 「はじめに」でも触れたとおり、WSL2 上の Ubuntu では Linux ARM64 の wheel が利用可能です。WSL2 で問題ない用途であれば、それが最も手軽な選択肢です。PowerShell や Windows ネイティブ環境が必要な場合は、本記事の手順でセットアップしてください。
Q. cryptography の PyPI に Windows ARM64 の wheel が追加されれば不要になる?
はい。 cryptography チームが Windows ARM64 の wheel を公式にリリースすれば、この手順は完全に不要になります。pyca/cryptography の GitHub Issues で議論されています。
まとめ
Windows ARM64 で Python + Azure SDK を使うには、以下の 3 ステップが必要です:
- ビルドツールの準備(Rust + MSVC ARM64 + OpenSSL)
-
cryptographyのソースビルド(環境変数設定 →pip install --no-binary) -
DLL 競合の回避(
sitecustomize.pyの設置)
一度セットアップすればキャッシュが効くので、2 回目以降は通常の pip install だけで動作します。
Copilot+ PC の普及で Windows ARM64 の開発者は増えていくはずです。この記事が環境構築の壁を乗り越える助けになれば幸いです。
検証環境
| 項目 | バージョン |
|---|---|
| 検証日 | 2026-02-14 |
| OS | Windows 11 ARM64 (24H2) |
| Python | 3.12.10 (ARM64) |
| cryptography | 46.0.5(ソースビルド) |
| Rust | 1.93.1 (aarch64-pc-windows-msvc) |
| MSVC | 14.44.35207 |
| OpenSSL | 3.6.1 (ShiningLight ARM64 Dev) |
| azure-identity | 1.25.2 |
| azure-storage-blob | 12.28.0 |
Discussion