【问题标题】:Is it possible to scale Azure app services programmatically是否可以以编程方式扩展 Azure 应用服务
【发布时间】:2017-03-12 13:17:45
【问题描述】:

我正在寻找一种以编程方式扩大/缩小 Azure 应用服务实例的方法。几个月前(例如在下面的链接中)已经提出过这个问题,当时无法回答,所以我只是想知道是否发生了一些变化和/或现在是否有一些新功能可用。

Is possible to programmatically scale Azure instances?

请注意,我们希望在“Azure 应用服务”上执行此操作,而不是旧式“Azure 云服务”。

我们希望以编程方式进行缩放的原因是我们可以使用自定义指标来控制它。我们没有找到将自定义指标发布到 Azure 的方法,然后 Azure 也可以使用它来进行自动缩放。

我们确实发现 Azure 自动缩放规则可以接受 Azure 存储队列长度,所以理论上我们可以通过向队列中添加/删除消息来控制队列长度,但它是一种 hack,而且它只有在队列是在经典 Azure Web 门户中创建的,而不是在新的 Azure 门户中。

【问题讨论】:

  • 其他问题 not 说这是不可能的 - 那是某人的随机评论(我什至询问了那个人,让他们解释他们为什么这么说)。一切都由底层 REST API 驱动(这就是您可以通过 PowerShell / CLI 扩展 Web 应用程序实例的原因)。问题实际上是特定语言的 SDK 是否提供特定的管理支持,或者它是否需要您编写。

标签: c# azure azure-web-app-service


【解决方案1】:

是否可以通过编程方式扩展 Azure 应用服务

是的,我们可以使用 REST API 或 SDK 来做到这一点。 我使用fiddler测试了REST API,详情请参考snapshot,如何获取授权请参考document

标题信息:

身体信息:

如果可以使用 C# 代码,请尝试使用
Microsoft.Azure.Management.WebSites 来扩展 Azure 应用服务。有关 SDK 的更多详细信息,请参阅 packages.config 文件。 如何注册 Azure AD App 以及如何获取 Application ID、secretKey 和tenantId 请参考document。以下是演示代码。

  var subscriptionId = "Your subscrption";
  var appId = "Registried Azure Application Id";
  var secretKey = "Secret Key";
  var tenantId = "tenant Id";
  var resourceGroup = "resource group name";
  var servicePlanName = "service plan name";
  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();
   //scale up/down
    servicePlan.Sku.Family = "P"; 
    servicePlan.Sku.Name = "P1";
    servicePlan.Sku.Size = "P1";
    servicePlan.Sku.Tier = "Premium";
    servicePlan.Sku.Capacity = 2; // scale out: number of instances 
   var updateResult = webSiteManagementClient.AppServicePlans.CreateOrUpdateWithHttpMessagesAsync(resourceGroup, servicePlanName, servicePlan).Result;

packages.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.Management.Websites" version="1.6.0-preview" targetFramework="net462" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.13.8" targetFramework="net462" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.5" targetFramework="net462" />
  <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.5" targetFramework="net462" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net462" />
</packages>

检查门户的结果。

注意:如果 Azure 服务计划更新,它将适用于服务计划中的所有 WebApp。

【讨论】:

  • 嗨,汤姆,非常感谢您的帮助。您的代码在我的测试中完美运行。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多