透過受控識別設定 Azure Cosmos DB 的索引器連線
本文說明如何使用受控識別來設定 Azure Cosmos DB 資料庫的索引器連線,而不是在 連接字串 中提供認證。
您可以使用系統指派的受控識別或使用者指派的受控識別 (預覽版)。 受控識別是 Microsoft Entra 登入,需要 Azure 角色指派才能存取 Azure Cosmos DB 中的數據。
必要條件
為您的搜尋服務建立受控識別。
將 Cosmos DB 帳戶讀取者 角色指派給搜尋服務受控識別。 此角色會授與讀取 Azure Cosmos DB 帳戶數據的能力。 如需 Cosmos DB 中角色指派的詳細資訊,請參閱 設定數據的角色型訪問控制。
數據平面角色指派:遵循 數據平面角色指派 以深入瞭解。
唯讀資料平面角色指派的範例:
$cosmosdb_acc_name = <cosmos db account name>
$resource_group = <resource group name>
$subsciption = <subscription id>
$system_assigned_principal = <principal id for system assigned identity>
$readOnlyRoleDefinitionId = "00000000-0000-0000-0000-000000000001"
$scope=$(az cosmosdb show --name $cosmosdbname --resource-group $resourcegroup --query id --output tsv)
系統指派身分識別的角色指派:
az cosmosdb sql role assignment create --account-name $cosmosdbname --resource-group $resourcegroup --role-definition-id $readOnlyRoleDefinitionId --principal-id $sys_principal --scope $scope
針對適用於 NoSQL 的 Cosmos DB,您可以選擇性地將 Cosmos DB 帳戶設定
disableLocalAuth
true
為 ,以角色型存取作為數據連線的唯一驗證方法。針對 Gremlin 和 MongoDB 集合:索引器支援目前為預覽狀態。 目前有預覽限制,需要 Azure AI 搜尋才能使用密鑰進行連線。 您仍然可以設定受控識別和角色指派,但 Azure AI 搜尋只會使用角色指派來取得連線的密鑰。 這項限制表示,如果您的索引器使用具有受控識別的搜尋來連線到 Azure Cosmos DB,則無法設定 角色型方法 。
建立資料來源
建立數據源,並在 連接字串 中提供系統指派的受控識別或使用者指派的受控識別(預覽)。
系統指派的受控識別
REST API、Azure 入口網站 和 .NET SDK 支援使用系統指派的受控識別。
當您使用系統指派的受控識別進行連線時,資料來源定義中只需要變更 "credentials" 屬性的格式。 您將提供沒有帳戶金鑰或密碼的資料庫名稱和 ResourceId。 ResourceId 必須包含 Azure Cosmos DB 的訂用帳戶標識碼、資源群組和 Azure Cosmos DB 帳戶名稱。
- 針對 SQL 集合,連接字串 不需要 “ApiKind”。
- 針對 SQL 集合,如果以角色為基礎的存取強制為唯一的驗證方法,請新增 「IdentityAuthType=AccessToken」。。 不適用於 MongoDB 和 Gremlin 集合。
- 針對 MongoDB 集合,將 “ApiKind=MongoDb” 新增至 連接字串,並使用預覽 REST API。
- 針對 Gremlin 圖形,請將 “ApiKind=Gremlin” 新增至 連接字串,並使用預覽 REST API。
以下示範如何使用建立資料來源 REST API 和受控識別連接字串,建立資料來源以便為來自儲存體帳戶的資料編製索引。 對於 REST API、.NET SDK 和 Azure 入口網站,受控識別連接字串格式都相同。
POST https://[service name].search.windows.net/datasources?api-version=2020-06-30
Content-Type: application/json
api-key: [Search service admin key]
{
"name": "[my-cosmosdb-ds]",
"type": "cosmosdb",
"credentials": {
"connectionString": "ResourceId=/subscriptions/[subscription-id]/resourceGroups/[rg-name]/providers/Microsoft.DocumentDB/databaseAccounts/[cosmos-account-name];Database=[cosmos-database];ApiKind=[SQL | Gremlin | MongoDB];IdentityAuthType=[AccessToken | AccountKey]"
},
"container": { "name": "[my-cosmos-collection]", "query": null },
"dataChangeDetectionPolicy": null
}
使用者指派的受控識別 (預覽)
2021-04-30-preview REST API 支援以使用者指派的受控識別為基礎的連線。 當您使用使用者指派的受控識別進行連線時,數據源定義有兩個變更:
首先,「credentials」 屬性的格式是資料庫名稱和沒有帳戶密鑰或密碼的 ResourceId。 ResourceId 必須包含 Azure Cosmos DB 的訂用帳戶標識碼、資源群組和 Azure Cosmos DB 帳戶名稱。
- 針對 SQL 集合,連接字串 不需要 “ApiKind”。
- 針對 SQL 集合,如果以角色為基礎的存取強制為唯一的驗證方法,請新增 「IdentityAuthType=AccessToken」。。 不適用於 MongoDB 和 Gremlin 集合。
- 針對 MongoDB 集合,將 “ApiKind=MongoDb” 新增至 連接字串
- 針對 Gremlin 圖形,請將 “ApiKind=Gremlin” 新增至 連接字串。
其次,您會新增包含使用者指派受控識別集合的「身分識別」屬性。 建立數據源時,應該只提供一個使用者指派的受控識別。 將它設定為輸入 「userAssignedIdentities」。。
以下是如何使用預覽建立或更新資料來源 REST API 來建立索引器數據源物件的範例:
POST https://[service name].search.windows.net/datasources?api-version=2021-04-30-preview
Content-Type: application/json
api-key: [Search service admin key]
{
"name": "[my-cosmosdb-ds]",
"type": "cosmosdb",
"credentials": {
"connectionString": "ResourceId=/subscriptions/[subscription-id]/resourceGroups/[rg-name]/providers/Microsoft.DocumentDB/databaseAccounts/[cosmos-account-name];Database=[cosmos-database];ApiKind=[SQL | Gremlin | MongoDB];IdentityAuthType=[AccessToken | AccountKey]"
},
"container": {
"name": "[my-cosmos-collection]", "query": null
},
"identity" : {
"@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
"userAssignedIdentity": "/subscriptions/[subscription-id]/resourcegroups/[rg-name]/providers/Microsoft.ManagedIdentity/userAssignedIdentities/[my-user-managed-identity-name]"
},
"dataChangeDetectionPolicy": null
}
建立索引
索引會指定文件、屬性和其他建構中可形塑搜尋體驗的欄位。
以下的建立索引 REST API 呼叫使用可搜尋的 booktitle
欄位:
POST https://[service name].search.windows.net/indexes?api-version=2020-06-30
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 }
]
}
建立索引器
索引子會以目標搜尋索引連接資料來源,並提供排程來將資料重新整理自動化。 建立索引和數據源之後,您就可以建立並執行索引器。 如果索引器成功,連線語法和角色指派是有效的。
以下是使用 適用於 NoSQL 索引器定義的 Azure Cosmos DB 建立索引器 REST API 呼叫。 索引器會在您提交要求時執行。
POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]
{
"name" : "cosmos-db-indexer",
"dataSourceName" : "cosmos-db-datasource",
"targetIndexName" : "my-target-index"
}
疑難排解
如果您最近輪替 Azure Cosmos DB 帳戶密鑰,您最多需要等候 15 分鐘,才能讓受控識別 連接字串 運作。
檢查 Azure Cosmos DB 帳戶是否具有限制為選取網路的存取權。 您可以藉由嘗試連線而不限制來排除任何防火牆問題。