Azure Computer Vision Vectorize Text APIで500/503エラーが発生したときの原因切り分けと対処法【West Europe】

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. 設定・利用条件の再点検(誤設定排除)

サービス側障害の可能性が高いケースでも、念のためクライアント側の設定を一度棚卸ししておくと安心です。

項目チェック内容補足
エンドポイント URLhttps://<resource-name>.cognitiveservices.azure.com/computervision/ のような形式になっているか末尾の /computervision/ の有無や二重スラッシュに注意。
API パス/retrieval:vectorizeText になっているかスペルミスや vectorizeImage との取り違えがないか確認。
API バージョンapi-version=2024-02-01 など、サポートされているバージョンを利用しているか古い preview バージョンを使っていると、挙動が不安定な場合があります。
model-version2023-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 APIAzure 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 で困っている場合は、本記事で紹介したステップ:

  1. サービス状態確認
  2. サポートチケット起票(x-ms-request-id 付き)
  3. 別リージョンへのフェイルオーバー検討
  4. リトライ・サーキットブレーカー・タイムアウト実装の見直し
  5. 中長期的な代替(Azure OpenAI Embeddings 等)の検討

の順で着実に進めれば、「今の障害」をしのぐだけでなく、「次の障害」にも強いベクトル検索基盤を作っていくことができるはずです。

この記事を書いた人

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

コメント

コメントする

目次