Azure SDKのTypeSpec移行:azure-mgmt-security(Python)の変更点と対応手順

Azure SDKの「Azure SDK documentation update: [Python] TypeSpec migration for azure-mgmt-security」は、azure-mgmt-securityを使っているPython開発者にとって、単なるドキュメント更新ではなく、生成元仕様とSDKコード生成の移行に伴う互換性確認ポイントです。結論から言うと、まだ本番環境で即時対応が必要な変更とは限りませんが、SecurityCenterのインポート、モデルの直接参照、list系メソッド、api_version固定、as_dict()や辞書変換を使っているコードは、次のリリース前に必ずテスト対象に入れるべきです。対象PRは2026年5月5日にレビュー待ちの状態となっており、サービスチームがSDKリリースを待っている旨も記録されています。(GitHub)

目次

まず押さえるべき結論

今回の更新は、Azure SDK for Pythonの管理ライブラリであるazure-mgmt-securityを、従来のSwaggerベース生成からTypeSpecベース生成へ移行する流れの一部です。TypeSpecは、API仕様、クライアントコード、サーバー側コードなどを生成するためのAPI設計言語で、Microsoft Learnでも「API仕様やクライアントコードを生成できる」と説明されています。(Microsoft Learn)

特に重要なのは、PR上で「Breaking Change Analysis Summary」として合計483件の破壊的変更項目が示され、そのうち477件はTypeSpec移行に伴う想定変更として受け入れられている点です。これは、REST API自体の大きな変更というより、Python SDKの生成コード、公開クラス、モデル、メソッドシグネチャが変わる可能性を意味します。(GitHub)

対応の優先度は、次のように判断すると現実的です。

利用状況対応優先度理由
azure-mgmt-securityを使っていない低対象ライブラリ外のため直接影響は小さい
azure-mgmt-security==7.0.0などで固定している中すぐには壊れにくいが、将来の更新時に影響を受ける
pip install azure-mgmt-securityでバージョン固定していない高CIや検証環境で新バージョンを拾う可能性がある
SecurityCenter、モデルクラス、*Listモデルを直接importしている高クラス名・モデル名・リスト応答モデルの削除や名称変更が発生しやすい
Microsoft Defender for Cloud関連の自動化スクリプトを運用している高セキュリティ設定、評価、価格設定、DevOps連携など複数操作グループに影響する可能性がある

何が変わったのか

今回の流れは、azure-rest-api-specs側でMicrosoft.Securityの仕様をTypeSpecへ移行し、その仕様をもとにAzure SDK for Pythonのazure-mgmt-securityを再生成するものです。関連するSpec PRは2026年4月28日にマージ済みで、SDK側PRではそのSpec PRが参照されています。(GitHub)

TypeSpec移行により、SDK利用者が確認すべき変更点は主に次の5つです。

確認項目変更の内容実務上の影響
クライアント名差分上ではSecurityManagementClientが導入されているfrom azure.mgmt.security import SecurityCenterに依存するコードは確認が必要
モデル構造Flattenされたプロパティや未参照モデル、*Listモデルが削除・変更されるPricing.pricing_tierのような直接参照が壊れる可能性がある
メソッドシグネチャ一部パラメーターがキーワード専用化、順序変更、追加・削除される位置引数で呼び出しているコードが壊れやすい
非同期・同期の扱い一部listメソッドでasync/syncの差分が報告されているawait client.xxx.list()のようなコードは再確認が必要
APIバージョン複数APIバージョンを扱う構成から、TypeSpec側のAPIバージョンマッピングへ移行特定APIバージョン前提の運用スクリプトは検証が必要

SDK側の差分では、azure.mgmt.security.__init__がSecurityManagementClientを公開する形になっており、生成元も「Microsoft Python Code Generator」に変わっています。既存のMicrosoft Learn上の安定版ドキュメントではSecurityCenterが使われているため、実際の移行では「現在の安定版ドキュメント」と「TypeSpec生成後のPR差分」を分けて確認する必要があります。(GitHub)

影響を受けやすいコード

もっとも注意すべきなのは、SDKの内部構造に近い部分を直接参照しているコードです。たとえば、次のようなコードは移行時に壊れやすくなります。

from azure.identity import DefaultAzureCredential
from azure.mgmt.security import SecurityCenter

client = SecurityCenter(
    credential=DefaultAzureCredential(),
    subscription_id=subscription_id
)

現在の安定版ドキュメントではこの形が案内されていますが、TypeSpec移行後のPR差分ではSecurityManagementClientが公開クラスとして見えています。リリース前のPR段階では最終名称が変わる可能性もあるため、アプリ側では「最終的なリリースノートとAPIリファレンスを見てから変更する」ことが重要です。(Microsoft Learn)

検証ブランチでは、次のように現在利用可能なクラスを確認すると、移行差分を早く検出できます。

python - <<'PY'
import azure.mgmt.security as security

print("version:", getattr(security, "__version__", "unknown"))
print("has SecurityCenter:", hasattr(security, "SecurityCenter"))
print("has SecurityManagementClient:", hasattr(security, "SecurityManagementClient"))
PY

本番コードで無理に両方を吸収するより、まずはCIで検出するほうが安全です。互換性維持のために一時的なアダプターを書く場合でも、どちらのクラス名を正式に採用するかは、リリース済みパッケージのドキュメントで確認してから決めるべきです。

モデル参照は「削除」「移動」「properties化」を疑う

TypeSpec移行で実務上よく問題になるのが、モデルのプロパティ参照です。SDK側PRの要約では、AlertList、PricingList、SecurityConnectorsListなどのページング用モデルの削除、CloudErrorAutoGenerated*のような共通エラー型の削除、Pricing.pricing_tierやIoTSecuritySolutionModel.workspaceのようなFlattened propertiesの削除が挙げられています。(GitHub)

たとえば、次のようなコードは注意が必要です。

pricing = client.pricings.get(...)
print(pricing.pricing_tier)

移行後は、プロパティがproperties配下に移る、別名になる、またはモデル構造自体が変わる可能性があります。移行テストでは、単に「APIが呼べるか」だけでなく、取得したオブジェクトから参照している属性をすべて確認してください。

確認すべき観点は次の通りです。

確認対象壊れやすい例対応方法
直接importしているモデルfrom azure.mgmt.security.models import AlertListimport一覧を洗い出し、削除・名称変更を確認する
Flattened propertypricing.pricing_tierproperties配下や新モデル名をAPIリファレンスで確認する
as_dict()結果JSONキーのsnake_case前提レスポンスの実データ構造を再取得して比較する
型アノテーションSecurityConnectorsListなどSDK生成モデルではなく、自前のDTOやMappingで受ける
例外処理CloudErrorAutoGenerated*azure.core.exceptions.HttpResponseError系で捕捉できるか確認する

別のAzure SDK for PythonのTypeSpec移行関連Issueでは、as_dict()の引数名変更、snake_caseからcamelCaseへのキー変更、階層構造の扱いの変化が報告されています。azure-mgmt-security固有の全変更として断定はできませんが、辞書化した結果を監査ログ、差分比較、JSON保存に使っている場合は同じ観点で確認したほうが安全です。(GitHub)

メソッド呼び出しは位置引数をやめてキーワード引数に寄せる

PR差分のCHANGELOGでは、PrivateLinksOperations、PrivateEndpointConnectionsOperations、SqlVulnerabilityAssessmentBaselineRulesOperationsなどで、パラメーター追加・削除・順序変更が記録されています。また、一部メソッドではdatabase_nameやexpandなどがキーワード専用に変わる差分も示されています。(GitHub)

壊れやすいのは、次のような位置引数中心の呼び出しです。

client.private_links.get(resource_group_name, private_link_parameters)

TypeSpec移行後は、パラメーターの意味が変わってもPython側では位置引数として渡せてしまい、意図しないリクエストになる可能性があります。移行前から次のようにキーワード引数へ寄せておくと、差分検出がしやすくなります。

client.private_links.get(
    resource_group_name=resource_group_name,
    private_link_name=private_link_name,
)

特にセキュリティ関連の自動化では、誤ったスコープやリソース名に対する変更が重大な運用ミスにつながります。delete、update、begin_create、begin_deleteのような変更系操作は、引数順に依存しない書き方へ先に直しておくのが現実的です。

APIバージョン固定の考え方を見直す

azure-mgmt-securityはもともと複数APIバージョンを扱う管理ライブラリです。Microsoft Learnのパッケージ説明でも、複数APIバージョンを含み、本番環境では特定のapi-versionやprofileに固定することが推奨されています。(Microsoft Learn)

今回のTypeSpec移行では、_metadata.jsonに複数の操作グループとAPIバージョンが明示されています。たとえばAssessmentAPIは2025-05-04、PricingsAPIは2024-01-01、PrivateLinksAPIは2026-01-01、SqlVulnerabilityAssessmentsAPIは2026-04-01-previewとして記録されています。(GitHub)

確認すべきなのは、「どの操作でどのAPIバージョンを使っているか」です。次のようなケースでは、特に注意してください。

ケース確認ポイント
既存コードでapi_versionを明示しているそのバージョンが移行後SDKで引き続きサポートされるか
profileを使っている操作グループごとのマッピングが変わっていないか
プレビューAPIを使っている*-previewの有無と操作名の変化
Defender for Cloudの設定自動化をしているpricings、settings、security_connectors、sql_vulnerability_assessment_*などを重点確認
Azure Government、Azure China、Azure Stackを使っているbase_url、cloud_setting、credential scopeの扱いを確認

安定版のazure-mgmt-securityはPyPI上で7.0.0が最新安定版として表示され、Azure SDKのリリース一覧では安定版7.0.0とベータ版8.0.0b1が並んでいます。TypeSpec移行後のPRはさらに次のベータ相当の変更として扱われる可能性があるため、検証環境では意図せずベータ版を入れないようにしてください。(PyPI)

移行前にやるべき確認手順

本番環境でazure-mgmt-securityを使っている場合は、次の順番で確認すると無駄がありません。

現在の利用バージョンを固定する

まず、今動いている環境のバージョンを確認します。

python -m pip show azure-mgmt-security
python -m pip freeze | grep azure-mgmt-security

requirements.txtやpyproject.tomlでバージョンを固定していない場合は、少なくとも本番環境では固定してください。

azure-mgmt-security==7.0.0
azure-identity

これは「古い版を使い続ける」という意味ではありません。移行テストが終わるまで、予期しないSDK更新で運用スクリプトが壊れるのを防ぐための安全策です。

importしているクラスとモデルを棚卸しする

次に、azure.mgmt.securityから直接importしている箇所を洗い出します。

grep -R "azure.mgmt.security" -n .
grep -R "SecurityCenter" -n .
grep -R "AlertList\|PricingList\|SecurityConnectorsList" -n .

特にmodels配下のクラスを大量にimportしているコードは注意が必要です。SDK生成モデルは移行で変わりやすいため、長期運用するシステムでは、SDKモデルをそのまま業務ロジック全体に広げず、自前のデータクラスや辞書に変換する境界を作ると保守しやすくなります。

主要操作のスモークテストを作る

SDK移行の検証では、全操作を網羅するより、実際に使っている操作を短いスモークテストにするほうが効果的です。

from azure.identity import DefaultAzureCredential

try:
    from azure.mgmt.security import SecurityManagementClient as SecurityClient
except ImportError:
    from azure.mgmt.security import SecurityCenter as SecurityClient

client = SecurityClient(
    credential=DefaultAzureCredential(),
    subscription_id=subscription_id,
)

# 実際に業務で使っている操作だけをテストする
print(client)

このコードは本番実装の推奨形ではなく、検証用の例です。最終的にはリリース済みパッケージの正式なクラス名に合わせて、importを明確にしてください。

レスポンスの属性アクセスを比較する

API呼び出しが成功しても、レスポンスオブジェクトの属性構造が変わっていると、後続処理で失敗します。特に、監査ログ生成、セキュリティ設定の棚卸し、ExcelやCSVへの出力処理では、属性名の変化に気づきにくいです。

検証では、次のように「取得できたか」ではなく「参照している属性が存在するか」を確認します。

def require_attrs(obj, attrs):
    missing = [name for name in attrs if not hasattr(obj, name)]
    if missing:
        raise AssertionError(f"missing attrs: {missing}")

# 例: 業務コードで参照している属性を明示する
# require_attrs(pricing, ["name", "type", "properties"])

as_dict()やJSON化した結果を保存している場合は、移行前後のサンプルレスポンスを比較してください。キー名、階層、読み取り専用フィールドの扱いが変わると、差分検知や監査レポートが誤作動することがあります。

開発チーム・運用チーム別の対応ポイント

開発チームは、SDKのビルドやimportエラーだけでなく、モデル構造とメソッド引数を重点的に確認してください。list結果の戻り値、begin_で始まる長時間実行操作、HttpResponseErrorの捕捉、properties配下の値参照は優先度が高い項目です。

運用チームは、パッケージ更新のタイミングを管理することが重要です。Azure SDKの管理ライブラリは、クラウド側のセキュリティ設定や構成変更に直結します。特にDefender for Cloudの価格設定、セキュリティ評価、DevOps連携、SQL脆弱性評価を自動化している場合、SDK更新を通常の軽微な依存関係更新として扱わないほうが安全です。

CI/CD管理者は、次の3点を確認してください。

確認項目推奨対応
依存関係更新本番は固定、検証環境でのみ新バージョンを試す
テスト対象import、認証、主要API呼び出し、レスポンス属性、例外処理を含める
ロールバック旧バージョンへ戻せるようrequirements.txtやロックファイルを保存する

今回の変更で失敗しやすいポイント

今回のTypeSpec migrationで一番避けたいのは、「SDKがインストールできたから問題ない」と判断することです。破壊的変更の多くは、インストール時ではなく、特定の操作を呼び出したとき、またはレスポンス属性を読むときに表面化します。

失敗しやすいパターンは次の通りです。

失敗パターン起きる問題回避策
バージョン固定なしでCIを回すある日突然importエラーになる本番・CIの依存関係を固定する
SecurityCenter前提で実装しているクライアント名変更で起動時に失敗する正式リリース後の公開クラス名を確認する
位置引数でメソッドを呼ぶパラメーター順変更で誤った値が渡るキーワード引数へ変更する
*Listモデルを型として使うモデル削除でimportできないイテレーターや自前DTOで扱う
as_dict()のJSON構造を前提にするキー名・階層変更で差分処理が壊れる移行前後の実レスポンスを比較する
ベータ版を本番に入れる未確定の差分を踏むベータは検証環境限定にする

なお、PR上ではPython emitterの不具合として、LRO操作と@@overrideに関連する重複スキーマ名の問題が記録され、ローカルのpygenパッチで回避している旨が記載されています。これは一般利用者が直接修正するものではありませんが、PRがまだレビュー・修正過程にあることを示す材料として押さえておくべきです。(GitHub)

次に取るべき行動

azure-mgmt-securityを使っている場合、まず依存関係を固定し、現在の本番コードでazure.mgmt.securityを参照している箇所を棚卸ししてください。そのうえで、検証環境にTypeSpec移行後のリリース候補またはベータ版を入れ、import、主要API呼び出し、モデル属性、as_dict()結果、例外処理を確認します。

今回のAzure SDK documentation updateは、リリース情報を眺めるだけでは不十分です。SecurityCenterの利用、モデル直接参照、位置引数、複数APIバージョン、Defender for Cloud自動化の5点を確認すれば、移行時の大半のトラブルを事前に見つけられます。次の作業として、まずはリポジトリ内でazure.mgmt.securityの利用箇所を検索し、影響範囲リストを作るところから始めてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次