首页 > 解决方案 > 如何在 Azure 函数输出绑定中禁用 Blob 存在检查

问题描述

我的 Azure 函数注释定义如下。Blob 触发器从存储帐户进程读取数据并使用返回值将输出写入绑定中定义的“文件名”.json 的 Blob 容器。

这按预期工作;但是,在将数据写入 blob 容器时。输出绑定通过“GET”请求检查是否存在 Blob,并最终在发出“PUT”请求之前进入 404 响应代码。这是在 Application Insights 中捕获的。

有什么办法可以覆盖这种行为? 此处为 Log Analytics 的屏幕截图

函数绑定

public class ProcessZipFiles2Cosmos {
    
    @FunctionName("ProcessZipFiles2Cosmos")
    @StorageAccount("blobStorageAccount")
    @BlobOutput(name = "blob_redacted_json", path = "nonpii/{filename}.json")
    public static String run(
        @BlobTrigger(name = "files", dataType = "binary", path = "transactedreturn/{name}", connection = "blobStorageAccount") byte[] content,
        @BindingName("name") String filename,
        @CosmosDBOutput(name = "cosmos_transacted", databaseName = "tax-return-data-ops", collectionName = "TransactedReturns", 
                        connectionStringSetting = "AzureCosmosDBConnection") OutputBinding<String> cosmosItem,
        final ExecutionContext context) {
        
        // function body
    }
}

函数.JSON

{
   "scriptFile":"../transactedreturn-1.0.0-SNAPSHOT.jar",
   "entryPoint":"com.hrblock.clzconverter.ProcessZipFiles2Cosmos.run",
   "bindings":[
      {
         "type":"blobTrigger",
         "direction":"in",
         "name":"files",
         "path":"transactedreturn/{name}",
         "dataType":"binary",
         "connection":"blobStorageAccount"
      },
      {
         "type":"cosmosDB",
         "direction":"out",
         "name":"cosmos_transacted",
         "databaseName":"tax-return-data-ops",
         "connectionStringSetting":"AzureCosmosDBConnection",
         "collectionName":"TransactedReturns"
      },
      {
         "type":"blob",
         "direction":"out",
         "name":"$return",
         "path":"nonpii/{filename}.json",
         "connection":"blobStorageAccount"
      }
   ]
}

标签: azureazure-functionsazure-blob-storageazure-log-analyticsazure-java-sdk

解决方案


当您说“覆盖此行为”时,我认为您想规避“存在”检查,这最终导致 404(如我所见),由Blob绑定完成。虽然这是可能的,但它并没有真正起到任何实际作用。预期的404真的那么糟糕吗?

至于“为什么”会发生这种情况,我的猜测是它是在检查现有容器或其他资源时发生的,这对于您的特定Blob. 仅凭我们所知道的,很难判断它到底发生在哪里,但是在 WebJobs SDK 中看到的注释专门调用ExistsAsync以限制预期的 40x 状态代码。如果深入到实现 的Microsoft.Azure.Storage.Blobrepo 中ExistsAsync,您可以看到ExistsImpl 预期的 404 状态代码来确定资源是否存在。

为了规避 404,您也许可以只使用BlobClient自己,然后直接创建您需要创建的内容,而无需检查现有资源。不过,一个公平的警告,这最终可能会导致比预期的 404 更多的问题(而且,404 几乎不会导致任何问题,因为它是由 SDK 和存储库处理的)。


推荐阅读