查询 Azure 资源的日志
在 Azure Monitor Log Analytics 中,查询通常在工作区的上下文中执行。 一个工作区可以包含许多资源的数据,因此很难隔离特定资源的数据。 此外,资源还可将数据发送到多个工作区。 为了简化这种体验,REST API 允许直接查询 Azure 资源以获取其日志。
响应格式
Azure 资源查询会生成与针对 Log Analytics 工作区的查询相同的响应形状。
URL 格式
假设某个 Azure 资源使用完全限定的标识符:
/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>
针对直接 API 终结点查询此资源的日志时会转到以下 URL:
https://api.loganalytics.azure.cn/v1/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/query
通过 ARM 对同一资源运行的查询将使用以下 URL:
https://management.chinacloudapi.cn/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/providers/microsoft.insights/logs?api-version=2018-03-01-preview
实质上,此 URL 是完全限定的 Azure 资源加上扩展提供程序:/providers/microsoft.insights/logs
。
表访问和 RBAC
microsoft.insights
资源提供程序公开一组新的操作,用于在表级别控制对日志的访问。 对于名为 tableName
的表,这些操作采用以下格式。
microsoft.insights/logs/<tableName>/read
可以使用 actions
属性允许使用指定的表,并使用 notActions
属性禁止使用指定的表来将此权限添加到角色。
工作区访问控制
Azure 资源查询将 Log Analytics 工作区视为可能的数据源。 但管理员可以通过 RBAC 角色锁定对工作区的访问权限。 默认情况下,API 仅返回用户有权访问的工作区中的结果。
工作区管理员可以使用 Azure 资源查询,而不会中断现有的 RBAC。 借助工作区上的布尔属性,具有读取权限的用户可以查看特定 Azure 资源的日志,但不可查询包含这些日志的工作区。
这是将访问范围限定为工作区级别的表的操作:
microsoft.operationalinsights/workspaces/query/<tableName>/read
错误响应
下面简要列出了查询 Azure 资源时出现的常见失败情况以及症状行为的描述。
Azure 资源不存在
HTTP/1.1 404 Not Found
{
"error": {
"message": "The resource /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/test-rg/providers/microsoft.storage/storageaccounts/exampleResource was not found",
"code": "ResourceNotFoundError"
}
}
}
无权访问资源
HTTP/1.1 403 Forbidden
{
"error": {
"message": "The provided credentials have insufficient access to perform the requested operation",
"code": "InsufficientAccessError",
"innererror": {
"code": "AuthorizationFailedError",
"message": "User '92eba38a-70da-42b0-ab83-ffe82cce658f' does not have access to read logs for this resource"
}
}
}
资源中没有日志,或者对包含这些日志的工作区没有权限
根据数据和权限的精确组合,响应可能包含 200 而无结果数据,也可能引发语法错误(4xx 错误)。
部分访问权限
在某些情况下,用户可能对特定资源的日志拥有部分访问权限。 如果用户缺少以下任一权限,则会发生这种情况:
- 对包含 Azure 资源日志的工作区的访问权限。
- 对查询中的表引用的访问权限。
用户会看到常规响应,其中已按无提示方式筛选掉用户无权访问的数据源。要查看有关用户对 Azure 资源、基础 Log Analytics 工作区以及特定表的访问权限的信息,请在请求中包含标头 Prefer: include-permissions=true
。 这会导致响应 JSON 包含如下所示的部分:
{
"permissions": {
"resources": [
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM1",
"dataSources": [
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1"
]
},
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM2",
"denyTables": [
"SecurityEvent",
"SecurityBaseline"
],
"dataSources": [
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2",
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS3"
]
}
],
"dataSources": [
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1",
"denyTables": [
"Tables.Custom"
]
},
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2"
}
]
}
}
resources
有效负载描述查询两个 VM 的尝试。 VM1 将数据发送到工作区 WS1,而 VM2 将数据发送到两个工作区:WS2 和 WS3。 此外,用户无权查询资源的 SecurityEvent
或 SecurityBaseline
表。
dataSources
有效负载通过描述用户可查询的工作区来进一步筛选结果。 用户无权在此处查询 WS3,以及从 WS1 中筛选掉的另一个表。
下面清楚地说明了此类查询会返回哪些数据:
- WS1 中 VM1 的日志,不包括表。 从工作区自定义。
- WS2 中 VM2 的日志,不包括 SecurityEvent 和 SecurityBaseline。