Azure Function timer configure through app settings

22,022

Solution 1

Set your schedule as "schedule": "%EmailScheduleTriggerTime%" and then in the appsetting.json or local.settings.json you can set EmailScheduleTriggerTime value as "0 30 9-12 * * *"

{
  "IsEncrypted": false,
  "Values": {
    "EmailScheduleTriggerTime": "0 30 9-12 * * *", //Run every  30 minutes from 9:00 to 12:00

  },
  "ConnectionStrings": {
    "DefaultConnection": ""
  }
}

[FunctionName("TimerfunctionApp")] 
public static void Run([TimerTrigger("%EmailScheduleTriggerTime%")] TimerInfo TInfo, TraceWriter log)

Solution 2

If you are using the VS2017 Functions tooling and defining your function in a .NET project (rather than directly in the Azure portal) you can pick up the interval from AppSettings using the % syntax:

[FunctionName("MyTimerFunction")] 
public static void Run([TimerTrigger("%TimerInterval%")] TimerInfo myTimer, TraceWriter log, ..

Then in your app settings specify the required CRON format interval eg. in local.settings.json

{
  "Values" : { 
      "TimerInterval" : "0 30 9-12 * * *"
    }
}

Solution 3

To add to the previous answers, you can get any value form any field in a config file (appsettings.json) file using % syntax - not only from Values configuration object.

For example:

appsettings.json:

{      
  "ScheduleConfiguration": {
    "FunctionOne": {
      "CronExpression": "0 40 2 * * *"
    }
  }
}

Functions.cs:

    /// <summary>
    /// %ScheduleConfiguration:FunctionOne:CronExpression%
    ///  - e.g. "0 40 2 * * *" - executes at 02:40:00am every day
    /// </summary>
    [FunctionName("FunctionOne")]
    public async Task FunctionOne(
        [TimerTrigger("%ScheduleConfiguration:FunctionOne:CronExpression%")]
        TimerInfo timerInfo)
    {
        // Azure function code
    }

Solution 4

Since this post already has good answers, I want to share my experience here. I was trying to run the app locally by adding the cron expression in the appsettings.json file but then when I ran the function app I always received an error as follows

The 'EmployeeTimerTrigger' function is in error: Microsoft.Azure.WebJobs.Host: Error indexing method 'EmployeeTimerTrigger'. Microsoft.Azure.WebJobs.Host: '%EmployeeTimerTrigger%' does not resolve to a value.

So in order to resolve that what we need to do is shift the cron expression from appsettings.json to local.settings.json and it worked just fine and I was able to test it locally.

Edit: Adding notes for deployment

The function app reads the timer trigger settings from the application settings of the function app itself on azure.

When you plan to deploy your function app in azure there's a small change that you need to do in the Application Settings of the function app in the Azure portal.

You can navigate to those settings by selecting the function app in azure portal -> Configuration -> Application setting

The very first setting that you need to add is the time zone in which you want the timer trigger to run here's an example of the same

Note: Please note these values are case sensitive

Key = WEBSITE_TIME_ZONE

Now the second setting we will add here is for our timer trigger function, in this image you will see that the timer will run at 10:00 AM and 2:00 PM eastern standard time.

Why eastern standard time you ask? well, remember our first settings were for the website time zone so both settings work hand in hand.

Note: The name of the timer trigger should match the one you have in your function app, please note these values are case sensitive and should match exactly with what you have in your timer trigger function.

enter image description here

Once you have added these settings, don't forget to save your changes and now you are all set to deploy your function app.

I hope this answer helps in the deployment and running the timer function locally.

Solution 5

As mentioned earlier (for Node js) we can use %scheduleValue% in function.json and use scheduleValue as parameter in local.settings.json and here its mentioned in Microsoft docs - https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=javascript#configuration

function.json local.settings.json

Share:
22,022
Palanivelu Samudi
Author by

Palanivelu Samudi

Updated on March 16, 2021

Comments

  • Palanivelu Samudi
    Palanivelu Samudi about 3 years

    I am working on Azure functions timer Job , i need to get the cron expression from the appsettings. Please let me know, how can i get the value from the appsettings in the Azure functions. I want to run my azure function starting from 9:00 AM to 12:00 PM for every 30 minutes\

    {
     "disabled": false,
     "bindings": [
       {
         "name": "timerInfo",
         "type": "timerTrigger",
         "direction": "in",
         "schedule": "0 * * * * *"
       }
     ]
    }
    
  • Garth Mason
    Garth Mason over 6 years
    Why the downvotes? Happy to improve this answer if there is some feedback.
  • Karthikeyan VK
    Karthikeyan VK over 6 years
    Yours is only part of the answer use 0 30 9-12 * * *, i have edited and send a review.
  • Kuczi
    Kuczi almost 6 years
    Is it possible to use other settings like this inside the function? I mean just putting the parametere name in %'s? I'm not able to get it working. Can only TimerTrigger use the settings this way?
  • Viktors Telle
    Viktors Telle over 5 years
    Unfortunately this does not work when you deploy the function to Azure. Error indexing method 'SampleFunction.Run' '%TimerInterval%' does not resolve to a value. local.settings.json is deployed along with function.
  • Viktors Telle
    Viktors Telle over 5 years
    The workaround is to set "TimerInterval" value in Application settings of Azure Function in Azure Portal, but I would like this value to be configurable during the deployment.
  • Viktors Telle
    Viktors Telle over 5 years
  • jayasurya_j
    jayasurya_j over 5 years
    can you point me to the official docs? couldn't find this there
  • Karthikeyan VK
    Karthikeyan VK over 5 years
    Is that what you are asking for docs.microsoft.com/en-us/azure/azure-functions/…
  • jayasurya_j
    jayasurya_j over 5 years
    i meant where did you find in docs that says %variable% will be replaced with the environment variable 'variable'
  • Benny Bauer
    Benny Bauer over 5 years
  • Denis Molodtsov
    Denis Molodtsov about 5 years
    Did anyone make it work locally? When I specify a setting in local.settings.json, I get an error: Microsoft.Azure.WebJobs.Host: Error indexing method 'MainTriggerEntry'. Microsoft.Azure.WebJobs.Host: '%CRON_EXPRESSION%' does not resolve to a value.
  • alex
    alex over 4 years
    In this case will EmailScheduleTriggerTime value be used only during installation of Azure function or it will be possible to edit schedule in runtime?
  • NSDumb
    NSDumb about 4 years
    @DenisMolodtsov Yes i am getting that error,so the way I resolved it was by adding the cron expression in the local.settings.json file and that did the trick and got me working locally
  • Matt
    Matt over 3 years
    The change you suggest means the value isn't used in production (if my limited understanding is correct)
  • Matt
    Matt over 3 years
    According to stackoverflow.com/a/45680677/10245 appsettings.json has been renamed to local.settings.json to make it clearer that it only applies to local development
  • NSDumb
    NSDumb over 3 years
    Hello @TimAbell I have added the deployment steps to my answer, please review the same and let me know if it helps. Please do upvote if this was helpful :)
  • Matt
    Matt over 3 years
    Yeah I'd say that clarifies things, thanks
  • José Mancharo
    José Mancharo almost 3 years
    I had this issue because I didn't include the setting under the "Values" key in my local.settings.json. That resolved the issue @DenisMolodtsov mentioned.
  • BatteryBackupUnit
    BatteryBackupUnit over 2 years
    re %FOO% does not resolve to a value: when adding the value to appsettings.json I had to add it to the root of the file, not as a sub element of Values (azure functions 4.0).
  • Red
    Red over 2 years
    Values contains List<KeyValuePair<string, string>>, so you can only provide strings, not arrays or objects. TimerInterval is not a special word, and works purely because it matches. A more realistic scenario is "Job1": "0 */2 * * * *", Job2": "0 */5 * * * *"
  • Red
    Red over 2 years
    For this to work the names must match, and if it's under Values there must only be pairs of strings. You cannot have any arrays or objects in Values or it will fail for all of them