Azure SDK更新:async AzureMLOnBehalfOfCredentialの_identity_configエラー修正と確認ポイント

2026年5月5日に更新が確認された「Azure SDK documentation update: Fix async AzureMLOnBehalfOfCredential AttributeError on _identity_config」は、Azure Machine Learningジョブ内でユーザーIDの代理認証、いわゆるOBO認証を非同期クライアント経由で使う場合に発生する不具合への修正です。

結論から言うと、確認すべきポイントは3つです。identity: user_identity を指定したAzure MLジョブで、非同期のAzure SDKクライアントや非同期資格情報パスを使っているか。ログに AsyncManagedIdentityClient と _identity_config の AttributeError が出ているか。そして、修正が自分の利用している azure-ai-ml パッケージに取り込まれたバージョンかどうかです。

同期版の AzureMLOnBehalfOfCredential だけを使っている場合や、ローカル開発で DefaultAzureCredential を使っている場合は、今回の変更による直接影響は限定的です。一方で、Azure MLのトレーニングジョブからKey Vault、Storage、Azure AI系サービスなどへユーザーIDでアクセスし、さらに非同期処理を組み合わせている環境では、早めにログと依存パッケージを確認すべき更新です。

目次

Azure SDK documentation update: Fix async AzureMLOnBehalfOfCredential AttributeError on _identity_config の概要

今回の更新は、Azure SDK for Pythonの azure-ai-ml に含まれるAzure ML向け認証処理の修正です。対象になっているのは、AsyncManagedIdentityClient.request_token の内部実装です。GitHub PRでは、存在しない self._identity_config を参照していたため、非同期のOBO認証フローで AttributeError が発生すると説明されています。(GitHub)

修正内容は小さく見えますが、実務上の影響は大きくなり得ます。Azure MLジョブ内でユーザーIDを使って外部リソースへアクセスする処理は、データ取得、シークレット取得、特徴量ストア連携、ジョブ内からのSDK呼び出しなどで使われます。認証トークン取得の段階で例外が出ると、後続のAPI呼び出しはすべて失敗します。

確認項目内容
対象パッケージ主に azure-ai-ml のAzure ML認証まわり
対象処理非同期の AzureMLOnBehalfOfCredential / OBO認証経路
発生し得る例外AttributeError: 'AsyncManagedIdentityClient' object has no attribute '_identity_config'
影響しやすい環境Azure MLジョブ、identity: user_identity、非同期Azure SDKクライアントの組み合わせ
直接影響が小さい環境同期クライアントのみ、ローカル開発のみ、OBOを使わないサービスプリンシパル認証など

Microsoft Learnでは、AzureMLOnBehalfOfCredential はユーザーの代理で認証する資格情報であり、Azure Machine Learning ComputeまたはAzure Machine Learning Serverless Spark Computeのジョブ実行中に、ユーザーIDでジョブを実行する場合に使うものと説明されています。(Microsoft Learn)

何が変わったのか

PRで示されている主な修正は、非同期のトークン要求処理で呼び出すリクエスト生成処理の引数を見直した点です。修正前は、存在しない _identity_config を渡していました。

# 修正前のイメージ
request = self._request_factory(resource, self._identity_config)

修正後は、同期版の実装と同じく resource のみを渡す形に変更されています。PR上の差分でも、self._request_factory(resource, self._identity_config) から self._request_factory(resource) への変更が確認できます。(GitHub)

# 修正後のイメージ
request = self._request_factory(resource)

さらに修正ブランチの実装では、claims、tenant_id、enable_cae といった非対応のキーワード引数をトークン要求前に取り除く処理も確認できます。これは同期版の ManagedIdentityClient 側にも存在する考え方で、非同期版の挙動を同期版へ近づける意図が読み取れます。(GitHub)

変更点修正前修正後実務上の意味
リクエスト生成存在しない _identity_config を参照resource のみで生成AttributeError の原因を除去
同期版との整合性非同期版だけ異なる呼び出し同期版に近い処理同じOBO認証でも挙動差が小さくなる
非対応引数の扱いパイプラインへ渡る可能性事前に取り除く余計な引数による失敗を避けやすい

重要なのは、この修正が「Azure MLのOBO認証全体を新しくする変更」ではなく、「非同期実装の内部バグを直す変更」である点です。アプリ側の認証設計を全面的に変える必要はありませんが、該当する非同期処理を使っている場合は、依存パッケージの更新確認が必要です。

エラーの正体:RBACやネットワーク設定ではなくSDK内部の属性参照ミス

この不具合で典型的に出るエラーは、次のような内容です。

AttributeError: 'AsyncManagedIdentityClient' object has no attribute '_identity_config'

GitHub Issueでは、Azure MLジョブで非同期Azureクライアントを使いたい場面で、await credential.get_token("https://ai.azure.com/.default") を実行した際にこの例外が出るスタックトレースが報告されています。(GitHub)

ここで注意したいのは、_identity_config の AttributeError は、Key Vaultのアクセスポリシー不足やStorageのRBAC不足とは性質が異なるという点です。アクセス権限が不足している場合は、通常はトークン取得後のリソースアクセス時に403や権限エラーが出ます。一方、今回の問題はトークン要求を組み立てる前後でSDK内部の存在しない属性を参照して失敗します。

過去の別Issueでも、_identity_config が親クラスや子クラスで定義されていないため、AIO、つまり非同期実装のOBO資格情報でトークン取得に失敗する問題が報告されています。報告時の環境例には azure-ai-ml 1.26.0、Ubuntu、Python 3.11が含まれていました。(GitHub)

まず見るべきログ

Azure MLジョブの失敗ログで、次の文字列を検索してください。

_identity_config
AsyncManagedIdentityClient
AzureMLOnBehalfOfCredential
get_token failed

これらが同じスタックトレース内に出ている場合、まずSDK側の既知不具合として切り分けるのが効率的です。最初からKey Vaultのロール、StorageのACL、仮想ネットワーク、プライベートエンドポイントを疑うと、調査時間を無駄にしやすくなります。

影響を受ける可能性が高いユーザー

今回のAzure SDK更新で最も影響を受けるのは、Azure MLのリモートジョブ内で、ユーザーIDを使ったOBO認証と非同期処理を組み合わせている開発者です。

Microsoftのサンプルでは、AzureML OBOを使うにはジョブ定義でOBOを使うことを指定し、トレーニングスクリプト側で AzureMLOnBehalfOfCredential を使う必要があると説明されています。ジョブ定義では identity: type: user_identity を追加する例が示されています。(Microsoft Learn)

影響度該当するケース対応の優先度
高Azure MLジョブで identity: user_identity を指定し、非同期Azure SDKクライアントを使っているすぐにログと依存バージョンを確認
高ジョブ内でOBO認証を使い、_identity_config の AttributeError が出ている修正取り込み済みバージョンの確認が必要
中今は同期処理だが、今後aioクライアントへ移行予定移行前の検証項目に追加
低同期版 AzureMLOnBehalfOfCredential のみを利用直接影響は限定的
低DefaultAzureCredential、サービスプリンシパル、マネージドIDのみを利用今回の不具合とは別系統

具体的には、次のような処理をAzure MLジョブ内で実行している場合に注意が必要です。

# 同期版の代表的な利用例
from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
from azure.keyvault.secrets import SecretClient

credential = AzureMLOnBehalfOfCredential()
secret_client = SecretClient(
    vault_url="https://my-key-vault.vault.azure.net/",
    credential=credential
)

secret = secret_client.get_secret("secret-name")

上記はMicrosoft LearnのOBOサンプルと同じ考え方です。OBOを使うと、リモートジョブ内のトレーニングスクリプトからユーザーのMicrosoft Entra IDを利用でき、ローカルでアクセスできるリソースにリモートジョブからもアクセスできると説明されています。(Microsoft Learn)

ただし、今回の問題は主に非同期経路です。同期版のサンプルが動いているからといって、同じ認証情報を非同期クライアントへ渡した場合も必ず安全とは限りません。

影響範囲を判断するチェックリスト

自分の環境が対象かどうかは、次の順番で確認すると切り分けやすくなります。

Azure MLジョブでユーザーIDを使っているか確認する

ジョブ定義、コンポーネント定義、パイプライン定義に次の設定があるか確認します。

identity:
  type: user_identity

この設定がない場合、今回のOBO認証経路を使っていない可能性があります。ただし、別の場所で同等の設定をしている場合もあるため、ジョブ送信コードやYAMLテンプレートも確認してください。

非同期クライアントを使っているか確認する

Pythonコード内で次のような要素を探します。

async def
await
asyncio.run
azure.*.aio
get_token(...)

特に、Key Vault、Storage、Event Hubs、Azure AI系サービスなどのaioクライアントをAzure MLジョブ内で使っている場合は注意が必要です。Issueで報告された再現例でも、非同期処理の中で credential.get_token() を待機した際に _identity_config の例外が出ています。(GitHub)

azure-ai-ml のバージョンを確認する

Azure MLの実行環境内で、実際に使われている azure-ai-ml のバージョンを確認します。ローカル端末のバージョンではなく、ジョブのDockerイメージやConda環境内のバージョンを見ることが重要です。

python -m pip show azure-ai-ml
python -m pip freeze | grep azure-ai-ml

Azure SDKのリリース一覧では、Azure SDK for Pythonの各パッケージについてPyPI、コード、ドキュメントへのリンクが整理されています。azure-ai-ml がどのバージョンで配布されているかは、リリース一覧やPyPIで確認できます。(Azure)

ここで注意すべき点は、GitHubのPRが存在することと、修正済みパッケージがPyPIに公開されていることは同じではないという点です。PRがOpenの段階では、利用中の配布パッケージに修正が含まれているとは限りません。対象PRは確認時点でOpenとして表示され、マージにはレビューが必要な状態でした。(GitHub)

移行・設定確認でやるべきこと

今回の更新に対する実務対応は、「すぐにコードを書き換える」よりも「該当条件を確認し、修正済みバージョンへ安全に移行する」ことが中心です。

手順作業判断基準
1失敗ログを確認_identity_config の AttributeError があるか
2ジョブ定義を確認identity: user_identity を使っているか
3非同期処理を確認aioクライアントや await credential.get_token() があるか
4パッケージ確認Azure ML実行環境内の azure-ai-ml バージョンを確認
5修正取り込み状況を確認リリースノート、PR、PyPIを確認
6検証環境で再実行トークン取得と実リソースアクセスを確認
7本番反映イメージ再ビルド、Conda環境更新、ジョブ再実行

修正済みバージョンが出るまでの回避策

修正済みパッケージをすぐに利用できない場合は、次の回避策を検討します。

回避策向いているケース注意点
同期クライアントへ一時的に戻すKey Vaultから少数のシークレットを読む程度並列I/O性能は落ちる可能性がある
非同期OBO認証に依存する処理を分離する一部の処理だけが失敗しているパイプライン設計の見直しが必要
修正済みパッケージの公開を待ってアップグレード本番環境で安定性を重視する公開バージョンとリリースノートを必ず確認
SDK内部ファイルを独自パッチする緊急対応で、環境を厳密に管理できる長期運用には不向き。将来のSDK更新で衝突しやすい

最も安全なのは、修正が正式リリースされた azure-ai-ml に更新し、Azure MLの実行環境を再ビルドして検証する方法です。Azure MLではジョブ環境のキャッシュやDockerイメージに古いパッケージが残ることがあるため、pip install -U だけでなく、実行ログで実際のバージョンを出力するのが確実です。

import azure.ai.ml
import importlib.metadata

print("azure-ai-ml:", importlib.metadata.version("azure-ai-ml"))

アップグレード時の注意点

CondaファイルやDockerfileの固定バージョンを確認する

Azure MLジョブでは、conda.yaml やDockerfileにパッケージバージョンが固定されていることがあります。

dependencies:
  - python=3.10
  - pip
  - pip:
      - azure-ai-ml==1.xx.x
      - azure-identity
      - azure-keyvault-secrets

修正済みバージョンへ移行する場合は、単にローカルでアップグレードするのではなく、ジョブ実行環境の定義ファイルを更新する必要があります。

dependencies:
  - python=3.10
  - pip
  - pip:
      - azure-ai-ml==<修正を含むバージョン>
      - azure-identity
      - azure-keyvault-secrets

バージョンを未指定にすると、その時点の最新版が入るため一見便利です。しかし本番環境では再現性が落ちます。検証環境で動作確認したバージョンを固定し、CIやジョブログでバージョンを出力する運用が安全です。

内部モジュールへの依存を見直す

今回の問題は _aio や _internal を含む内部実装で発生しています。Azure SDKでは、先頭にアンダースコアが付くモジュールやクラスは、一般に公開APIとして長期互換性が保証されにくい領域です。

既存コードが内部の非同期資格情報クラスを直接importしている場合は、次の観点で見直してください。

確認点理由
public APIで代替できるか内部APIは変更されやすい
importパスに _internal や _aio._credentials が含まれるか破壊的変更の影響を受けやすい
SDKのリリースノートでサポート対象になっているか長期運用の判断材料になる
失敗時に同期版へ戻せる設計か本番障害時の回避策になる

非同期処理が必須でない場合は、OBO認証まわりだけ同期クライアントで扱い、重いI/O処理だけ別の方法で並列化する設計も現実的です。

スコープは1回に1つだけ指定する

AzureMLOnBehalfOfCredential.get_token は、アクセストークンを要求するメソッドです。Microsoft Learnでは、この資格情報は1回のリクエストにつき1つのスコープのみ許可すると説明されています。(Microsoft Learn)

そのため、複数サービスへアクセスする場合は、サービスごとに適切なスコープでトークン取得やクライアント初期化を行う必要があります。

# 例:Key Vault
"https://vault.azure.net/.default"

# 例:Azure Storage
"https://storage.azure.com/.default"

複数のスコープを一度に渡して失敗した場合、今回の _identity_config 問題とは別の原因になります。ログの例外名とスタックトレースを分けて確認してください。

SDK不具合と設定ミスを切り分ける

Azure MLの認証エラーは、SDK不具合、ジョブ設定、権限不足、実行環境の違いが混ざりやすい領域です。次の表を使うと、最初の切り分けがしやすくなります。

症状可能性が高い原因最初に確認すること
AsyncManagedIdentityClient に _identity_config がない今回の非同期OBO認証バグazure-ai-ml のバージョン、修正取り込み状況
CredentialUnavailableErrorOBOを利用できる実行環境ではないAzure ML Compute / Serverless Spark上のジョブか
No token receivedOBOエンドポイントやジョブID設定の問題identity: user_identity、実行場所、ジョブログ
リソースアクセス時の403トークン取得後の権限不足Key Vault、Storage、Azure RBACの割り当て
ローカルでは成功、Azure MLジョブで失敗ローカル認証とジョブ内OBO認証の違い実行環境内の資格情報とパッケージバージョン

特に、_identity_config の AttributeError が出ている場合は、RBACを調整しても解消しない可能性が高いです。まずSDKの修正状況を確認し、その後に権限やネットワークを調査する順番にしてください。

実務で使える最小検証手順

本番ジョブをいきなり更新する前に、最小構成の検証ジョブを作ると安全です。

検証ジョブで確認する内容

検証項目期待する結果
azure-ai-ml のバージョン出力想定した修正済みバージョンが表示される
OBO資格情報の初期化例外なく作成できる
トークン取得_identity_config の例外が出ない
実リソースアクセスKey VaultやStorageにアクセスできる
ログトークン文字列を出力していない

ジョブ内でトークンそのものをprintするのは避けてください。検証では、トークンの取得成功、期限、対象リソースへの疎通結果だけを出力するのが安全です。

import importlib.metadata

print("azure-ai-ml:", importlib.metadata.version("azure-ai-ml"))

# 実際の検証では、トークン文字列をログに出さない
print("OBO credential test started")

検証後に本番へ反映する流れ

  1. 検証用Azure ML環境で azure-ai-ml の修正済みバージョンを固定する
  2. 最小ジョブでOBO認証と対象リソースアクセスを確認する
  3. 既存パイプラインのうち、非同期Azure SDKクライアントを使う箇所だけを先に検証する
  4. 本番用DockerイメージまたはConda環境を再ビルドする
  5. 本番ジョブの最初にパッケージバージョンをログ出力する
  6. _identity_config、CredentialUnavailableError、403を分けて監視する

この流れにすると、SDK修正の効果と環境設定の問題を混同しにくくなります。

今回の更新で対応すべき人・様子見でよい人

立場対応方針
Azure MLジョブで非同期クライアントを使って失敗中すぐにPR・リリース状況と依存バージョンを確認
これからAzure MLでaioクライアントを使う予定検証項目に _identity_config エラー確認を追加
同期版OBOでKey Vaultなどにアクセスしている既存動作を確認しつつ、急な変更は不要
OBOを使わずサービスプリンシパル認証を使っている今回の修正による直接対応は不要
SDK内部モジュールを直接importしている長期運用リスクとしてpublic APIへの移行を検討

今回のAzure SDK documentation updateは、変更行数だけを見ると小さな修正です。しかし、Azure MLジョブ内のOBO認証は、シークレット取得、データアクセス、外部Azureサービス連携の入口になります。非同期処理でここが失敗すると、アプリケーション側の処理は正常でもジョブ全体が止まります。

まずはAzure MLジョブのログで _identity_config を検索してください。該当するエラーがある場合は、権限設定を変更する前に、azure-ai-ml のバージョンと修正取り込み状況を確認します。そのうえで、修正済みバージョンへの更新、実行環境の再ビルド、最小ジョブでのトークン取得テストを行うのが最短の対応ルートです。

この記事を書いた人

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

コメント

コメントする

目次