cosmosdb_sql_request 插件

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

cosmosdb_sql_request 插件会将 SQL 查询发送到 Azure Cosmos DB SQL 网络终结点,并返回查询的结果。 此插件主要为查询小数据集而设计,例如,使用存储在 Azure Cosmos DB 中的参考数据来扩充数据。 该插件通过 evaluate 运算符调用。

语法

evaluate cosmosdb_sql_request ( ConnectionString , SqlQuery [, SqlParameters [, Options]] ) [: OutputSchema]

详细了解语法约定

参数

客户 类型​​ 必需 描述
ConnectionString string ✔️ 指向要查询的 Azure Cosmos DB 集合的连接字符串。 它必须包括“AccountEndpoint”、“Database”和“Collection”。 如果主密钥用于身份验证,则可能包括“AccountKey”。 有关详细信息,请参阅身份验证和授权
示例:'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;AccountKey='h'<AccountKey>'
SqlQuery string ✔️ 要执行的查询。
SqlParameters dynamic 要作为参数与查询一起传递的属性包对象。 参数名称必须以 @ 开头。
OutputSchema cosmosdb_sql_request 插件输出的所需列的名称和类型。 使用以下语法:( ColumnName : ColumnType [, ...] )。 指定此参数可启用多个查询优化。
选项 dynamic 高级设置的属性包对象。 如果未在 ConnectionString 中提供 AccountKey,则此参数的 armResourceId 字段是必需的。 有关详细信息,请参阅支持的选项

支持的选项

下表描述了 Options 参数支持的字段。

名称 Type 描述
armResourceId string Cosmos DB 数据库的 Azure 资源管理器资源 ID。 如果未在连接字符串参数中提供帐户密钥,则此字段是必需的。 在这种情况下,将使用 armResourceId 向 Cosmos DB 进行身份验证。
示例:armResourceId='/subscriptions/<SubscriptionId>/resourceGroups/<ResourceGroup>/providers/Microsoft.DocumentDb/databaseAccounts/<DatabaseAccount>'
token string 有权访问 Cosmos DB 数据库的主体的 Microsoft Entra 访问令牌。 此令牌与 armResourceId 一起使用,用于向 Azure 资源管理器进行身份验证。 如果未指定此项,则使用进行查询的主体的令牌。

如果未指定 armResourceId,则使用该令牌直接访问 Cosmos DB 数据库。 有关令牌身份验证方法的详细信息,请参阅身份验证和授权
preferredLocations string 要从中查询数据的区域。
示例:['China East 2']

身份验证和授权

若要向 Azure Cosmos DB SQL 网络终结点进行授权,需要指定授权信息。 下表提供了支持的身份验证方法以及如何使用该方法的说明。

身份验证方法 说明
托管标识(建议) Authentication="Active Directory Managed Identity";User Id={object_id}; 追加到连接字符串。 请求是代表托管标识发出的,该标识必须具有对数据库的适当权限。
若要启用托管标识身份验证,必须将托管标识添加到群集并更改托管标识策略。 有关详细信息,请参阅托管标识策略
Azure Resource Manager 资源 ID 此身份验证方法需要在选项中指定 armResourceIdtoken(可选)。 armResourceId 标识 Cosmos DB 数据库帐户,并且必须 token 是具有 Cosmos DB 数据库访问权限的主体的有效 Microsoft Entra 持有者令牌。 如果未提供 token,则将使用请求主体的 Microsoft Entra 令牌进行身份验证。
帐户密钥 可以将帐户密钥直接添加到 ConnectionString 参数。 但是,此方法要求在查询文本中包含机密,因此不太安全,并且不能灵活应对将来帐户密钥的更改。 若要增强安全性,请将机密作为经过模糊处理的字符串字面量隐藏。
令牌 可以在插件选项中添加令牌值。 令牌必须属于具有相关权限的主体。 为了增强安全性,请将令牌隐藏为模糊字符串字面量

设置标注策略

该插件会对 Azure Cosmos DB 实例进行标注。 请确保群集的标注策略允许对目标 CosmosDbUri 进行 cosmosdb 类型的调用。

以下示例演示如何为 Azure Cosmos DB 定义标注策略。 建议将其限制为特定的终结点(my_endpoint1my_endpoint2)。

[
  {
    "CalloutType": "CosmosDB",
    "CalloutUriRegex": "my_endpoint1\\.documents\\.chinacloudapi\\.cn",
    "CanCall": true
  },
  {
    "CalloutType": "CosmosDB",
    "CalloutUriRegex": "my_endpoint2\\.documents\\.chinacloudapi\\.cn",
    "CanCall": true
  }
]

以下示例显示了针对 cosmosdb CalloutType 的 alter callout policy 命令

.alter cluster policy callout @'[{"CalloutType": "cosmosdb", "CalloutUriRegex": "\\.documents\\.chinacloudapi\\.cn", "CanCall": true}]'

示例

以下示例使用括号中的占位符文本。

使用查询定义的输出架构查询 Azure Cosmos DB

以下示例使用 cosmosdb_sql_request 插件在仅选择特定列时发送 SQL 查询。 此查询使用显式架构定义,以便在针对 Cosmos DB 运行实际查询之前进行各种优化。

evaluate cosmosdb_sql_request(
  'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;AccountKey='h'<AccountKey>',
  'SELECT c.Id, c.Name from c') : (Id:long, Name:string) 

查询 Azure Cosmos DB

以下示例使用 cosmosdb_sql_request 插件发送 SQL 查询,以便使用其 Azure Cosmos DB for NoSQL 从 Azure Cosmos DB 提取数据。

evaluate cosmosdb_sql_request(
  'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;AccountKey='h'<AccountKey>',
  'SELECT * from c') // OutputSchema is unknown, so it is not specified. This may harm the performance of the query.

使用参数查询 Azure Cosmos DB

以下示例使用 SQL 查询参数从备用区域查询数据。

evaluate cosmosdb_sql_request(
   'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;AccountKey='h'<AccountKey>',
    "SELECT c.id, c.lastName, @param0 as Column0 FROM c WHERE c.dob >= '1970-01-01T00:00:00Z'",
    dynamic({'@param0': datetime(2019-04-16 16:47:26.7423305)}),
    dynamic({'preferredLocations': ['China East 2']})) : (Id:long, Name:string, Column0: datetime) 
| where lastName == 'Smith'

查询 Azure Cosmos DB 并将数据加入数据库表

以下示例使用 Partner 字段联接 Azure Cosmos DB 中的合作伙伴数据与数据库中的合作伙伴数据。 它会生成一个合作伙伴列表,其中包含他们的电话号码、网站和联系电子邮件地址,并按合作伙伴名称排序。

evaluate cosmosdb_sql_request(
    'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;AccountKey='h'<AccountKey>',
    "SELECT c.id, c.Partner, c. phoneNumber FROM c') : (Id:long, Partner:string, phoneNumber:string) 
| join kind=innerunique Partner on Partner
| project id, Partner, phoneNumber, website, Contact
| sort by Partner

使用令牌身份验证查询 Azure Cosmos DB

以下示例使用 Partner 字段联接 Azure Cosmos DB 中的合作伙伴数据与数据库中的合作伙伴数据。 它会生成一个合作伙伴列表,其中包含他们的电话号码、网站和联系电子邮件地址,并按合作伙伴名称排序。

evaluate cosmosdb_sql_request(
    'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;',
    "SELECT c.Id, c.Name, c.City FROM c",
    dynamic(null),
    dynamic({'token': h'abc123...'})
) : (Id:long, Name:string, City:string)

使用 Azure 资源管理器资源 ID 查询 Azure Cosmos DB 进行身份验证

以下示例使用 Azure 资源管理器资源 ID 进行身份验证,并使用请求主体的 Microsoft Entra 令牌(因为未指定令牌)。 它在仅选择特定列时发送 SQL 查询并指定明确的架构定义。

evaluate cosmosdb_sql_request(
    'AccountEndpoint=https://cosmosdbacc.documents.azure.cn/;Database=<MyDatabase>;Collection=<MyCollection>;',
    "SELECT c.Id, c.Name, c.City FROM c",
    dynamic({'armResourceId': '/subscriptions/<SubscriptionId>/resourceGroups/<ResourceGroup>/providers/Microsoft.DocumentDb/databaseAccounts/<DatabaseAccount>'})
) : (Id:long, Name:string, City:string)