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 AlertList | import一覧を洗い出し、削除・名称変更を確認する |
| Flattened property | pricing.pricing_tier | properties配下や新モデル名を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の利用箇所を検索し、影響範囲リストを作るところから始めてください。

コメント