Search code examples
pythonazureazure-functionsazure-blob-storageazure-blob-trigger

Azure blob trigger error :The condition specified using HTTP conditional header(s) is not met


Im using a python azure function to get the trigger from azure blob using below code

import azure.functions as func
def main(blobdata: func.InputStream):
    totalprocessingtime = time.time()
    filename=os.path.basename(blobdata.name)
    blobfilepath = str(blobdata.name).replace(str(filesystemName)+"/","")
    logging.error("blobfilepath: "+ blobfilepath)

When a file is uploaded in the blob got the trigger. But sometimes got below error. I didn't set and header or anything to connect the blob.(Using connection string in bindings settings). Any idea what is the reason for error?

Executed 'Functions.blobprocessor' (Failed, Id=91e051f4-4e19-4892-91bc-aa6921579ba8, Duration=77ms)
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Functions.timeseries2sqlprocessor
 ---> System.InvalidOperationException: Exception binding parameter 'blobdata'
 ---> Microsoft.WindowsAzure.Storage.StorageException: The condition specified using HTTP conditional header(s) is not met.
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteAsyncInternal[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.DownloadRangeToStreamAsync(Stream target, Nullable`1 offset, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, IProgress`1 progressHandler, CancellationToken cancellationToken)
   at Microsoft.WindowsAzure.Storage.Blob.BlobReadStream.DispatchReadAsync(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.Stream.CopyToAsyncInternal(Stream destination, Int32 bufferSize, CancellationToken cancellationToken)
   at Microsoft.Azure.WebJobs.Host.Blobs.WatchableReadStream.CopyToAsyncCore(Task baseTask) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Extensions.Storage\Blobs\WatchableReadStream.cs:line 40
   at Microsoft.Azure.WebJobs.ConverterManager.<>c.<<-ctor>b__4_4>d.MoveNext() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Bindings\ConverterManager.cs:line 74
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.WebJobs.ConverterManager.<>c__DisplayClass12_0`2.<<AddExactConverter>b__0>d.MoveNext() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Bindings\ConverterManager.cs:line 213
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.WebJobs.ConverterManager.<>c__DisplayClass20_1`2.<<GetComposition>b__0>d.MoveNext() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Bindings\ConverterManager.cs:line 439
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.WebJobs.IConverterManagerExtensions.<>c__DisplayClass1_0`2.<<AsTyped>b__0>d.MoveNext() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\IConverterManager.cs:line 52
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.WebJobs.Host.Bindings.TriggerAdapterBindingProvider`2.ExactBinding`1.BindAsync(Object value, ValueBindingContext context) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Bindings\BindingProviders\TriggerAdapterBindingProvider.cs:line 217
   at Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexer.TriggerWrapper.BindAsync(Object value, ValueBindingContext context) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Indexers\FunctionIndexer.cs:line 496
   at Microsoft.Azure.WebJobs.Host.Triggers.TriggeredFunctionBinding`1.BindCoreAsync(ValueBindingContext context, Object value, IDictionary`2 parameters) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Triggers\TriggeredFunctionBinding.cs:line 56
Request Information
RequestID:4e02bac0-501e-006b-1e54-1b1ac2000000
RequestDate:Wed, 17 Mar 2021 17:39:10 GMT
StatusMessage:The condition specified using HTTP conditional header(s) is not met.
ErrorCode:ConditionNotMet
ErrorMessage:The condition specified using HTTP conditional header(s) is not met.
RequestId:4e02bac0-501e-006b-1e54-1b1ac2000000
Time:2021-03-17T17:39:10.6470643Z

Bindings enter image description here


Solution

  • Well, when you do a Blob write operation, the ETag of Blob is reset, let us say 0x8CDA1BF0593B660. And, before it is triggered (with ETag value 0x8CDA1BF0593B660), the blob is updated by another service and it's ETag is changed to 0x8CDA1BF0593B661.

    Now, when your Azure Blob triggered function app tries to read it (with ETag value 0x8CDA1BF0593B660), it is not as expected and gets this error.

    This error situation is similar to Azure Blob: "The condition specified using HTTP conditional header(s) is not met" and Azure Blob Error: StorageException: The condition specified using HTTP conditional header(s) is not met

    Fix for this can be (un tested), add Access => if match = * in your Blob Trigger Attribute:

    enter image description here