How to create a function app in Azure Portal without VS

Here is the steps that create a function app in Azure Portal without VS.

  1. New function

  2. HTTP Trigger

  3. Enter a Name.

  4. View files -> Add -> function.proj file -> copy my sample into it -> Save

Please copy below xml doc into function.proj

1
2
3
4
5
6
7
8
9
10
11
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Azure.Management.ResourceManager.Fluent" Version="1.27.2" />
<PackageReference Include="Microsoft.Azure.Management.Websites" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
</ItemGroup>
</Project>
  1. Click “run.csx” file -> copy my code and paste it -> Save -> Test it.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest;
using System.Linq;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");

int capacity;

if (!string.IsNullOrEmpty(req.Query["capacity"]) && int.TryParse(req.Query["capacity"], out capacity))
{
log.LogInformation("You want to chagne the capacity to "+ capacity.ToString());
// Step1. How to: Use the portal to create an Azure AD application and service principal that can access resources
// https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal

// Step2. How to: Add app roles in your application and receive them in the token
// https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps
// For security concerns, I only give the resource group => contributor
// and the service plan read permission

var subscriptionId = "Your Subscription Id";
var appId = "e6f6d231-Your-App-Id";
var secretKey = "2z]pj0vy2JRapjo:R@TJSoW1AmOCC=o8";
var tenantId = "72f988bf-Your Tenant-id";
var resourceGroup = "jackywebl1rg";
var servicePlanName = "ASP-jackywebl1rg-81ee";


// Step 3. change capacity
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey);
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;
TokenCredentials credential = new TokenCredentials(accessToken);
var webSiteManagementClient = new Microsoft.Azure.Management.WebSites.WebSiteManagementClient(credential);
webSiteManagementClient.SubscriptionId = subscriptionId;
var servicePlan = webSiteManagementClient.AppServicePlans.ListByResourceGroupWithHttpMessagesAsync(resourceGroup).Result.Body.Where(x => x.Name.Equals(servicePlanName)).FirstOrDefault();

var appServicePlanRequest = await webSiteManagementClient.AppServicePlans.ListByResourceGroupWithHttpMessagesAsync(resourceGroup);
appServicePlanRequest.Body.ToList().ForEach(x => log.LogInformation($">>>{x.Name}"));
var appServicePlan = appServicePlanRequest.Body.Where(x => x.Name.Equals(servicePlanName)).FirstOrDefault();
if (appServicePlan == null)
{
log.LogError("Could not find app service plan.");
}

//scale up/down
//servicePlan.Sku.Family = "P";
//servicePlan.Sku.Name = "P1v2";
//servicePlan.Sku.Size = "P1v2";
//servicePlan.Sku.Tier = "PremiumV2";
servicePlan.Sku.Capacity = capacity; // scale out: number of instances
var updateResult = webSiteManagementClient.AppServicePlans.CreateOrUpdateWithHttpMessagesAsync(resourceGroup, servicePlanName, servicePlan).Result;
log.LogInformation("Completed!!");
return (ActionResult)new OkObjectResult($"Hello, {capacity} {updateResult.Response.StatusCode}");
}
else
{
return new BadRequestObjectResult("Please pass a capacity on the query string or in the request body");
}

}

HTH. By Jacky 2019-11-18