2026年4月より前に、初期パブリックプレビュー版でデプロイしたMicrosoft Foundry Agent ServiceのHosted Agentは、2026年8月20日で旧ホスティングバックエンドのサポートが終了します。既存デプロイは自動移行されません。
サービスを停止させずに移行するには、旧Hosted Agentを稼働させたまま、新しいプロトコルライブラリ、API、専用Entra ID、azure.yamlを使って新バックエンドへ並行デプロイします。その後、新バージョンがactiveになり、機能テストに合格したことを確認してから、アプリケーションの接続先を切り替えるのが安全です。SDKだけを更新しても移行は完了しません。(Microsoft Learn)
まず結論:旧Hosted Agentは自動移行されない
今回の対応は、既存環境に対するインプレース更新ではありません。
必要なのは、次の流れです。
- 現在のHosted Agent、呼び出し元、権限、ツール構成を棚卸しする
- 新しいプロトコルライブラリに合わせてコードを変更する
- API呼び出しを専用エージェントエンドポイント方式へ変更する
azure.yamlを新形式へ更新する- 新バックエンドへHosted Agentを再デプロイする
- 新しいエージェント専用Entra IDへRBACを付与する
- ステータスが
activeになったことを確認する - 機能テスト後に呼び出し先を切り替える
- 問題がなければ旧デプロイを廃止する
停止時間を避けたい場合は、旧環境を先に削除したり、同じ本番エージェントへいきなりazd deployしたりしてはいけません。新旧を一時的に並行稼働させるブルーグリーン方式が最も安全です。
なお、2026年8月20日はサポート期限です。その時刻に必ず即時停止するとは限りませんが、旧バックエンドが継続稼働することを前提に運用計画を立てるべきではありません。
移行対象かを判定する
Microsoftの移行ガイドは、主に次のHosted Agentを対象としています。
- 2026年4月より前にデプロイした
azure-ai-agentserver-agentframeworkを使用しているazure-ai-agentserver-langgraphを使用している- 初期プレビュー版のホスティングAPIをカスタムコードから呼び出している
- 共有プロジェクトエンドポイントへ
agent_referenceを渡している az cognitiveservices agent startやstopを実行しているagent.manifest.yamlまたは単独のagent.yamlを使用している- Capability Hostを明示的に作成している
一つでも該当する場合は、今回の移行対象として調査を進める必要があります。Microsoftは、旧バックエンド上のエージェントを自動では新バックエンドへ移行しないと明記しています。(Microsoft Learn)
注意
ここでいうHosted Agentは、Microsoft Foundry Agent ServiceのHosted Agentです。Azure DevOpsやAzure PipelinesのMicrosoft-hosted agentとは別のサービスです。
2026年4月以降にデプロイしたエージェントでも、コンテナープロトコル1.0.0を使用している場合は確認が必要です。現在のランタイム契約では2.0.0が現行で、1.0.0は非推奨とされています。(Microsoft Learn)
新バックエンドで変わるポイント
旧Hosted Agentと新しい仕組みでは、単に実行基盤が変わるだけではありません。エンドポイント、ID、プロトコル、セッション、管理APIも変更されます。
| 項目 | 初期プレビュー版 | 新しいバックエンド |
|---|---|---|
| コンピュート管理 | 手動で開始・停止・レプリカ管理 | リクエスト時に自動起動し、アイドル後に自動解放 |
| 実行分離 | 従来のホスティング方式 | セッション単位のサンドボックス |
| ライブラリ | フレームワーク別アダプター | プロトコル別ライブラリ |
| エンドポイント | 共有プロジェクトエンドポイント | エージェントごとの専用エンドポイント |
| 呼び出し方法 | agent_referenceを本文に指定 | agent_nameにバインドしたクライアント |
| 実行ID | プロジェクトのマネージドIDを共有 | エージェントごとの専用Entra ID |
| 構成ファイル | agent.manifest.yaml、agent.yaml | 単一のazure.yaml |
| ツール定義 | create_versionのtools | Foundry ToolboxをMCP経由で使用 |
| ステータス | Stopped、Startedなど | creating、active、failedなど |
| CLI | az cognitiveservices agent | azd ai agentまたはREST API |
新バックエンドでは、コンピュートはリクエスト到着時に自動で用意され、15分間使用されないと自動的に解放されます。そのため、従来のstart、stop、最小・最大レプリカ設定を移植する必要はありません。(Microsoft Learn)
「v1」「1.0.0」「2.0.0」を混同しない
今回の移行では、複数種類の「バージョン」が登場します。ここを混同すると、正しい設定を書き換えてしまうことがあります。
| 表記例 | 意味 |
|---|---|
api-version=v1 | Foundry Agent ServiceのREST APIバージョン |
protocols[].version: "2.0.0" | Hosted Agentコンテナーのランタイムプロトコル |
agent_version="3" | デプロイしたエージェントのバージョン番号 |
旧ProtocolVersionRecord(..., version="v1") | 初期プレビューで使われていた古いプロトコル表記 |
REST APIのクエリに指定するapi-version=v1は、コンテナープロトコルの旧"v1"とは別物です。REST API側のv1を2.0.0に置き換えてはいけません。(Microsoft Learn)
また、Microsoftの移行ページには、旧"v1"をセマンティックバージョン形式の"1.0.0"へ変更する例が残っています。一方、同じページではコンテナープロトコル1.0.0を非推奨とし、現行の2.0.0への移行を案内しています。最新のazure.yamlリファレンスも2.0.0を使用しています。
したがって、これから新バックエンドへ再デプロイする場合は、最新のazd ai agent initが生成する設定を基準に、コンテナープロトコル2.0.0を採用するのが安全です。古い記事やサンプルの1.0.0をそのままコピーしないようにしてください。(Microsoft Learn)
停止させないための推奨構成
停止時間を避けるには、旧Hosted Agentを残したまま、新Hosted Agentを別名でデプロイします。
利用アプリケーション
|
| 接続先を設定値で切り替え
|
+-- 旧Hosted Agent
| 旧バックエンド
| 現在の本番処理を継続
|
+-- 新Hosted Agent
新バックエンド
active確認・移行テスト
新しいエージェント名の例は次のとおりです。
旧:customer-support-agent
新:customer-support-agent-vnext
アプリケーション側では、エージェント名やエンドポイントをコードへ直接埋め込まず、Azure App Configuration、Key Vault、環境変数などで切り替えられるようにします。
別名で再デプロイするメリット
別名でデプロイすると、次のリスクを抑えられます。
- 新デプロイが失敗しても旧環境へ影響しない
- RBACを本番切り替え前に検証できる
- 新旧APIの呼び出し方法を並行してテストできる
- 切り替え後も設定を戻すだけでロールバックできる
azd deployによる意図しないバージョン切り替えを避けられる- 旧セッションと新セッションを分けて管理できる
特に、azd deployは新しいエージェントバージョンを作成し、最新バージョンを既定でアクティブにします。同一エージェント名で安全に切り替えたい場合は、SDKまたはREST APIでバージョンを作成し、active確認後に明示的にルーティングを変更する方法が適しています。(Microsoft Learn)
Foundry側では段階的なトラフィック分割ができない
Foundry Agent Serviceのエンドポイントは、一つのエージェントバージョンへ100%のトラフィックをルーティングします。バージョン間の10%、50%といった重み付き分割はサポートされていません。(Microsoft Learn)
段階移行を行う場合は、次のいずれかで制御します。
- 呼び出し元アプリケーションの機能フラグ
- Azure API Management
- 独自のバックエンドルーター
- ユーザー、テナント、部署単位の設定
- 新規セッションだけを新エージェントへ送るセッションルーティング
ツールがデータ更新、メール送信、チケット作成などの副作用を伴う場合、同じリクエストを新旧両方へ送るシャドーテストは避けてください。二重登録や二重通知が発生する可能性があります。
停止ゼロとセッション継続は別に考える
ブルーグリーン移行により、サービスそのものの停止は避けられます。ただし、既存の会話履歴やセッションファイルが新バックエンドへ自動的に引き継がれるとは限りません。
新バックエンドは、セッション単位のサンドボックスと、ターンやアイドル期間をまたいで維持される$HOMEおよび/filesを採用しています。一方、旧デプロイは自動移行されないため、既存セッションを新エージェントでそのまま再開できる前提にはしない方が安全です。(Microsoft Learn)
実務上は、次のどちらかを選びます。
- 既存セッションは旧エージェントで終了させ、新規セッションから新エージェントへ送る
- 切り替え日時を区切り、それ以降は新しい会話セッションとして開始する
長時間継続する業務セッションがある場合は、セッションIDとバックエンドの対応を呼び出し元で保持する設計が必要です。
移行前に棚卸しする項目
コード修正を始める前に、現在の構成を記録します。
| 確認対象 | 記録する内容 | 移行で必要になる理由 |
|---|---|---|
| エージェント | 名前、バージョン、作成日 | 移行対象の判定とロールバック |
| 呼び出し先 | プロジェクトエンドポイント、APIパス | 専用エンドポイントへの変更 |
| SDK | パッケージ名、バージョン、ロックファイル | 削除されたアダプターの特定 |
| エントリーポイント | main.py、起動コマンド | 新しいHostServerへの変更 |
| 構成ファイル | azure.yaml、agent.yaml、マニフェスト | 単一azure.yamlへの統合 |
| コンテナー | Dockerfile、イメージタグ、CPU、メモリ | linux/amd64での再ビルド |
| ID | プロジェクトのマネージドID | 専用エージェントIDへの権限移行 |
| RBAC | Storage、Cosmos DB、Key Vaultなど | 新IDへの再付与 |
| ツール | MCP、検索、独自API | Toolbox経由への変更確認 |
| 状態管理 | 会話履歴、セッション、ファイル | セッション継続方法の判断 |
| CI/CD | start、stop、updateなどのコマンド | 削除済みCLIの置換 |
| 監視 | Application Insights、ログ、アラート | 新旧比較と切り替え判断 |
| ネットワーク | ACR、Private Endpoint、Firewall | イメージ取得失敗の防止 |
| 呼び出し元 | Webアプリ、バッチ、Teams Botなど | 接続先切り替え対象の把握 |
コンテナーイメージについては、現在稼働しているイメージのタグだけでなく、可能であればダイジェストも記録します。latestのような可変タグだけでは、問題発生時に同じイメージへ戻せません。
旧Foundry Hosted Agentを新バックエンドへ再デプロイする手順
移行用ブランチとベースラインを作成する
本番ブランチへ直接変更を加えず、移行専用ブランチを作成します。
git switch -c migrate-foundry-hosted-agent
移行前に、次の結果を保存しておきます。
- 正常系の代表的な質問と応答
- ツール呼び出し結果
- 主要なエラー応答
- 会話履歴を利用する複数ターンの応答
- 現在の応答時間
- 現在のエラー率
- 外部リソースへの読み書き結果
生成AIの応答文を一字一句一致させる必要はありません。業務要件、ツール選択、出力形式、データ更新結果が同等かを比較します。
SDK、Azure Developer CLI、Azure CLIを更新する
現行ドキュメントでは、次のバージョンが前提です。
- Azure AI Projects SDK:
2.3.0以上 - Azure Developer CLI:
1.23.0以上 - Azure CLI:
2.80以上 - Foundry agents拡張:最新の
azure.ai.agents
python -m pip install -U "azure-ai-projects>=2.3.0" azure-identity
azd ext install azure.ai.agents
azd version
az version
Microsoftの移行ページ末尾のチェックリストにはazure-ai-projects 2.1.0以上という表記もありますが、同じページの前提条件と現行のデプロイ・管理ドキュメントは2.3.0以上を要求しています。実務では、より新しい要件である2.3.0以上にそろえるのが安全です。(Microsoft Learn)
更新後は、requirements.txt、pyproject.toml、poetry.lockなどの依存関係ファイルも更新し、開発端末だけが新しい状態にならないようにします。
プロトコルライブラリとエントリーポイントを変更する
フレームワークによって変更方法が異なります。
| 利用形態 | 旧構成 | 新構成 |
|---|---|---|
| Microsoft Agent Framework | azure-ai-agentserver-agentframework | 更新版Agent Frameworkとagent-framework-foundry-hosting |
| LangGraph | azure-ai-agentserver-langgraph | azure-ai-agentserver-responses |
| 独自チャットエージェント | フレームワーク固有アダプター | azure-ai-agentserver-responses |
| Webhook・任意JSON処理 | 独自HTTP実装 | azure-ai-agentserver-invocations |
| .NET Responses | Azure.AI.AgentServer.AgentFramework | Azure.AI.AgentServer.Responses |
| .NET Invocations | Azure.AI.AgentServer.AgentFramework | Azure.AI.AgentServer.Invocations |
Microsoft Agent Frameworkの場合
主な変更点は次のとおりです。
AzureAIAgentClientをFoundryChatClientへ変更ChatAgentをAgentへ変更@ai_functionを@toolへ変更from_agent_framework(agent).run()をResponsesHostServer(agent).run()へ変更- プラットフォーム側で履歴を管理するため
store=False相当を設定
概念的には、次のようにエントリーポイントを変更します。
from agent_framework_foundry_hosting import ResponsesHostServer
agent = Agent(
client=client,
instructions="You are a helpful assistant.",
tools=tools,
default_options={"store": False},
)
ResponsesHostServer(agent).run()
LangGraphの場合
LangGraphのグラフ定義やツールロジックは基本的に維持できますが、ホスティング部分を変更します。
azure-ai-agentserver-langgraphを削除azure-ai-agentserver-responsesを追加from_langgraph(graph).run()を廃止ResponsesAgentServerHostへハンドラーを登録context.get_history()で会話履歴を取得- 必要に応じてLangChainのメッセージ形式へ変換
履歴を変換せずに現在のユーザー入力だけをグラフへ渡すと、移行後に複数ターン会話が成立しなくなるため注意が必要です。
独自コードの場合
通常の会話型エージェントは、Responsesプロトコルを選びます。
from azure.ai.agentserver.responses import (
ResponsesAgentServerHost,
TextResponse,
)
app = ResponsesAgentServerHost()
@app.response_handler
async def handle(request, context, cancellation_signal):
text = await context.get_input_text()
return TextResponse(context, request, text=f"Echo: {text}")
app.run()
Webhookや独自JSONをそのまま受け渡す処理では、InvocationAgentServerHostを使用します。Responsesプロトコルは会話履歴を管理しますが、Invocationsプロトコルでは状態管理をアプリケーション側で実装します。(Microsoft Learn)
azure.yamlを新形式へ統合する
旧構成で使われていたagent.manifest.yamlと単独のagent.yamlは非推奨です。新しい構成では、プロジェクト、モデル、接続、Toolbox、Hosted Agentの定義をルートのazure.yamlへ統合します。(Microsoft Learn)
移行時は、旧ファイルを手作業で継ぎ足すよりも、最新の拡張機能でひな型を生成し、現在の設定を移植する方が安全です。
azd ai agent init
Hosted Agent部分の最小構成例は次のとおりです。
services:
my-agent-vnext:
host: azure.ai.agent
project: src/my-agent
language: docker
uses:
- ai-project
kind: hosted
name: my-agent-vnext
protocols:
- protocol: responses
version: "2.0.0"
startupCommand: python main.py
env:
MODEL_DEPLOYMENT_NAME: ${AZURE_AI_MODEL_DEPLOYMENT_NAME}
container:
resources:
cpu: "1.0"
memory: 2Gi
ai-projectは、同じazure.yaml内で定義したazure.ai.projectサービス名です。既存のFoundryプロジェクトを再利用する場合は、そのプロジェクトへ接続する構成にします。
FOUNDRY_PROJECT_ENDPOINTはホスティングプラットフォームが自動注入するため、envで上書きしないでください。誤ったエンドポイントを設定すると、ローカルでは動作してもHosted Agent上でモデルへ接続できなくなる可能性があります。(Microsoft Learn)
コンテナープロトコル2.0.0へ対応する
コンテナープロトコル2.0.0では、リクエストごとのユーザー情報とFoundry呼び出し情報がヘッダーで渡されます。
| ヘッダー | 用途 |
|---|---|
x-agent-user-id | ユーザーごとの保存データを分離するための識別子 |
x-agent-foundry-call-id | Foundryサービスへの下流呼び出しで転送する識別子 |
公式SDKアダプターを通じてStorage、Toolbox、他のエージェントなどを呼び出す場合、x-agent-foundry-call-idは自動的に処理されます。独自のHTTPクライアントでFoundryサービスを呼び出す場合は、受信した値を解析せず、そのまま下流リクエストへ転送します。(Microsoft Learn)
複数ユーザーが一つのセッションを共有する可能性がある場合、保存データのキーにはセッションIDだけでなくx-agent-user-idも含めます。
悪い例:
session_id/notes.json
推奨例:
user_id/session_id/notes.json
ローカル実行時には、これらのヘッダーが存在しない場合があります。ヘッダーがないと例外になる実装ではなく、ローカル用の代替値を扱えるようにします。
独自の追加ヘッダーをコンテナーへ渡したい場合は、x-client-で始まる名前を使用します。許可リスト外の任意ヘッダーやAuthorizationヘッダーは、そのままコンテナーへ転送されません。(Microsoft Learn)
呼び出しAPIを専用エンドポイント方式へ変更する
旧方式では、共有プロジェクトエンドポイントを使用し、リクエスト本文へagent_referenceを追加していました。
openai_client = project.get_openai_client()
response = openai_client.responses.create(
input="Hello",
extra_body={
"agent_reference": {
"name": "my-agent",
"type": "agent_reference",
}
},
)
新方式では、クライアント作成時にエージェント名を指定します。
openai_client = project.get_openai_client(
agent_name="my-agent-vnext"
)
response = openai_client.responses.create(
input="Hello"
)
print(response.output_text)
SDKがエージェント専用エンドポイントへバインドするため、extra_bodyのagent_referenceは不要です。(Microsoft Learn)
REST APIからResponsesプロトコルを呼び出す場合は、次の形式の専用ルートを使用します。
{project_endpoint}/agents/{agent_name}/endpoint/protocols/openai/responses
Invocationsプロトコルの場合は、次のルートです。
{project_endpoint}/agents/{agent_name}/endpoint/protocols/invocations
初期プレビューで使われていたFoundry-Features: HostedAgents=V1Previewヘッダーは、現行のv1 APIとazure-ai-projects 2.3.0以降では通常不要です。古いヘッダーを付けたままにする場合も、削除後の動作をテストしてから整理します。(Microsoft Learn)
削除された管理処理を取り除く
次のCLIやAPIをCI/CDへ残してはいけません。
| 旧処理 | 新バックエンドでの対応 |
|---|---|
az cognitiveservices agent start | 不要。リクエスト時に自動起動 |
az cognitiveservices agent stop | 不要。アイドル後に自動解放 |
agent update --min-replicas | 削除。セッションベースで自動スケール |
agent update --max-replicas | 削除。セッションベースで自動スケール |
delete-deployment | 対象バージョンを削除 |
list-versions | az restまたはSDKを使用 |
| Capability Host作成 | 削除。プラットフォームが自動管理 |
create_versionのtools | Foundry ToolboxをMCP経由で使用 |
旧スクリプトのstartが失敗するからといって、新エージェントのデプロイに失敗したとは限りません。新バックエンドでは、そもそも開始コマンドを実行しない設計です。
専用Entra IDへRBACを付け直す
IDモデルの変更は、移行で最も401、403エラーが起きやすい部分です。
初期プレビューでは、プロジェクトのマネージドIDが実行時IDとして使用されていました。新バックエンドでは、Hosted Agentごとに専用のMicrosoft Entra IDサービスプリンシパルがデプロイ時に作成されます。
したがって、プロジェクトのマネージドIDに付けた権限は、新しいエージェントIDへ自動的には移りません。Azure Storage、Cosmos DB、Key Vault、Azure AI Searchなどへアクセスする場合は、新エージェントIDへ必要なRBACを付与します。(Microsoft Learn)
一方、プロジェクトのマネージドIDは、引き続きAzure Container Registryからコンテナーイメージを取得するためのインフラストラクチャIDとして使用されます。
整理すると、次のようになります。
| ID | 主な役割 |
|---|---|
| プロジェクトのマネージドID | ACRからのコンテナーイメージ取得など |
| エージェント専用Entra ID | モデル、Storage、Cosmos DB、Toolboxなどの実行時アクセス |
| デプロイ実行者 | Hosted Agentの作成・更新 |
Hosted Agentをデプロイするユーザーまたはサービスプリンシパルには、プロジェクトスコープのFoundry Project Managerロールが必要です。旧名称のAzure AI Project Managerが画面に残っている場合がありますが、ロール名称変更中の表示差です。(Microsoft Learn)
エージェントIDを取得する
新Hosted Agentの初回デプロイ後、REST APIからinstance_identity.principal_idを取得できます。
ACCOUNT_NAME="<foundry-account-name>"
PROJECT_NAME="<project-name>"
AGENT_NAME="my-agent-vnext"
BASE_URL="https://${ACCOUNT_NAME}.services.ai.azure.com/api/projects/${PROJECT_NAME}"
AGENT_IDENTITY=$(az rest \
--method GET \
--url "${BASE_URL}/agents/${AGENT_NAME}?api-version=v1" \
--resource "https://ai.azure.com" \
--query "instance_identity.principal_id" \
--output tsv)
echo "${AGENT_IDENTITY}"
Foundry Agent Serviceのデータプレーンをaz restで呼び出す場合は、--resource "https://ai.azure.com"が必要です。省略すると、正しいトークンの対象リソースを判定できず、認証エラーになることがあります。 (Microsoft Learn)
外部リソースへRBACを付与する
たとえば、Storage Blobの読み書きを許可する場合は次のようにします。
az role assignment create \
--assignee-object-id "${AGENT_IDENTITY}" \
--assignee-principal-type ServicePrincipal \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"
エージェントIDはサービスプリンシパルであるため、--assignee-principal-type ServicePrincipalを指定すると、Microsoft Graphによる名前解決に依存せず割り当てられます。(Microsoft Learn)
すべての外部リソースへ広い権限を付けるのではなく、必要なリソーススコープと操作に限定してください。
新バックエンドへ並行デプロイする
構成変更が完了したら、新しいエージェント名でデプロイします。
azd auth login
azd up
Azureリソースがすでに用意され、コード変更だけをデプロイする場合は、次のコマンドを使用します。
azd deploy
azd deployはコンテナーをビルドしてレジストリへ登録し、新しいHosted Agentバージョンを作成します。以前のバージョンは保持されます。(Microsoft Learn)
ローカルでイメージを作成する場合は、必ずlinux/amd64を指定します。
docker build \
--platform linux/amd64 \
-t myregistry.azurecr.io/my-agent:vnext-20260723 \
.
Hosted Agentのホスティング基盤はx86_64イメージを要求します。Apple SiliconやARM環境でプラットフォーム指定を省略すると、ローカルではビルドできてもHosted Agent上で起動できないことがあります。また、ロールバックを可能にするため、:latestではなく一意のタグまたはダイジェストを使用します。(Microsoft Learn)
古いプロジェクトとプライベートACRの組み合わせに注意する
2026年6月25日より前に作成されたFoundryプロジェクトでは、Hosted Agentが利用するAzure Container Registryを、プライベートエンドポイントだけで到達させる構成に制約があります。
同じ旧プロジェクトを再利用する場合、ACRのパブリックネットワークアクセスを完全に無効化していると、プラットフォームがイメージを取得できない可能性があります。対象プロジェクトの作成日、ACRの公開設定、Firewall、Private Endpointをデプロイ前に確認してください。(Microsoft Learn)
active状態とログを確認する
デプロイ後は、エージェントバージョンがactiveになるまでステータスを確認します。
azd ai agent show --output table
主な状態は次のとおりです。
| ステータス | 意味 |
|---|---|
creating | インフラストラクチャを準備中 |
active | リクエストを処理できる状態 |
failed | デプロイまたは起動に失敗 |
deleting | バージョンを削除中 |
deleted | 削除済み |
failedになった場合は、ログを確認します。
azd ai agent monitor
スモークテストも実行します。
azd ai agent invoke \
--input "移行確認です。利用可能な機能を簡潔に回答してください。"
activeは、バージョンがリクエストを処理できる状態であることを示します。ただし、新バックエンドはコンピュートを常時稼働させる方式ではありません。アイドル状態からの最初のリクエストでは、後続リクエストより応答に時間がかかる可能性があります。
切り替え直前にスモークテストを実行し、コールドスタート時と連続呼び出し時の両方を確認してください。
本番切り替え前に実施するテスト
単に一度回答が返ればよいわけではありません。次のテストを実施します。
| テスト | 確認内容 |
|---|---|
| 単一ターン | 基本的な質問に回答できる |
| 複数ターン | 過去の発言を参照できる |
| ストリーミング | 途中応答が正しく配信される |
| ツール呼び出し | 正しいツールと引数が選択される |
| MCP | Toolboxや外部MCPへ接続できる |
| Storage | 読み書きとユーザー分離が正しい |
| Cosmos DB | 専用IDでアクセスできる |
| Key Vault | 必要なシークレットだけ取得できる |
| ファイル | セッションファイルを保存・取得できる |
| 認証 | 正常ユーザーと未許可ユーザーを区別できる |
| 同時実行 | 複数ユーザーの情報が混ざらない |
| エラー処理 | タイムアウトや外部API障害を処理できる |
| 副作用 | 二重登録や二重送信が起きない |
| ログ | Application Insightsへ記録される |
| 応答性能 | 旧環境から許容できない悪化がない |
特にx-agent-user-idを利用するエージェントでは、ユーザーAの保存データをユーザーBが取得できないことを明示的に検証します。
Agent FrameworkやResponses APIでモデル側のstoreも有効にすると、プラットフォームの履歴管理と二重になる可能性があります。新しいサンプルに合わせてstore=Falseを基本とし、会話履歴の管理場所を一つに統一します。(Microsoft Learn)
本番トラフィックを切り替える
新Hosted Agentがactiveになり、テストに合格したら、呼び出し元の設定を変更します。
たとえば、環境変数で切り替える場合は次のようにします。
移行前:
FOUNDRY_AGENT_NAME=customer-support-agent
移行後:
FOUNDRY_AGENT_NAME=customer-support-agent-vnext
エンドポイントを直接管理している場合は、専用エージェントエンドポイントへ変更します。
安全な切り替え順序は次のとおりです。
- 新エージェントへスモークテストを送る
- 社内ユーザーや検証テナントだけを新エージェントへ送る
- 401、403、404、5xx、ツール失敗率を確認する
- 新規セッションを新エージェントへ送る
- 全トラフィックを新エージェントへ切り替える
- 旧エージェントへの新規リクエストがないことを確認する
- 一定期間、旧環境をロールバック先として保持する
- 問題がなければ旧デプロイを廃止する
旧方式と新方式ではリクエスト形式が異なるため、複数の呼び出し元がある場合は、各アプリを直接変更するより、共通の呼び出しアダプターを用意した方が安全です。
def get_agent_client(project, use_vnext: bool):
agent_name = (
"customer-support-agent-vnext"
if use_vnext
else "customer-support-agent"
)
return project.get_openai_client(agent_name=agent_name)
実際には旧方式がagent_referenceを必要とするため、旧用と新用の実装を分け、機能フラグで選択します。
ロールバック条件を事前に決める
切り替え後に問題が見つかってから判断を始めると、復旧が遅れます。事前にロールバック条件を決めてください。
代表的な条件は次のとおりです。
- 旧環境より5xxエラー率が明確に悪化した
- StorageやCosmos DBで403が継続する
- 重要なMCPツールが呼び出せない
- 複数ターンの会話履歴が失われる
- ユーザー間で保存データが混在する
- 二重登録や二重通知が発生した
- 応答時間が業務上の許容値を超えた
- Application Insightsへ必要なログが記録されない
ロールバックは、新Hosted Agentを削除する操作ではありません。まず呼び出し元の設定を旧エージェントへ戻します。新エージェントは原因調査のため残し、修正後に再テストします。
ただし、旧バックエンドを2026年8月20日以降の恒久的なロールバック先にすることはできません。期限前に修正、再切り替え、安定確認まで終えられる日程を組む必要があります。
CI/CDで修正するポイント
CI/CDパイプラインでは、次のような変更が必要です。
| 旧パイプライン | 新パイプライン |
|---|---|
| 古いアダプターパッケージをインストール | ResponsesまたはInvocationsライブラリをインストール |
agent.manifest.yamlを参照 | azure.yamlを参照 |
| Capability Hostを作成 | 処理を削除 |
az cognitiveservices agent start | 処理を削除 |
az cognitiveservices agent stop | 処理を削除 |
| レプリカ数を更新 | 処理を削除 |
agent_referenceで疎通確認 | agent_nameにバインドして呼び出す |
| プロジェクトIDへ外部権限を付与 | エージェント専用IDへ権限を付与 |
プロトコル"v1" | コンテナープロトコル"2.0.0" |
| ARM向けイメージをビルド | linux/amd64でビルド |
latestタグ | 一意のタグまたはダイジェスト |
| デプロイ成功だけ確認 | activeと機能テストを確認 |
パイプラインでは、デプロイコマンドが成功しただけで本番切り替えを行わないようにします。
最低でも、次のゲートを設けます。
ビルド成功
↓
新バージョン作成
↓
status == active
↓
スモークテスト成功
↓
RBACテスト成功
↓
承認または自動判定
↓
接続先切り替え
同じエージェント名に対してazd deployすると、最新バージョンが既定でアクティブになるため、厳密な承認ゲートが必要な環境では、別名デプロイまたはSDK・REST APIによる明示的なルーティングを使用します。(Microsoft Learn)
よくある移行失敗と対処方法
| 症状 | 主な原因 | 対処 |
|---|---|---|
az restが401になる | トークン対象リソースが違う | --resource "https://ai.azure.com"を指定 |
| ツール呼び出しが403になる | プロジェクトIDにしかRBACがない | 新エージェントのprincipal_idへ付与 |
ステータスがfailedになる | ARMイメージ、起動コマンド、依存関係 | linux/amd64、startupCommand、ログを確認 |
/readinessで失敗する | 独自サーバーがランタイム契約を満たさない | 公式プロトコルライブラリを使用 |
| 呼び出しが404になる | 共有エンドポイントを呼んでいる | 専用エージェントエンドポイントへ変更 |
| 会話履歴が消える | context.get_history()を処理していない | 履歴をフレームワークのメッセージへ変換 |
| 応答や履歴が重複する | モデルとプラットフォームの双方で保存 | store=Falseを基本に管理場所を統一 |
| Foundryの下流APIが403になる | x-agent-foundry-call-idを転送していない | 独自HTTP呼び出しで値をそのまま転送 |
| ユーザーの保存データが混ざる | セッションIDだけでデータを分割 | x-agent-user-idもキーへ含める |
| ACRからイメージを取得できない | 旧プロジェクトとプライベートACRの制約 | ACRのネットワーク到達性を確認 |
| 新版へ勝手に切り替わった | 同一名でazd deployした | 別名デプロイまたは明示的ルーティング |
| ツールが見つからない | create_versionのtoolsを使用 | Foundry ToolboxとMCPへ移行 |
公式のResponsesまたはInvocationsライブラリを使うと、HTTPポート8088、/readiness、SSE、終了処理、テレメトリなどのランタイム契約をライブラリ側で処理できます。独自Webサーバーを一から実装するより、移行時の失敗箇所を減らせます。(Microsoft Learn)
2026年8月20日までの移行計画例
2026年7月下旬から対応を始める場合は、期限直前に本番切り替えを行わないよう、次の日程を目安にします。
| 期間 | 実施内容 | 完了条件 |
|---|---|---|
| 7月23日~7月29日 | 対象判定、構成棚卸し、移行ブランチ作成 | 依存関係、ID、呼び出し元を一覧化 |
| 7月30日~8月5日 | ライブラリ、API、azure.yamlの更新 | ローカルテスト成功 |
| 8月6日~8月9日 | 新バックエンドへ並行デプロイ | ステータスがactive |
| 8月10日~8月12日 | RBAC、ツール、履歴、同時実行テスト | 重要テストがすべて成功 |
| 8月13日~8月15日 | 限定ユーザーで段階移行 | エラー率と応答性能が許容範囲 |
| 8月16日~8月17日 | 全トラフィックを切り替え | 旧環境への新規呼び出しがない |
| 8月18日~8月19日 | 安定確認、残課題対応 | ロールバック不要と判断 |
| 8月20日 | 旧環境を本番経路から完全に除外 | 新バックエンドのみで運用 |
8月20日を本番切り替え日にすると、問題発生時の修正時間がありません。遅くとも数日前までに全トラフィックを新環境へ切り替え、期限前に安定確認を完了させます。
最終チェックリスト
- [ ] 対象エージェントが2026年4月より前のデプロイか確認した
- [ ] 古いアダプターパッケージを特定した
- [ ]
azure-ai-projectsを2.3.0以上へ更新した - [ ]
azdを1.23.0以上へ更新した - [ ]
azure.ai.agents拡張を更新した - [ ] Agent Framework、LangGraph、独自コードのエントリーポイントを変更した
- [ ]
agent.manifest.yamlと旧agent.yamlをazure.yamlへ統合した - [ ] コンテナープロトコルを2.0.0へ更新した
- [ ]
agent_reference方式を廃止した - [ ] 専用エージェントエンドポイントへ変更した
- [ ] start、stop、レプリカ管理処理を削除した
- [ ] Capability Host作成処理を削除した
- [ ] ToolboxとMCPの動作を確認した
- [ ]
linux/amd64イメージを作成した - [ ] 一意のイメージタグまたはダイジェストを使用した
- [ ] 新しいエージェント専用Entra IDを取得した
- [ ] 外部Azureリソースへ必要なRBACを付与した
- [ ] 新バージョンが
activeになった - [ ] 単一ターンと複数ターンをテストした
- [ ] ユーザー間のデータ分離をテストした
- [ ] コールドスタートと連続呼び出しを確認した
- [ ] ロールバック方法と判断条件を決めた
- [ ] 呼び出し元の設定で新旧を切り替えられる
- [ ] 2026年8月20日より前に全トラフィックを移行した
- [ ] 旧バックエンドを本番経路から除外した
まとめ:active確認後に接続先を切り替える
旧Foundry Hosted Agentの移行は、既存デプロイを更新する作業ではなく、新しいバックエンドへ再デプロイする作業です。
停止を避けるための重要なポイントは、次の5点です。
- 旧Hosted Agentを残したまま、新しい名前で並行デプロイする
- プロトコルライブラリ、API、
azure.yamlをまとめて更新する - コンテナープロトコル
2.0.0へ対応する - 新しいエージェント専用Entra IDへRBACを付け直す
activeと機能テストを確認してから接続先を切り替える
Foundry側ではエージェントバージョン間の段階的なトラフィック分割ができません。段階移行が必要な場合は、アプリケーション設定、機能フラグ、API Managementなど、Foundryの外側で新旧を切り替えます。
2026年8月20日の直前に作業を始めるのではなく、旧環境へ戻せる期間を確保したうえで、再デプロイ、RBAC設定、テスト、本番切り替えまで完了させてください。(Microsoft Learn)

コメント