Boxx
Boxx

Reputation: 111

Error "BadRequest" when calling Azure Function in ADF

I am creating an extensive data factory work flow that will create and fill a data warehouse for multiple customers automatic, however i'm running into an error. I am going to post the questions first, since the remaining info is a bit long. Keep in mind i'm new to data factory and JSON coding.

Questions & comments

The issue may lie with correctly passing the parameter through, or it may lie in picking it up - i can't seem to determine which one. If you spot an error with the current setup, dont hesitate to let me know - all help is appreciated

The Error

{
"errorCode": "BadRequest",
"message": "Operation on target FetchEntries failed: Call to provided Azure function
'' failed with status-'BadRequest' and message -
'{\"Message\":\"Please pass 'customerId' on the query string or in the request body\"}'.",
"failureType": "UserError",
"target": "ExecuteFullLoad"
}

The Setup:

The whole setup starts with a function call to get new customers from an online economic platform. It the writes them to a SQL table, from which they are processed and loaded into the final table, after which a new pipeline is executed. This process works perfectly. From there the following pipeline is executed:

enter image description here

As you can see it all works well until the ForEach loop tries to execute another pipeline, that contains an azure function that calls a .NET scripted function that fills said warehouse (complex i know). This azure function needs a customerid to retrieve tokens and load the data into the warehouse. I'm trying to pass those tokens from the InternalCustomerID lookup through the ForEach into the pipeline and into the function. The ForEach works actually, but fails "Because an inner activity failed".

The Execute Pipeline task contains the following settings, where i'm trying to pass the parameter through which comes from the foreach loop. This part of the process also works, since it executes twice (as it should in this test phase): enter image description here

I dont know if it doesn't successfully pass the parameter through or it fails at adding it to the body of the azure function.

The child pipeline (FullLoad) contains the following parameters. I'm not sure if i should set a default value to be overwritten or how that actually works. The guides i've look at on the internet havent had a default value. enter image description here

Finally there is the settings for the Azure function. I'm not sure what i need to write in order to correctly capture the parameter and/or what to fill in - if it's the header or the body regarding the error message. I know a post cannot be executed without a body.
enter image description here

If i run this specific funtion by hand (using the Function App part of portal.azure.com) it works fine, by using the following settings:

enter image description here

Upvotes: 3

Views: 7793

Answers (1)

Jay Gong
Jay Gong

Reputation: 23782

I viewed all of your detailed question and I think the key of the issue is the format of Azure Function Request Body.

enter image description here

I'm afraid this is incorrect. Please see my below steps based on your description:

Work Flow:

enter image description here

Inside ForEach Activity, only one Azure Function Activity:

enter image description here

The preview data of LookUp Activity:

enter image description here

Then the configuration of ForEach Activity: @activity('Lookup1').output.value

enter image description here

The configuration of Azure Function Activity: @json(concat('{"name":"',item().name,'"}'))

enter image description here

From the azure function, I only output the input data. Sample Output as below:

enter image description here

Tips: I saw your step is executing azure function in another pipeline and using Execute Pipeline Activity, (I don't know why you have to follow such steps), but I think it doesn't matter because you only need to focus on the Body format, if your acceptable format is JSON, you could use @json(....),if the acceptable format is String, you could use @cancat(....). Besides, you could check the sample from the ADF UI portal which uses pipeline().parameters

enter image description here

Upvotes: 2

Related Questions