Re-play/Repeat/Re-Fire 现有文件的 Azure Blob 存储函数触发器

Re-play/Repeat/Re-Fire Azure BlobStorage Function Triggers for existing files

我刚刚将几十 GB 的文件上传到 Azure CloudStorage。 每个文件都应由 FunctionApp 获取和处理,以响应 BlobTrigger:

[FunctionName(nameof(ImportDataFile))]
public async Task ImportDataFile(
    // Raw JSON Text file containing data updates in expected schema
    [BlobTrigger("%AzureStorage:DataFileBlobContainer%/{fileName}", Connection = "AzureStorage:ConnectionString")]
    Stream blobStream,
    string fileName)
{
    //...
}

这通常有效,但愚蠢的是,在将所有文件上传到我们的 UAT 系统之前,我没有对该功能进行最终测试……上传出现问题:(

上传花了几天时间(运行 由于 CoViD-19,我通过国内互联网上传)所以我真的不想重做。

有什么方法可以 "replay" BlobUpload 触发器吗? 以便函数再次触发,就像我刚刚重新上传文件一样......没有必须再次传输任何数据!

根据这个link

Azure Functions stores blob receipts in a container named azure-webjobs-hosts in the Azure storage account for your function app (defined by the app setting AzureWebJobsStorage).

To force reprocessing of a blob, delete the blob receipt for that blob from the azure-webjobs-hosts container manually. While reprocessing might not occur immediately, it's guaranteed to occur at a later point in time. To reprocess immediately, the scaninfo blob in azure-webjobs-hosts/blobscaninfo can be updated. Any blobs with a last modified timestamp after the LatestScan property will be scanned again.

我发现了一个 hacky-AF 解决方法,它重新处理现有文件:

如果将元数据添加到 blob,这似乎会重新触发 BlobStorage 函数触发器。

已在 Azure 存储资源管理器中访问,但右键单击 Blob >“属性”>“添加元数据”。

我是设置键:"ForceRefresh",值"test"。

我找到了一个解决方法,如果你不在文件名上投资的话:

Azure 存储资源管理器,在顶部栏中有一个 "Clone with new name" 按钮,它将添加一个新文件(并触发函数),而无需通过本地计算机传输数据。

请注意,"Copy" 后跟 "Paste" 也会重新触发 blob,但似乎会将数据传输到您的计算机,然后再次备份... 难以置信慢慢来!

我在处理代码中的 blob 时遇到问题,这意味着 webjobs-blobtrigger-poison 队列中有一堆消息。我不得不将它们移回 azure-webjobs-blobtrigger-name-of-function-app。如果没有上述步骤,删除 blob 收据和调整 scaninfo blob 将不起作用。

幸运的是,Azure 存储资源管理器有一个菜单选项可以将消息从一个队列移动到另一个队列: