In this quick post, I will share two options to prevent an Azure Function of running while in Stagging slot.
Option 1: Kudu to the rescue
If you have created a few functions, you probably already know that you have access to some Environment variables. They are very useful. I was pretty sure one exists specifying the current slot, but I didn't know the name of it. Even more, I forgot that all environment variables are displayed in the Kudu interface. D'oh! Thanks to Bruce Chen, that answered my question on StackoverFlow and help me to remember it was all there.
To get to your environment variables list, go in portal.azure.com. Open your Azure function and select the main note (1). The from the right section select the Platform features tab. Then finaly, in the Development Tools section select the Advanced tools (Kudu).
That will open the Kudu interface in a new tab. You just need to select the Environment tab and you will see them!
Now one more thing before we are reading to go. At the time, this post is published, Function slots are still in preview so don't forget to activate it ;)
Let's create a simple Azure Function to show how it works.
using System;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"JustDemoFunc got triggered at: {DateTime.Now}");
var slotName = System.Environment.GetEnvironmentVariable("APPSETTING_WEBSITE_SLOT_NAME", EnvironmentVariableTarget.Process);
if (!string.Equals("production", slotName , StringComparison.OrdinalIgnoreCase))
{
log.Info($"{DateTime.Now:s} Function is in stagging.");
return;
}
log.Info($"{DateTime.Now:s} Function is in Production is will be executed.");
}
This is a C# timer function. Every time it will be executed (every 5 minutes) it will write to log that it got triggered. Than with
System.Environment.GetEnvironmentVariable("APPSETTING_WEBSITE_SLOT_NAME", EnvironmentVariableTarget.Process)
it's grabbing our slot name. By default the name is Production so if it's something else... we get out. See the log when in production slot.JustDemoFunc got triggered at: 9/24/2017 3:28:16 PM
2017-09-24T15:28:16 Function is in Production is will be executed.
Function completed (Success, Id=###, Duration=21ms)
And now the same code, but running in another slot, in this case named Stagging.JustDemoFunc got triggered at: 9/24/2017 3:25:29 PM
2017-09-24T15:25:29 Function is in stagging.
Function completed (Success, Id=###, Duration=161ms)
Option 2: Sticky Setting it is
Another option is also possible using Application Settings. For that, simply add a new Setting, in this case named: ShouldItRun. Now let's jump into the code.
using System;
using System.Configuration;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"JustDemoFunc got triggered at: {DateTime.Now}");
if (!Convert.ToBoolean(ConfigurationManager.AppSettings["ShouldItRun"]))
{
log.Info($"{DateTime.Now:s} Function is in stagging.");
return;
}
log.Info($"{DateTime.Now:s} Function is in Production is will be executed.");
}
To be able to read your application setting you will need
using System.Configuration
. Then a quick call to ConfigurationManager.AppSettings["ShouldItRun"]
will return the value of your setting. Once again, see the log from the production slot.JustDemoFunc got triggered at: 9/24/2017 4:03:43 PM
2017-09-24T16:03:43 Function is in Production is will be executed.
Function completed (Success, Id=###, Duration=30ms)
And in the staging slot.
JustDemoFunc got triggered at: 9/24/2017 4:02:21 PM
2017-09-24T16:02:21 Function is in stagging.
Function completed (Success, Id=###, Duration=8ms)
I hope you enjoy this little quick hack.