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 文件。

问题:

  1. 第一个问题是 Until 循环在 6 秒内完成。
  2. 第二个问题是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”循环。现在我只需要创建一个中断来避开阈值并恢复收集剩余页面的结果。