Logic App 中的 MS Graph 分页,结果导出到 Azure Blob 存储中
MS Graph pagination in Logic App with result export in Azure Blob storage
我想做什么:
我正在尝试检索所有用户最近 24 小时的登录日志并将其保存在 blob 存储中。在第一个结果集创建 blob 后,下一个结果集将使用下一个剩余结果更新 blob 文件。
考虑使用 blob 存储和 MS Graph,因为 Graph 输出包含我想要的所有详细信息,而无需跳过 Powershell 中的各种环节来扩展某些属性,而且结果大小很大(通过导出超过 1GB) -PowerShell 中的 CSV)。
我是怎么做的
一个预定的 运行,它执行一个 HTTP 请求,其中的图形查询在最后 24 小时过滤后创建一个以 HTTP 正文作为内容的块。在创建 Blob 之后,我添加了一个 (Do) Until 控制 运行s 直到 HTTP Body 不包含 @odata.nextLink 并更新 blob 文件。
问题:
- 第一个问题是 Until 循环在 6 秒内完成。
- 第二个问题是blob文件只包含第一个结果集,通常大小为9.3MB。这意味着下一个结果集不会被访问并附加到现有的 blob 文件。
我的研究
我尝试启用和禁用分页、各种分页阈值、自定义函数,但没有任何意义(至少对我而言),我正在尝试遵循 KISS 模型。
我看了看并尝试以一种形式应用或从下面形成答案 S.O。问题:
| | Microsoft graph, batch request's nextLink | https://docs.microsoft.com/en-us/graph/paging;
我正在尝试的代码
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_blob": {
"inputs": {
"body": "@body('fRequest')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/graph",
"name": "DoUntil",
"queryParametersSingleEncoded": true
}
},
"runAfter": {
"fRequest": [
"Succeeded"
]
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
},
"type": "ApiConnection"
},
"Until": {
"actions": {
"Update_blob": {
"inputs": {
"body": "@body('fRequest')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "put",
"path": "/datasets/default/files/@{encodeURIComponent(encodeURIComponent('/graph/DoUntil'))}"
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@not(contains(body('fRequest'), '@odata.nextLink'))",
"limit": {
"count": 60,
"timeout": "PT1H"
},
"runAfter": {
"Create_blob": [
"Succeeded"
]
},
"type": "Until"
},
"fRequest": {
"inputs": {
"authentication": {
"audience": "https://graph.microsoft.com",
"clientId": "registered_app",
"secret": "app_secret",
"tenant": "tenant_id",
"type": "ActiveDirectoryOAuth"
},
"method": "GET",
"uri": "https://graph.microsoft.com/beta/auditLogs/signIns?$filter=createdDateTime gt @{addDays(utcNow(),-1)}"
},
"runAfter": {},
"runtimeConfiguration": {
"paginationPolicy": {
"minimumItemCount": 500
}
},
"type": "Http"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Week",
"interval": 7,
"schedule": {
"hours": [
"7"
],
"minutes": [
0
]
}
},
"type": "Recurrence"
}
}
},
"parameters": {
"$connections": {
"value": {
"azureblob": {
"connectionId": "/subscriptions/subscription_id/resourceGroups/Apps/providers/Microsoft.Web/connections/azureblob",
"connectionName": "azureblob",
"id": "/subscriptions/subscription_id/providers/Microsoft.Web/locations/eastus/managedApis/azureblob"
}
}
}
}
}
我做错了什么或遗漏了什么?
提前致谢!
我设法将分页阈值提高到 20000,现在我的文件不再是 9MB,它们达到了 200MB。我还删除了“Do”循环。现在我只需要创建一个中断来避开阈值并恢复收集剩余页面的结果。
我想做什么:
我正在尝试检索所有用户最近 24 小时的登录日志并将其保存在 blob 存储中。在第一个结果集创建 blob 后,下一个结果集将使用下一个剩余结果更新 blob 文件。
考虑使用 blob 存储和 MS Graph,因为 Graph 输出包含我想要的所有详细信息,而无需跳过 Powershell 中的各种环节来扩展某些属性,而且结果大小很大(通过导出超过 1GB) -PowerShell 中的 CSV)。
我是怎么做的
一个预定的 运行,它执行一个 HTTP 请求,其中的图形查询在最后 24 小时过滤后创建一个以 HTTP 正文作为内容的块。在创建 Blob 之后,我添加了一个 (Do) Until 控制 运行s 直到 HTTP Body 不包含 @odata.nextLink 并更新 blob 文件。
问题:
- 第一个问题是 Until 循环在 6 秒内完成。
- 第二个问题是blob文件只包含第一个结果集,通常大小为9.3MB。这意味着下一个结果集不会被访问并附加到现有的 blob 文件。
我的研究
我尝试启用和禁用分页、各种分页阈值、自定义函数,但没有任何意义(至少对我而言),我正在尝试遵循 KISS 模型。
我看了看并尝试以一种形式应用或从下面形成答案 S.O。问题:
我正在尝试的代码
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_blob": {
"inputs": {
"body": "@body('fRequest')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "post",
"path": "/datasets/default/files",
"queries": {
"folderPath": "/graph",
"name": "DoUntil",
"queryParametersSingleEncoded": true
}
},
"runAfter": {
"fRequest": [
"Succeeded"
]
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
},
"type": "ApiConnection"
},
"Until": {
"actions": {
"Update_blob": {
"inputs": {
"body": "@body('fRequest')",
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "put",
"path": "/datasets/default/files/@{encodeURIComponent(encodeURIComponent('/graph/DoUntil'))}"
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@not(contains(body('fRequest'), '@odata.nextLink'))",
"limit": {
"count": 60,
"timeout": "PT1H"
},
"runAfter": {
"Create_blob": [
"Succeeded"
]
},
"type": "Until"
},
"fRequest": {
"inputs": {
"authentication": {
"audience": "https://graph.microsoft.com",
"clientId": "registered_app",
"secret": "app_secret",
"tenant": "tenant_id",
"type": "ActiveDirectoryOAuth"
},
"method": "GET",
"uri": "https://graph.microsoft.com/beta/auditLogs/signIns?$filter=createdDateTime gt @{addDays(utcNow(),-1)}"
},
"runAfter": {},
"runtimeConfiguration": {
"paginationPolicy": {
"minimumItemCount": 500
}
},
"type": "Http"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Week",
"interval": 7,
"schedule": {
"hours": [
"7"
],
"minutes": [
0
]
}
},
"type": "Recurrence"
}
}
},
"parameters": {
"$connections": {
"value": {
"azureblob": {
"connectionId": "/subscriptions/subscription_id/resourceGroups/Apps/providers/Microsoft.Web/connections/azureblob",
"connectionName": "azureblob",
"id": "/subscriptions/subscription_id/providers/Microsoft.Web/locations/eastus/managedApis/azureblob"
}
}
}
}
}
我做错了什么或遗漏了什么? 提前致谢!
我设法将分页阈值提高到 20000,现在我的文件不再是 9MB,它们达到了 200MB。我还删除了“Do”循环。现在我只需要创建一个中断来避开阈值并恢复收集剩余页面的结果。