マネージド ID を使用して Azure SQL へのインデクサー接続を設定する

この記事では、接続文字列で資格情報を指定する代わりに、マネージド ID を使用して Azure SQL Database へのインデクサー接続を設定する方法を説明します。

システム割り当てマネージド ID またはユーザー割り当てマネージド ID (プレビュー) を使用できます。 マネージド ID は Microsoft Entra のログイン ID であり、Azure SQL のデータにアクセスするには Azure でのロールの割り当てが必要です。

前提条件

1 - アクセス許可をデータベースの読み取りに割り当てる

次の手順に従って、検索サービスまたはユーザー割り当てマネージド ID のアクセス許可をデータベースの読み取りに割り当てます。

  1. Visual Studio に接続する。

    Visual Studio に接続する

  2. Microsoft Entra アカウントで認証します。

    認証

  3. 次のコマンドを実行します。

    検索サービス名またはユーザー割り当てマネージド ID 名には角かっこを付けます。

    CREATE USER [insert your search service name here or user-assigned managed identity name] FROM EXTERNAL PROVIDER;
    EXEC sp_addrolemember 'db_datareader', [insert your search service name here or user-assigned managed identity name];
    

    新しいクエリ

    クエリを実行する

アクセス許可を割り当ててから、検索サービス ID またはユーザー割り当て ID を後で変更する場合は、SQL データベースでロール メンバーシップを削除し、ユーザーを削除してから、アクセス許可の割り当てをやり直す必要があります。 ロールのメンバーシップとユーザーを削除するには、次のコマンドを実行します。

sp_droprolemember 'db_datareader', [insert your search service name or user-assigned managed identity name];

DROP USER IF EXISTS [insert your search service name or user-assigned managed identity name];

2 - ロールの割り当てを追加する

このセクションでは、SQL Server からデータを読み取るアクセス許可を Azure AI Search Serviceに付与します。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

  1. Azure portal で、お使いの Azure SQL Server のページに移動します。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加] > [ロールの割り当ての追加] の順に選択します。

    [ロールの割り当ての追加] メニューが開いている [アクセス制御 (IAM)] ページのスクリーンショット。

  4. [ロール] タブで、適切な [閲覧者] ロールを選択します。

  5. [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。

  6. Azure サブスクリプションを選択します。

  7. システム割り当てマネージド ID を使用している場合、[システム割り当てマネージド ID] を選択して、検索サービスを検索して選択します。

  8. それ以外の場合、ユーザー割り当てマネージド ID を使用しているときは、[ユーザー割り当てマネージド ID] を選択して、ユーザー割り当てマネージド ID の名前を検索して選択します。

  9. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

3 - データ ソースを作成する

データ ソースを作成し、システム割り当てマネージド ID またはユーザー割り当てマネージド ID (プレビュー) のいずれかを指定します。

システム割り当てマネージド ID

REST API、Azure portal、および .NET SDK では、システム割り当てマネージド ID がサポートされています。

システム割り当てマネージド ID を使用して接続する場合は、データソース定義に対して、"credentials" プロパティの形式を変更するだけで済みます。 Initial Catalog または Database の名前と、アカウント キーまたはパスワードが設定されていない ResourceId を指定します。 ResourceId には、Azure SQL Database のサブスクリプション ID、SQL データベースのリソース グループ、および SQL データベースの名前を含める必要があります。

以下に、データ ソースの作成 REST API とマネージド ID 接続文字列を使用し、ストレージ アカウントのデータにインデックスを付けるためにデータ ソースを作成する方法の例を示します。 マネージド ID 接続文字列の形式は、REST API、.NET SDK、および Azure portal において同じです。

POST https://[service name].search.windows.net/datasources?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-datasource",
    "type" : "azuresql",
    "credentials" : { 
        "connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
    },
    "container" : { 
        "name" : "my-table" 
    }
} 

ユーザー割り当てマネージド ID (プレビュー)

2021-04-30-preview 以降のプレビュー REST API では、ユーザー割り当てマネージド ID に基づく接続がサポートされています。 ユーザー割り当てマネージド ID を使用して接続する場合、データソースの定義に対する変更は次の 2 つとなります。

  • まず、"credentials" プロパティの形式を、Initial Catalog または Database の名前と、アカウント キーまたはパスワードが設定されていない ResourceId とします。 ResourceId には、Azure SQL Database のサブスクリプション ID、SQL データベースのリソース グループ、および SQL データベースの名前を含める必要があります。 これは、システム割り当てマネージド ID と同じ形式です。

  • 次に、ユーザー割り当てマネージド ID のコレクションを含む "identity" プロパティを追加します。 データ ソースを作成するとき、ユーザー割り当てマネージド ID を 1 つだけ指定する必要があります。 それを、"userAssignedIdentities" という型に設定します。

以下で示すのは、データ ソースの作成または更新に最新のプレビュー API バージョンを使ってインデクサー データ ソース オブジェクトを作成する方法の例です。

POST https://[service name].search.windows.net/datasources?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-datasource",
    "type" : "azuresql",
    "credentials" : { 
        "connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
    },
    "container" : { 
        "name" : "my-table" 
    },
    "identity" : { 
        "@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
        "userAssignedIdentity" : "/subscriptions/[subscription ID]/resourcegroups/[resource group name]/providers/Microsoft.ManagedIdentity/userAssignedIdentities/[managed identity name]"
    }
}   

4 - インデックスを作成する

インデックスでは、検索に使用する、ドキュメント内のフィールド、属性、およびその他の構成要素を指定します。

次に、検索可能な booktitle フィールドを使用して [インデックスの作成] REST API を呼び出す方法を示します。

POST https://[service name].search.windows.net/indexes?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-target-index",
    "fields": [
        { "name": "id", "type": "Edm.String", "key": true, "searchable": false },
        { "name": "booktitle", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false }
    ]
}

5 - インデクサーを作成する

インデクサーはデータ ソースをターゲットの検索インデックスに接続し、データ更新を自動化するスケジュールを提供します。 インデックスとデータ ソースを作成したら、インデクサーを作成できます。 インデクサーが成功した場合、接続構文とロールの割り当ては有効です。

次に、Azure SQL インデクサー定義を使用して [インデックスの作成] REST API を呼び出す方法を示します。 要求を送信すると、インデクサーが実行されます。

POST https://[service name].search.windows.net/indexers?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-indexer",
    "dataSourceName" : "sql-datasource",
    "targetIndexName" : "my-target-index"
}

インデクサーからデータ ソースへの接続を試みたときに、クライアントではサーバーへのアクセスが許可されていないことを示すエラーを受信した場合は、一般的なインデクサー エラーに関する記事を参照してください。

関連項目

Azure SQL インデクサー