プライベート リンクを経由した送信接続の作成

この記事では、Azure AI Search から仮想ネットワーク内で実行される Azure PaaS リソースへのプライベートな発信呼び出しを構成する方法について説明します。

プライベート接続を設定すると、検索サービスは、インターネットに開かれているポートではなく、仮想ネットワークの IP アドレスに接続できます。 接続用に作成されたオブジェクトは、 共有プライベート リンクと呼ばれます。 接続では、検索サービスは共有プライベート リンクを内部的に使用して、ネットワーク境界内の Azure PaaS リソースに到達します。

共有プライベート リンクは、使用量に基づいて課金されるプレミアム機能です。 共有プライベート リンクを設定すると、プライベート エンドポイントの料金が Azure 請求書に追加されます。 共有プライベート リンクを使用すると、受信アクセスと送信アクセスのデータ転送レートも請求されます。 料金の詳細については、「Azure Private Link の価格」をご覧ください。

Note

SQL Managed Instance へのプライベート インデクサー接続を設定する場合は、代わりにこの記事を参照してください。

Azure AI Search は、次のシナリオで他の Azure PaaS リソースへの送信呼び出しを行います。

  • インデクサーまたは検索エンジンが、テキストからベクターへの埋め込みのために Azure OpenAI に接続する
  • インデクサーが、サポートされているデータ ソースに接続する
  • インデクサー (スキルセット) が、エンリッチメントのキャッシュ、デバッグ セッションの状態、またはナレッジ ストアへの書き込みのために Azure Storage に接続
  • Azure Key Vault へ暗号化キーを要求
  • Azure Functions または同様のリソースに対するカスタム スキルを要求

共有プライベート リンクは、Azure から Azure への接続でのみ機能します。 OpenAI または別の外部モデルに接続する場合は、接続はパブリック インターネット経由である必要があります。

共有プライベート リンクは操作用であり、Azure 仮想ネットワークで実行される Azure リソースまたはクライアント用にプライベート エンドポイントを介してアクセスされるデータ用です。

共有プライベート リンク:

  • Azure AI Search ツール、API、または SDK を使用して作成済み
  • Azure PaaS リソース所有者によって承認済み
  • 特定の Azure リソースへのプライベート接続で Azure AI Search によって内部的に使用される

作成したプライベート リンクを使用できるのは検索サービスだけです。リソースとサブリソースの組み合わせごとに、サービスに作成できる共有プライベート リンクは 1 つのみです。

プライベート リンクを設定すると、検索サービスがその PaaS リソースに接続するたびに自動的に使用されます。 接続文字列を変更したり、要求を発行するために使用しているクライアントを変更したりする必要はありませんが、接続に使用されるデバイスは、Azure PaaS リソースのファイアウォールで承認された IP を使用して接続する必要があります。

Azure Private Link と Azure AI Search を一緒に使用するシナリオは 2 つあります。

  • シナリオ 1: 共有プライベート リンクは、Azure PaaS への "送信" (インデクサー) 接続にプライベート接続が必要な場合に作成します。

  • シナリオ 2: 仮想ネットワークで実行されているクライアントからのプライベート "受信" 接続の検索を構成します。

この記事では、1 番目のシナリオについて説明します。

どちらのシナリオも Azure Private Link に依存していますが、独立しています。 プライベート エンドポイント用に独自の検索サービスを構成しなくても、共有プライベート リンクを作成できます。

制限事項

シナリオの共有プライベート リンクを評価する場合、これらの制約に注意してください。

  • 共有プライベート リンクで使用されるリソースの種類の一部は、プレビュー段階です。 Azure Database for MySQL、Azure Functions または Azure SQL Managed Instance などのプレビュー リソースに接続する場合は、プレビュー バージョンの管理 REST API を使用して共有プライベート リンクを作成します。 これらのバージョンには、2020-08-01-preview2021-04-01-preview、および 2024-03-01-preview が含まれます。

  • インデクサーの実行では、検索サービスに固有のプライベート実行環境を使用する必要があります。 プライベート エンドポイント接続は、マルチテナント環境からはサポートされていません。 この要件の構成設定については、この記事で説明されています。

前提条件

  • Azure AI Search は、Basic レベル以上である必要があります。 AI エンリッチメントとスキルセットを使用している場合、レベルは Standard 2 (S2) 以上である必要があります。 詳細については、「サービスの制限」を参照してください。

  • 仮想ネットワークで実行するように構成された、サポートされているリソースの種類の次のリストの Azure PaaS リソース。

  • Azure AI Search とデータ ソースの両方に対するアクセス許可:

    • Azure PaaS リソースの場合は、プライベート エンドポイント接続を承認するアクセス許可が必要です。 たとえば、データ ソースとして Azure Storage アカウント (BLOB コンテナー、Azure Files 共有、Azure テーブルなど) を使用している場合は、Microsoft.Storage/storageAccounts/privateEndpointConnectionsApproval/action が必要です。

    • 検索サービスの場合は、共有プライベート リンク リソースと読み取り操作の状態を読み書きするためのアクセス許可が必要です。

      • Microsoft.Search/searchServices/sharedPrivateLinkResources/write
      • Microsoft.Search/searchServices/sharedPrivateLinkResources/read
      • Microsoft.Search/searchServices/sharedPrivateLinkResources/operationStatuses/read

サポートされているリソースの種類

次のリソースの共有プライベート リンク リソースを作成できます。

リソースの種類 サブリソース (またはグループ ID)
Microsoft.Storage/storageAccounts 1 blobtabledfs, file
Microsoft.DocumentDB/databaseAccounts 2 Sql
Microsoft.Sql/servers sqlServer
Microsoft.KeyVault/vaults vault
Microsoft.DBforMySQL/servers (プレビュー) mysqlServer
Microsoft.Web/sites (プレビュー) 3 sites
Microsoft.Sql/managedInstances (プレビュー) 4 managedInstance
Microsoft.CognitiveServices/accounts (プレビュー) 5 openai_account

1 Azure Storage と Azure AI Search が同じリージョンにある場合、ストレージへの接続は Microsoft バックボーン ネットワーク経由で行われます。この構成では共有プライベート リンクが冗長になります。 ただし、Azure Storage のプライベート エンドポイントが既に設定されている場合は、共有プライベート リンクも設定する必要があります。そうでない場合、ストレージ側で接続が拒否されます。 また、検索のさまざまなシナリオで複数のストレージ形式を使用している場合は、サブリソースごとに個別の共有プライベート リンクも作成します。

2Microsoft.DocumentDB/databaseAccounts リソースの種類は、Azure Cosmos DB for NoSQL へのインデクサー接続に使用されます。 プロバイダー名とグループ ID では、大文字と小文字が区別されます。

3Microsoft.Web/sites リソースの種類は、App Service と Azure 関数に使用されます。 Azure AI Search のコンテキストでは、Azure 関数がより可能性の高いシナリオとなります。 Azure 関数は、カスタム スキルのロジックをホストする目的で一般的に使用されます。 Azure 関数には、従量課金プラン、Premium プラン、専用 App Service ホスティング プランがあります。 現時点では、App Service Environment (ASE)Azure Kubernetes Service (AKS) はサポートされていません。

4 手順については、「SQL Managed Instance の共有プライベート リンクを作成する」を参照してください。

5Microsoft.CognitiveServices/accounts リソースの種類は、統合ベクター化を実装するときに、Azure OpenAI へのインデクサー接続に使用されます。

Azure portal、Management REST API、Azure CLI、または Azure PowerShell を使用して、共有プライベート リンクを作成します。

いくつかのヒントを次に示します。

  • プライベート リンクにはわかりやすい名前を付けます。 Azure PaaS リソースでは、共有プライベート リンクは、他のプライベート エンドポイントと共に表示されます。 "shared-private-link-for-search" のような名前にすると、その使用方法を通知できます。

このセクションでこれらの手順を完了すると、保留中の状態でプロビジョニングされた共有プライベート リンクが作成されます。 リンクの作成には数分かかります。 動作可能にするには、作成後にリソース所有者が要求を承認する必要があります。

  1. Azure portal にサインインし、ご利用の検索サービスを探します

  2. 左側のナビゲーション ウィンドウの [設定][ネットワーク] を選択します。

  3. [共有プライベート アクセス] ページで、[+ 共有プライベート アクセスの追加] を選択します。

  4. [マイ ディレクトリ内の Azure リソースに接続します] または [リソース ID を使って Azure リソースに接続します] を選びます。

  5. 最初のオプション (推奨) を選択すると、ポータルは適切な Azure リソースを選択するのに役立ち、リソースのグループ ID やリソースの種類などの他のプロパティが入力されます。

    [共有プライベート アクセスの追加] ページのスクリーンショット。共有プライベート リンク リソースを作成するためのガイド付きエクスペリエンスが示されています。

  6. 2 番目のオプションを選択した場合は、Azure リソース ID を手動で入力し、この記事の冒頭にあるリストから適切なグループ ID を選択します。

    [共有プライベート アクセスの追加] ページのスクリーンショット。共有プライベート リンク リソースを作成するための手動エクスペリエンスが示されています。

  7. プロビジョニングの状態が "更新中" であることを確認します。

    [共有プライベート アクセスの追加] ページのスクリーンショット。リソースの作成が進行中であることが示されています。

  8. リソースが正常に作成されると、リソースのプロビジョニング状態が "成功" に変わります。

    [共有プライベート アクセスの追加] ページのスクリーンショット。リソースの作成が完了したことが示されています。

成功した場合、202 Accepted 応答が返されます。 発信プライベート エンドポイントを作成するプロセスは長時間実行される (非同期の) 操作です。 これには、次のリソースのデプロイが含まれます。

  • プライベート IP アドレスが割り当てられた、"Pending" 状態のプライベート エンドポイント。 このプライベート IP アドレスは、検索サービス固有のプライベート インデクサー実行環境の仮想ネットワークに割り当てられたアドレス空間から取得されます。 プライベート エンドポイントが承認されると、Azure AI Search から Azure リソースへのすべての通信は、プライベート IP アドレスとセキュリティで保護されたプライベート リンク チャネルから行われます。

  • グループ ID に基づく、リソースの種類のプライベート DNS ゾーン。 このリソースをデプロイすると、プライベート リソースへの DNS 参照で、プライベート エンドポイントに関連付けられた IP アドレスが使用されるようになります。

2 - プライベート エンドポイント接続を承認する

プライベート エンドポイント接続の承認は、Azure PaaS 側で付与されます。 リソース所有者による明示的な承認が必要です。 次の手順では、Azure portal を使った承認ついて説明します。ただし、Azure PaaS 側からプログラムにより接続を承認するためのリンクもいくつかあります。

Azure portal を使って、次の手順を実行します。

  1. Azure PaaS resource.text[ネットワーク] ページを開きます。

  2. プライベート エンドポイント接続のリストを示すセクションを見つけます。 ストレージ アカウントの例を次に示します。

    Azure portal のスクリーンショット。[プライベート エンドポイント接続] ペインが表示されている。

  3. 接続を選択し、[承認] を選択します。 ポータルで状態が更新されるまでに数分かかる場合があります。

    Azure portal のスクリーンショット、プライベート エンドポイント接続 ペインに 承認済み の状態が表示されている。

プライベート エンドポイントが承認されると、Azure AI Search によって、それに対して作成された DNS ゾーンに必要な DNS ゾーン マッピングが作成されます。

[ネットワーク] ページ上で [プライベート エンドポイント] のリンクはアクティブですが、これは解決されません。

Azure PaaS ネットワーク ページのプライベート エンドポイント リンクのスクリーンショット。

このリンクを選択するとエラーが発生します。 "The access token is from the wrong issuer"must match the tenant associated with this subscription のステータス メッセージが表示されるのは、バックエンド プライベート エンドポイント リソースは Microsoft が管理するテナント内で Microsoft によってプロビジョニングされるのに対し、このリンクされたリソース (Azure AI 検索) はユーザーのテナント内にあるためです。 仕様により、プライベート エンドポイント接続リンクを選んでプライベート エンドポイント リソースにアクセスすることはできません。

共有プライベート リンクの状態を調べるには、次のセクションの手順のようにします。

Azure AI Search 側で、検索サービスの [ネットワーク] ページの [共有プライベート アクセス] ページに再びアクセスすることで、要求の承認を確認できます。 接続状態が承認されているはずです。

Azure portal のスクリーンショット。承認済み共有プライベート リンク リソースが示されています。

または、GET 共有 Private Link API を使用して接続状態を取得することもできます。

az rest --method get --uri https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.Search/searchServices/contoso-search/sharedPrivateLinkResources/blob-pe?api-version=2023-11-01

これにより、JSON が返されます。接続状態は "properties" セクションの下の "status" として表示されます。 ストレージ アカウントの例を次に示します。

{
      "name": "blob-pe",
      "properties": {
        "privateLinkResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/contoso/providers/Microsoft.Storage/storageAccounts/contoso-storage",
        "groupId": "blob",
        "requestMessage": "please approve",
        "status": "Approved",
        "resourceRegion": null,
        "provisioningState": "Succeeded"
      }
}

リソースのプロビジョニング状態 (properties.provisioningState) が "成功" で、接続状態 (properties.status) が "承認済み" の場合、共有プライベート リンク リソースが機能し、プライベート エンドポイント経由で通信するようにインデクサーを構成できることを意味します。

4 - プライベート環境で実行されるようにインデクサーを構成する

インデクサーの実行は、検索サービス固有のプライベート環境、または複数の顧客に対して高コストのスキルセット処理をオフロードするために内部的に使用されるマルチテナント環境のいずれかで発生します。

実行環境は透過的ですが、ファイアウォール規則の構築やプライベート接続の確立を開始した後は、インデクサーの実行を考慮する必要があります。 プライベート接続の場合は、常にプライベート環境で実行されるようにインデクサーの実行を構成します。

このステップでは、REST API を使用して、インデクサーをプライベート環境で実行するように構成する方法を示します。 ポータル内で JSON エディターを使用して実行環境を設定することもできます。

Note

この手順は、プライベート エンドポイント接続が承認される前に実行できます。 ただし、プライベート エンドポイント接続が承認されるまで、セキュリティで保護されたリソース (ストレージ アカウントなど) との通信を試行するすべての既存のインデクサーは、一時的なエラー状態になり、新しいインデクサーの作成に失敗します。

  1. 通常どおりに、データ ソース定義、インデックス、およびスキルセット (使用している場合) を作成します。 共有プライベート エンドポイントを使用する場合、これらの定義にはプロパティがありません。

  2. 前の手順で作成したデータ ソース、インデックス、スキルセットを指すインデクサーを作成します。 また、インデクサーの構成プロパティ executionEnvironmentprivate に設定して、インデクサーがプライベート実行環境で実行されるように強制します。

    {
        "name": "indexer",
        "dataSourceName": "blob-datasource",
        "targetIndexName": "index",
        "parameters": {
            "configuration": {
                "executionEnvironment": "private"
            }
        },
        "fieldMappings": []
    }
    

インデクサーが正しく作成されると、プライベート エンドポイント接続を介してそれが Azure リソースに接続されます。 インデクサーの状態は、インデクサーの状態 API を使用して監視できます。

Note

既存のインデクサーがある場合は、PUT APIexecutionEnvironmentprivate に設定するか、ポータル内で JSON エディターを使用して、それらを更新できます。

  1. まだ行っていない場合、Azure PaaS リソースがパブリック インターネットからの接続を拒否していることを確認します。 接続が受け入れられる場合は、Azure PaaS リソースの [ネットワーク] ページで DNS 設定を確認します。

  2. プライベート エンドポイントへのインデクサー接続など、送信要求シナリオを呼び出すことができるツールを選択します。 [データのインポート] ウィザードを使用する方法は簡単ですが、REST クライアントと REST API を使用して精度を高めることもできます。 検索サービスがプライベート接続用に構成されていないと仮定すると、検索への REST クライアント接続はパブリック インターネット経由で行うことができます。

  3. 接続文字列をプライベート Azure PaaS リソースに設定します。 共有プライベート リンクの接続文字列の形式は変更されません。 検索サービスでは、内部的に共有プライベート リンクを呼び出します。

    インデクサー ワークロードの場合、接続文字列はデータ ソース定義にあります。 データ ソースの例を次に示します。

     {
       "name": "my-blob-ds",
       "type": "azureblob",
       "subtype": null,
       "credentials": {
         "connectionString": "DefaultEndpointsProtocol=https;AccountName=<YOUR-STORAGE-ACCOUNT>;AccountKey=..."
       }
    
  4. インデクサー ワークロードでは、インデクサー定義で実行環境を設定することを忘れないでください。 インデクサー定義の例を次に示します。

    "name": "indexer",
    "dataSourceName": "my-blob-ds",
    "targetIndexName": "my-index",
    "parameters": {
       "configuration": {
           "executionEnvironment": "private"
           }
       },
    "fieldMappings": []
    }
    
  5. インデクサーを実行します。 インデクサーの実行が成功し、検索インデックスが設定された場合、共有プライベート リンクは機能しています。

トラブルシューティング

  • "データ ソースの資格情報が無効です" でインデクサーの作成が失敗した場合は、接続をデバッグする前に、共有プライベート リンクの承認状態を確認してください。 状態が Approved の場合は、properties.provisioningState プロパティを確認します。 Incomplete の場合は、基になる依存関係に問題がある可能性があります。 この場合は、共有プライベート リンクを再作成するために PUT 要求を再発行します。 また、承認ステップを繰り返す必要がある場合もあります。

  • インデクサーが常に、または断続的に失敗する場合は、インデクサーの executionEnvironment プロパティを確認します。 値は private に設定する必要があります。 このプロパティを設定しておらず、インデクサーが過去に正常に実行された場合は、検索サービスが独自にプライベート環境を使用していることが原因です。 システムに負荷がかかっている場合、検索サービスでは標準環境から処理が移動されます。

  • 共有プライベート リンクの作成中にエラーが発生した場合は、サービスの制限を確認して、ご利用のレベルのクォータ内であることを確認してください。

次のステップ

プライベート エンドポイントと他のセキュリティで保護された接続方法の詳細については、次を参照してください。