用受控識別來設定與 Azure SQL Database 索引子的連線
本文說明如何使用受控識別來設定與 Azure SQL Database 索引子的連線,而不是在連接字串中提供認證。
您可以使用系統指派的受控識別或使用者指派的受控識別 (預覽版)。 受控識別是 Microsoft Entra 登入,需要 Azure 角色指派才能存取 Azure SQL 中的資料。
必要條件
為您的搜尋服務建立受控識別。
在 SQL 中指派 Azure 系統管理員角色。 在索引子連線中使用的身分識別需要讀取權限。 您必須是具有 SQL Database 伺服器或 SQL 受控執行個體的 Microsoft Entra 管理員,才能授與資料庫讀取權限。
1 - 指派權限來讀取資料庫
請遵循下列步驟來指派權限給搜尋服務或使用者指派的受控識別,以讀取該資料庫。
連線到 Visual Studio。
使用您的 Microsoft Entra 帳戶進行驗證。
執行下列命令:
在您的搜尋服務名稱或使用者指派的受控識別名稱周圍加上括弧。
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];
指派權限之後,如果您稍後變更搜尋服務或使用者指派的受控識別,則必須移除角色成員資格,並移除在 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 - 新增角色指派
在本節中,您將提供 Azure AI 搜尋服務的權限,以從您的 SQL Server 讀取資料。 如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
在 Azure 入口網站瀏覽至您的 Azure SQL Server 頁面。
選取 [存取控制 (IAM)]。
選取 [新增] > [新增角色指派]。
在 [角色] 索引標籤上,請選取適當的 [讀者] 角色。
在 [成員] 索引標籤上,選取 [受控識別],然後選取 [選取成員]。
選取 Azure 訂閱。
如果您使用系統指派的受控識別,請選取 [系統指派的受控識別],搜尋您的搜尋服務,然後選取它。
否則,如果您使用使用者指派的受控識別,請選取 [使用者指派的受控識別],搜尋使用者指派的受控識別名稱並選取。
在 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派] 以指派角色。
3 - 建立資料來源
建立資料來源,並提供系統指派的受控識別或使用者指派的受控識別 (預覽版)。
系統指派的受控識別
REST API、Azure 入口網站和 .NET SDK 支援系統指派的受控識別。
當您使用系統指派的受控識別進行連線時,資料來源定義中只需要變更 "credentials" 屬性的格式。 您將提供初始目錄或資料庫名稱,以及沒有帳戶金鑰或密碼的 ResourceId。 ResourceId 務必包含 Azure SQL Database 的訂閱識別碼、SQL 資料庫的資源群組,以及 SQL 資料庫的名稱。
以下示範如何使用建立資料來源 REST API 和受控識別連接字串,建立資料來源以便為來自儲存體帳戶的資料編製索引。 對於 REST API、.NET SDK 和 Azure 入口網站,受控識別連接字串格式都相同。
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"
}
}
使用者指派的受控識別 (預覽版)
2021-04-30-preview 和更新版本的預覽 REST API 支援以使用者指派的受控識別為基礎的連線。 當您使用使用者指派的受控識別進行連線時,資料來源定義會有兩項變更:
首先,"credentials" 屬性的格式是初始目錄或資料庫名稱,以及沒有帳戶金鑰或密碼的 ResourceId。 ResourceId 務必包含 Azure SQL Database 的訂閱識別碼、SQL 資料庫的資源群組,以及 SQL 資料庫的名稱。 系統指派的受控識別格式與此格式相同。
其次,新增一個 "identity" 屬性,其中包含使用者指派的受控識別的集合。 建立資料來源時,應該只提供一個使用者指派的受控識別。 將其設定為類型 "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 - 建立索引
索引會指定文件、屬性和其他建構中可形塑搜尋體驗的欄位。
以下的建立索引 REST API 呼叫使用可搜尋的 booktitle
欄位:
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 - 建立索引子
索引子會以目標搜尋索引連接資料來源,並提供排程來自動重新整理資料。 建立索引與資料來源之後,您就可以開始建立索引子。 如果索引子成功,則連接語法和角色指派有效。
以下的建立索引子 REST API 呼叫使用 Azure SQL 索引子定義。 索引子會在您提交要求時執行。
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"
}
如果您在索引子嘗試連線至資料來源時收到錯誤,並指出不允許用戶端存取伺服器,請參閱常見的索引子錯誤。