Azure Computer Vision(現 Azure AI Vision)の「Vectorize Text API」が、特定リージョン(West Europe)で突然 500 / 503 を返し始めると、システム全体のベクトル検索やレコメンドが止まってしまいます。本記事では、実際に確認されている事象を踏まえつつ、「これはサービス側障害なのか?」「いま何をすべきか?」「次回同じことが起きても止まらない設計にするには?」を、具体的な手順と設計パターンで整理します。
発生している事象の整理と結論
まずは、今回の症状を整理します。
- 対象 API:Azure Computer Vision(Azure AI Vision)の
retrieval:vectorizeText(Vectorize Text API) - リージョン:West Europe
- 複数環境・複数リソースで同時に発生
- 現象:
- 以前は正常に動作していたのに、突然失敗し始めた
- レスポンスコードが 500 Internal Server Error または長時間待たされた後の 503 Service Unavailable
2025年9月には、Microsoft Q&A 上で同様の事象(West Europe の Vectorize Text API で 500 / 503 が発生)が報告されており、「複数の顧客に影響する問題として認識しており、製品チームと調査中」と Microsoft 側が回答しています。これは、少なくともその時点ではサービス側の障害であったことを示しています。
また公式ドキュメントから、Vectorize Text API は 2024-02-01 API バージョン以降で提供されるマルチモーダル埋め込み機能の一部であり、特定リージョンのみに提供されていることがわかります。
結論として:
- 条件(複数環境・複数リソース・突然の 5xx・West Europe など)が一致する場合、アプリ側のバグや設定ミスではなく、サービス側の一時的な障害である可能性が高い
- ユーザー側で「これを直せば即解決」というものはなく、
- Azure Status / Service Health での状況確認
- Microsoft サポートへのエスカレーション
- 別リージョン・別サービスへのフェイルオーバー
- 実装側のリトライ・サーキットブレーカー・タイムアウト設計の強化
Azure Computer Vision Vectorize Text API の概要整理
まずは対象サービスをざっくりおさらいしておきます。
- サービス名:Azure Computer Vision / Azure AI Vision
- 機能:マルチモーダル埋め込み API の一部(Multimodal Embeddings)
- 役割:テキストを高次元ベクトルに変換し、画像ベクトルや他のテキストベクトルとの類似度検索に利用
代表的な呼び出し例(REST)は以下のような形です。
POST https://<endpoint>/computervision/retrieval:vectorizeText
?api-version=2024-02-01
&model-version=2023-04-15
Headers:
Content-Type: application/json
Ocp-Apim-Subscription-Key: <your-key>
Body:
{
"text": "cat jumping"
}
レスポンスは、例えば次のような JSON です。
{
"modelVersion": "2023-04-15",
"vector": [ -0.0944, -0.00067, -0.01098, ... ]
}
このベクトルを Azure AI Search、PostgreSQL + pgvector、Cosmos DB などのベクトルデータベースに格納し、テキストや画像の類似検索に使うのが典型的なユースケースです。
同様の障害は既知か?(Microsoft Q&A の事例)
今回のケースに非常によく似た質問が、Microsoft Q&A(公式コミュニティ)で 2025年9月に投稿されています。
| 項目 | 内容(Q&A から要約) |
|---|---|
| 質問内容 | Vectorize Text API が突然 Internal Server Error(500)を返す。West Europe の複数環境・複数リソースで同時に発生。 |
| 回答(Microsoft モデレーター) | 「長い待ちの後に 503 Service Unavailable を返す」事象を複数の顧客から認識している。プロダクトグループにエスカレーションして調査中。 |
| 示唆されること | 少なくともその時点では、Azure 側の障害として認識されていた。ユーザー設定だけの問題ではない。 |
つまり、今回と同じような条件(West Europe / Vectorize Text / 複数リソース / 突然 5xx 連発)が揃っている場合、サービス側の一時的障害をまず疑うのが妥当です。
HTTP ステータスコードから見る切り分け
500 / 503 が出ているからといって「必ずしも Azure 側の問題」とは限りませんが、今回のように複数環境で同時発生している場合、アプリ側単独の問題である可能性はかなり低くなります。
| ステータスコード | 典型的な意味 | 今回の事象との関係 |
|---|---|---|
| 400 Bad Request | リクエスト形式不正、パラメータ不正 | エンドポイントや API バージョンの誤り、JSON フォーマットミスなど。アプリ側要因が濃厚。 |
| 401 / 403 | 認証・認可エラー | キーの誤り、ローテーション忘れ、ロール不足など。設定ミスの可能性大。 |
| 429 Too Many Requests | スロットル(レート制限) | クォータ超過・瞬間的なリクエスト集中。リトライ戦略必須。 |
| 500 Internal Server Error | サービス内部エラー | アプリの入力が同じでも、サービス内部状態に依存して発生しうる。 |
| 503 Service Unavailable | サービス一時停止 / 過負荷 / メンテナンス | 長い待ち(タイムアウト近い遅延)の後に 503 になるのは、典型的なサービス断パターン。 |
West Europe の複数リソースで、同一タイミングに近い時間帯に 500 / 503 が急増している場合、次のように判断できます。
- クライアント側設定・コードの変更がないのに突然発生した
- 別環境や別サブスクリプションでも同様の症状
- 他の API(例:Image Analysis 4.0)には影響がない、または同時にエラーが出ている
このような条件が揃えば、「まずはサービス側障害かどうか確認 → そのうえでワークアラウンドと将来の耐障害化を考える」のが合理的です。
今すぐ実施すべき対応(推奨アクション)
1. サービス状態の確認
最初に、Azure 側で既知のインシデントになっていないか確認します。
- Azure Status(パブリックなステータスページ)
- Azure AI Services / Computer Vision / Azure AI Vision などの項目で、West Europe に関連する障害が出ていないか確認
- Azure ポータルの Service Health
- サブスクリプションごとのインシデント・アドバイザリ情報を確認
- 該当するインシデントがあれば「Follow」してメール通知などを有効化
- Resource Health
- 当該 Computer Vision / Azure AI Vision リソース単位での「Unhealthy / Degraded」が出ていないかチェック
| 確認場所 | 見るべきポイント | 取るべきアクション |
|---|---|---|
| Azure Status | リージョン単位の大規模障害 | 公開情報を参考に復旧見込みを把握 |
| Service Health | サブスクリプション影響のあるインシデント | インシデント ID を控え、サポートチケットに記載 |
| Resource Health | 個別リソースの状態(Unavailable / Degraded) | 発生時間と状態の変化をログと突き合わせる |
2. Microsoft サポートへのエスカレーション
サービス側障害が疑われる、または確定している場合でも、自社システム視点での影響度・ログ情報は Microsoft サポートにとって重要な材料になります。
サポートチケットには、最低限次の情報を添付します。
- 発生開始時刻・ピーク時刻(UTC とローカルの両方があると親切)
- 影響範囲(システム名、ユーザー数、SLA との関係など)
- x-ms-request-id(エラーになったリクエストのヘッダーから取得)
- レスポンスコード・レスポンスボディ(可能な範囲でマスク)
- 再現手順(最小限のサンプルリクエスト・テキスト)
- どのリージョン・どのリソースで発生しているか
特に x-ms-request-id は、Azure 内部ログと突き合わせるキーになるので、アプリケーションログに必ず残す設計にしておくことを強くおすすめします。
3. フェイルオーバー(別リージョンへの迂回)
Vectorize Text API は、全リージョンではなく、対応リージョンのみで提供されています。公式ドキュメントでは、マルチモーダル埋め込みが East US / West US / North Europe / West Europe などの一部リージョンで利用可能であるとされており、West Europe も対応リージョンに含まれています。
West Europe 停止時の代表的な迂回先としては、次のようなリージョンが考えられます。
- North Europe
- East US
- West US / West US 2
実運用では、あらかじめ複数リージョンに同等構成の Computer Vision / Azure AI Vision リソースを用意し、以下のようなパターンで切り替えるとよいです。
- DNS ベース:Traffic Manager / Azure Front Door を利用して、ヘルスプローブに応じて West Europe → North Europe へ自動フェイルオーバー
- アプリケーションレベル:構成ファイルや Key Vault に複数エンドポイントを持たせ、West Europe が一定時間連続で 5xx を返したら North Europe に切り替えるロジックを実装
| パターン | メリット | 注意点 |
|---|---|---|
| Traffic Manager / Front Door | インフラ側で自動フェイルオーバーが完結。複数アプリから共通利用しやすい。 | ヘルスプローブの粒度が粗いと、アプリ観点のエラーを十分に検知できない場合がある。 |
| アプリケーション内ロジック | ステータスコードや特定例外など、アプリ観点の詳細条件で切り替え可能。 | ロジックが複雑になりがち。設定ミスで二重送信や無限ループを起こさないよう注意。 |
API キーがリージョンごとな場合は、キー管理(Key Vault / App Configuration)もリージョンごとに持たせる設計にしておくと、切り替え時の影響が最小化できます。
4. 実装の耐障害性強化(リトライ・サーキットブレーカー・タイムアウト)
サービス側障害は避けられないとしても、「壊れ方」をコントロールすることはできます。典型的なパターンは次の通りです。
- 指数バックオフ+ジッター付きリトライ(対象:5xx / 429)
- サーキットブレーカー(一定時間内の失敗率が閾値を超えたらクローズして、バックエンドへのトラフィックを止める)
- 明示的なタイムアウト設定(接続タイムアウト+全体タイムアウト)
- キュー/再実行設計(一度失敗したリクエストの再処理をどう制御するか)
指数バックオフ+ジッター(C# 風の擬似コード例)
private static readonly HttpClient _http = new HttpClient();
private static readonly Random _random = new Random();
public async Task<HttpResponseMessage> CallVectorizeTextAsync(HttpRequestMessage request)
{
const int maxRetries = 5;
for (int retry = 0; retry <= maxRetries; retry++)
{
var response = await _http.SendAsync(request);
// 成功 or クライアントエラーならそのまま返す
if ((int)response.StatusCode < 500 && response.StatusCode != (HttpStatusCode)429)
{
return response;
}
// リトライ上限に達したら諦める
if (retry == maxRetries)
{
return response;
}
// 指数バックオフ+ジッター
var baseDelaySeconds = Math.Pow(2, retry); // 1, 2, 4, 8, 16...
var jitterSeconds = _random.NextDouble(); // 0.0~1.0 のランダム
var delay = TimeSpan.FromSeconds(baseDelaySeconds + jitterSeconds);
await Task.Delay(delay);
}
throw new InvalidOperationException("Unreachable");
}
ポイントは、「全クライアントが同じタイミングで再試行しないようにジッター(ランダム遅延)を入れる」ことです。サービス側が不安定なときに、一斉リトライでとどめを刺さないための工夫です。
サーキットブレーカーの考え方
サーキットブレーカーは「一定時間内の失敗回数が閾値を超えたら、しばらくの間すべてのリクエストを即座に失敗扱いにする」というパターンです。
- バックエンドが完全にダウンしているときに、無駄なリトライでさらに負荷をかけない
- アプリケーション側のスレッド/接続を生かしておき、優先度の高い処理にリソースを回す
具体的な実装は .NET なら Polly、Java なら Resilience4j などのライブラリを使うとよいですが、フレームワークを使わない場合でも「一定時間内の 5xx カウント+開閉状態」を簡易的に記録することで実現できます。
タイムアウトとキュー設計
- 接続タイムアウト:ネットワークコネクションが確立されるまでの上限
- 全体タイムアウト:リクエスト開始からレスポンス受信までの総時間
Vectorize Text API は、障害時に「長い待ちの後に 503」が返ることがあるため、アプリケーション側のタイムアウトが適切でないと、スレッド枯渇やキュー滞留につながります。
- オンライン API:1〜5 秒程度の全体タイムアウト+短めの接続タイムアウト
- バッチ処理:やや長めのタイムアウトでもよいが、それでも「永遠には待たない」設定にする
タイムアウト時に「再試行するのか」「諦めてユーザーにエラーを返すのか」「バックグラウンドキューに回して後続処理するのか」を事前に設計しておくことが重要です。
5. 設定・利用条件の再点検(誤設定排除)
サービス側障害の可能性が高いケースでも、念のためクライアント側の設定を一度棚卸ししておくと安心です。
| 項目 | チェック内容 | 補足 |
|---|---|---|
| エンドポイント URL | https://<resource-name>.cognitiveservices.azure.com/computervision/ のような形式になっているか | 末尾の /computervision/ の有無や二重スラッシュに注意。 |
| API パス | /retrieval:vectorizeText になっているか | スペルミスや vectorizeImage との取り違えがないか確認。 |
| API バージョン | api-version=2024-02-01 など、サポートされているバージョンを利用しているか | 古い preview バージョンを使っていると、挙動が不安定な場合があります。 |
| model-version | 2023-04-15(多言語)と 2022-04-11(英語のみ)を混在させていないか | 異なるモデルバージョンのベクトルは互換性がないため、インデックス作成時と検索時で揃える必要があります。 |
| 認証キー | キーの有効期限やローテーションをまたいでいないか | 401 / 403 が出ていないかログで確認。 |
| クォータ / レート制限 | 利用 SKU の TPS / TPM 制限を超えていないか | 429 が同時に多発していないかもあわせて見る。 |
| 入力制約 | 極端に長いテキストや非対応言語が送られていないか | モデルの入力制限に関しては公式ドキュメントを参照。 |
6. 一時的な代替:別の埋め込みサービスを使う
どうしてもベクトル化が必要なワークロード(検索・レコメンド・RAG など)は、一時的に別の埋め込みサービスへ切り替えるという選択肢もあります。
Azure OpenAI の埋め込みモデルを利用する
Azure OpenAI では、text-embedding-3-small や text-embedding-3-large などの最新の埋め込みモデルを提供しており、Azure AI Search と組み合わせてベクトル検索を構築することができます。
- メリット
- テキスト専用の高精度埋め込みモデル
- RAG(Retrieval Augmented Generation)シナリオとの相性が良い
- Azure AI Search から「Azure OpenAI Embedding skill」として直接利用可能
- デメリット
- コンテンツ側のベクトルをすべて再生成する必要がある
- 次回以降のモデルアップグレード・非推奨化も視野に入れたライフサイクル設計が必要
Azure AI Search のベクトル化機能を活用する
Azure AI Search では、インデックス作成時に Azure OpenAI Embedding Skill などを用いて、ドキュメントを自動的にベクトル化することができます。
- メリット:検索側から見ると「埋め込み生成を意識せずにベクトル検索を利用できる」
- デメリット:既存の「Vectorize Text API ベースのフロー」とはアーキテクチャが変わるため、短期での置き換えはハードルが高い場合も
代替サービス切り替え時の注意点
| 観点 | Vectorize Text API | Azure OpenAI Embeddings |
|---|---|---|
| 主な用途 | 画像検索向けのマルチモーダル埋め込み(画像+テキスト) | テキスト中心の検索・RAG・分類など |
| ベクトル次元 | 1024 次元(Vision マルチモーダルモデル) | 1536 / 3072 などモデルに依存 |
| 既存インデックスとの互換性 | Vision のマルチモーダル同士のみ互換 | OpenAI モデル同士のみ互換(モデルごとの差異に注意) |
| 切り替えコスト | 同じ API ならリージョン切り替えの方が楽 | すべてのコンテンツの再ベクトル化が必要 |
短期的には「Vectorize Text API を別リージョンにフェイルオーバー」、中長期的には「Azure OpenAI Embedding への移行や共存」という二段構えで検討するのが現実的です。
7. 監視と運用(メトリクス&ログ設計)
最後に、今回のような障害を「早く検知し、影響を最小化する」ための監視・ログ観点を整理します。
監視すべきメトリクス
- 5xx レスポンス率(直近 5 分 / 15 分など)
- しきい値:1〜5%を超えたら警告、10%以上で重大アラートなどを設定
- p95 / p99 レイテンシ
- 平常時と比較して急激に悪化していないか
- 「タイムアウト寸前まで待たされた後に 503」というパターンを捉える
- タイムアウト件数
- アプリ側タイムアウトでリクエストが失敗していないか
ログに残しておくべき情報
- タイムスタンプ(UTC とローカル両方が理想)
- 呼び出し先エンドポイント(リージョン)
- ステータスコード
- 所要時間(Duration)
- x-ms-request-id
- 呼び出し元サービス名・トレース ID(OpenTelemetry などの分散トレース ID)
{
"timestampUtc": "2025-09-09T11:45:23Z",
"service": "image-search-api",
"operation": "vectorizeText",
"region": "westeurope",
"statusCode": 503,
"durationMs": 29000,
"xMsRequestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"traceId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
}
このレベルまで構造化ログを出しておけば、「どの時間帯に、どのリージョンで、どの程度の 5xx が出ていたか」をすぐに可視化できますし、Microsoft サポートとのコミュニケーションもスムーズになります。
まとめ:サービス側障害前提での設計にシフトする
今回取り上げた Azure Computer Vision Vectorize Text API の 500 / 503 問題は、少なくともある時点では Microsoft 側でも複数顧客からの報告を認識しており、純粋な「使い方の誤り」ではなくサービス側の一時的な障害として扱われていました。
そのため、現場で取るべきアクションは次のように整理できます。
- まずは事実確認:Azure Status / Service Health / Resource Health でインシデントの有無を確認し、必要に応じてサポートにエスカレーション
- 即時の影響緩和:別リージョンの Vision リソースへのフェイルオーバーや、一時的な Azure OpenAI Embeddings への切り替えを検討
- 恒久的な対策:
- 指数バックオフ+ジッター付きリトライ
- サーキットブレーカー
- タイムアウト&キュー設計
- 構造化ログ(特に x-ms-request-id)と 5xx 監視
- マルチリージョン構成とエンドポイント切り替えの自動化
クラウドサービスは「落ちない前提」ではなく「必ずどこかで落ちる前提」で設計した方が、結果的に運用コストもビジネスインパクトも小さくなります。今回の Vectorize Text API 障害は、その設計思想を見直す良いきっかけになります。
もし今まさに West Europe の Vectorize Text API の 500 / 503 で困っている場合は、本記事で紹介したステップ:
- サービス状態確認
- サポートチケット起票(x-ms-request-id 付き)
- 別リージョンへのフェイルオーバー検討
- リトライ・サーキットブレーカー・タイムアウト実装の見直し
- 中長期的な代替(Azure OpenAI Embeddings 等)の検討
の順で着実に進めれば、「今の障害」をしのぐだけでなく、「次の障害」にも強いベクトル検索基盤を作っていくことができるはずです。

コメント