💪

Windows ARM64(Copilot+ PC)で Python + Azure SDK をセットアップする完全ガイド

に公開

はじめに

Surface Pro XCopilot+ PCSurface 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 failedimport できない 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 ステップが必要です:

  1. ビルドツールの準備(Rust + MSVC ARM64 + OpenSSL)
  2. cryptography のソースビルド(環境変数設定 → pip install --no-binary
  3. 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
GitHubで編集を提案

Discussion