如何在Azure函数输出绑定中禁用Blob存在检查

问题描述

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

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

有什么办法可以覆盖此行为? Screen shot of Log analytics here

功能绑定

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
    }
}

FUNCTION.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","name":"$return","path":"nonpii/{filename}.json","connection":"blobStorageAccount"
      }
   ]
}

解决方法

当您说“覆盖此行为”时,我认为您想绕过“存在”检查,该检查最终导致由Blob绑定完成的404(如我所见)。尽管这是可能的,但实际上并没有任何实际目的。 预期 404真的那么糟糕吗?

关于“为什么”发生,我猜测是在检查您的特定Blob所需的现有容器或其他资源时发生的。仅凭我们所知,很难说出它到底在哪里发生,但是看到的in the WebJobs SDK注释专门调用了ExistsAsync来限制预期的40倍状态代码。如果有人深入实施Microsoft.Azure.Storage.Blob的{​​{1}}回购中,则可以看到ExistsAsync expecting a 404 status code以确定资源是否存在。

要规避404,您可以自己使用BlobClient,直接进行创建需要创建的内容,而无需检查现有资源。虽然有一个合理的警告,但这最终可能会导致比预期的404问题更多的问题(而且,由于404由SDK和存储库处理,因此404几乎不会引起任何问题)。