How to Enable/Disable Azure Function programmatically

后端 未结 5 768
南方客
南方客 2020-12-11 05:25

Is there a way to programmatically enable/disable an Azure function?

I can enable/disable a function using the portal under the \"Manage\" section, which causes a r

相关标签:
5条回答
  • 2020-12-11 05:47

    The CLI command That is used to disable the Azure function through CLI - documented here

     az functionapp config appsettings set --name <myFunctionApp> \
        --resource-group <myResourceGroup> \
        --settings AzureWebJobs.QueueTrigger.Disabled=true
    

    I had captured fiddler while while running the above command. Azure CLI works on the Python process The python process was issuing request to

    https://management.azure.com to update appsetting.

    got a reference to the same endpoint in the below REST Endpoint : https://docs.microsoft.com/en-us/rest/api/appservice/webapps/updateapplicationsettings

    Request URI :

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{name}/config/appsettings?api-version=2019-08-01

    Headers :

    Authorization: Bearer <> ; Content-Type: application/json; charset=utf-8

    Request Body:

    {"kind": "<class 'str'>", "properties":JSON}

    We can hardcode the properties or get it dynamically. For disabling the function, will have to update the JSON node of Properties : Azure.WebJobs.QueueTrigger.Disabled = True

    To get properties you could use the endpoint, you could refer Web Apps - List Application Settings The Output looks up as below :

    Hope this helps :)

    0 讨论(0)
  • 2020-12-11 05:48

    Further to @James Z.'s answer, I've created the following class in C# that allows you to programmatically disable / enable an Azure function.

    The functionsSiteRoot constructor argument is the Kudu root of your Functions application, eg https://your-functions-web-app.scm.azurewebsites.net/api/vfs/site/wwwroot/

    The username and password can be obtained from "Get publish profile" in the App Service settings for your Functions.

    public class FunctionsHelper : IFunctionsHelper
    {
        private readonly string _username;
        private readonly string _password;
        private readonly string _functionsSiteRoot;
        private WebClient _webClient;
    
        public FunctionsHelper(string username, string password, string functionsSiteRoot)
        {
            _username = username;
            _password = password;
            _functionsSiteRoot = functionsSiteRoot;
    
            _webClient = new WebClient
            {
                Headers = { ["ContentType"] = "application/json" },
                Credentials = new NetworkCredential(username, password),
                BaseAddress = functionsSiteRoot
            };
        }
    
        public void StopFunction(string functionName)
        {
            SetFunctionState(functionName, isDisabled: true);
        }
    
        public void StartFunction(string functionName)
        {
            SetFunctionState(functionName, isDisabled: false);
        }
    
        private void SetFunctionState(string functionName, bool isDisabled)
        {
            var functionJson =
                JsonConvert.DeserializeObject<FunctionSettings>(_webClient.DownloadString(GetFunctionJsonUrl(functionName)));
            functionJson.disabled = isDisabled;
            _webClient.Headers["If-Match"] = "*";
            _webClient.UploadString(GetFunctionJsonUrl(functionName), "PUT", JsonConvert.SerializeObject(functionJson));
        }
    
        private static string GetFunctionJsonUrl(string functionName)
        {
            return $"{functionName}/function.json";
        }
    }
    
    internal class FunctionSettings
    {
        public bool disabled { get; set; }
        public List<Binding> bindings { get; set; }
    }
    
    internal class Binding
    {
        public string name { get; set; }
        public string type { get; set; }
        public string direction { get; set; }
        public string queueName { get; set; }
        public string connection { get; set; }
        public string accessRights { get; set; }
    }
    
    0 讨论(0)
  • 2020-12-11 05:51

    I would imagine you can use Kudu REST API (specifically VFS) to update the disabled metadata property in function.json. Would that disable the function? Here is the Kudu REST API. https://github.com/projectkudu/kudu/wiki/REST-API

    0 讨论(0)
  • 2020-12-11 06:01

    No, this is not possible currently. The disabled metadata property in function.json is what determines whether a function is enabled. The portal just updates that value when you enable/disable in the portal.

    Not sure if it will meet your needs, but I'll point out that there is also a host.json functions array that can be used to control the set of functions that will be loaded (documented here). So for example, if you only wanted 2 of your 10 functions enabled, you could set this property to an array containing only those 2 function names (e.g. "functions": [ "QueueProcessor", "GitHubWebHook" ]), and only those will be loaded/enabled. However, this is slightly different than enable/disable in that you won't be able to invoke the excluded functions via the portal, whereas you can portal invoke disabled functions.

    0 讨论(0)
  • 2020-12-11 06:08

    Further to @DavidGouge 's answer above, the code he posted does work, I just tested it and will be using it in my app. However it needs a couple of tweaks:

    1. Remove the inheritance from IFunctionsHelper. I'm not sure what that interface is but it wasn't required.

    2. Change the class definition for Binding as follows:

          internal class Binding
          {
              public string name { get; set; }
              public string type { get; set; }
              public string direction { get; set; }
              public string queueName { get; set; }
              public string connection { get; set; }
              public string accessRights { get; set; }
              public string schedule { get; set; }
          }
      

      After that it would work.

    P.S. I would have put this as a comment on the original answer, but I don't have enough reputation on Stack Overflow to post comments!

    0 讨论(0)
提交回复
热议问题