【问题标题】:Create Azure website with Standard pricing tier via Powershell通过 Powershell 创建具有标准定价层的 Azure 网站
【发布时间】:2015-08-03 02:06:20
【问题描述】:

我正在尝试修复我的持续部署方案,并且要使其正常工作,必须存在一个 Azure 网站并且能够在暂存和生产之间进行交换。我们希望该网站在 Standard 定价层中运行。

我目前拥有的脚本创建了一个新的资源组、托管计划,然后创建了网站本身。我面临的问题是网站始终处于Free 模式。我应该可以通过使用Set-AzureResource cmdlet 来解决这个问题,但是这个提示我应该指定Location。问题在于这个特定的 cmdlet 没有 Location 参数。

Set-AzureResource : {
  "Error": {
    "Code": "LocationRequired",
    "Message": "The location property is required for this definition.",
    "Target": null,
    "Details": null
  }
}

这是我用来创建所有资源的(简化的)脚本:

#Create the resource group
New-AzureResourceGroup -Location $location -Name $resourceGroupName -Force

#Create the hosting plan
$hostingPlanParameters = @{"name" = $hostingPlanName; "sku" = "Standard"; "computeMode" = "Standard"; "workerSize" = "0"; "numberOfWorkers" = "1"}

New-AzureResource -ApiVersion 2014-04-01 -Name $hostingPlanName -ResourceGroupName $resourceGroupName `
                            -ResourceType Microsoft.Web/serverFarms -Location $location `
                            -PropertyObject $hostingPlanParameters -Verbose -Force
#Create the website
$analyticsSite = @{"sku" = "Standard"; "webHostingPlan" = $hostingplan; "computeMode" = "Standard"; }
New-AzureResource  -Name $label -ResourceType Microsoft.Web/sites `
                             -ResourceGroupName $resourceGroupName -Location $location `
                             -ApiVersion $apiVersion -PropertyObject $analyticsSite -Force

Set-AzureResource -Name $label -ResourceType Microsoft.Web/sites `
                             -ResourceGroupName $resourceGroupName -ApiVersion $apiVersion `
                             -PropertyObject $analyticsSite -Force

我读过网站应该继承指定托管计划的sku,所以我不需要更新它。这似乎不适用于我的上述脚本。指定了托管计划,但未继承设置。

创建的托管计划属性如下所示:

PropertiesText    : {
                      "name": "devHostingPlanWestEU10",
                      "sku": "Standard",
                      "workerSize": 0,
                      "workerSizeId": 0,
                      "numberOfWorkers": 1,
                      "currentWorkerSize": 0,
                      "currentWorkerSizeId": 0,
                      "currentNumberOfWorkers": 1,
                      "status": 0,
                      "webSpace": "ResourceGroupWestEU10-WestEuropewebspace",
                      "subscription": "ad7add9b-8b7a-45df-8e95-0e7fccbr78a5",
                      "adminSiteName": null,
                      "hostingEnvironment": null,
                      "maximumNumberOfWorkers": 0,
                      "planName": null,
                      "perSiteScaling": null,
                      "hostingEnvironmentId": null
                    }

这对我来说看起来不错。 创建网站后,将打印以下属性:

PropertiesText    : {
                      "name": "Testert10",
                      "state": "Running",
                      "hostNames": [
                        "testert10.azurewebsites.net"
                      ],
                      "webSpace": "ResourceGroupWestEU10-WestEuropewebspace",
                      ...
                      "repositorySiteName": "Testert10",
                      "owner": null,
                      "usageState": 0,
                      "enabled": true,
                      ...
                      "computeMode": null,
                      "serverFarm": "Default1",
                      "serverFarmId": null,
                      "lastModifiedTimeUtc": "2015-05-21T11:52:30.773",
                      "storageRecoveryDefaultState": "Running",
                      "contentAvailabilityState": 0,
                      "runtimeAvailabilityState": 0,
                      "siteConfig": null,
                      "deploymentId": "Testert10",
                      "trafficManagerHostNames": null,
                      "sku": "Free",
                      "premiumAppDeployed": null,
                      "scmSiteAlsoStopped": false,
                      "targetSwapSlot": null,
                      "hostingEnvironment": null,
                      "microService": "WebSites",
                      "gatewaySiteName": null,
                      "kind": null,
                      "cloningInfo": null,
                      "hostingEnvironmentId": null
                    }

如您所见,computeMode、serverFarm、hostingEnvironment 和 sku 没有使用我在 $analyticsSite 对象中设置的属性进行设置。

因此我可能需要更新资源,但这会引发上述错误。

我也尝试过使用New-AzureWebsite,以Troy Hunt's blogpost 为例。但是,这篇文章也依赖于使用Set-AzureResource,所以我会遇到同样的问题。此示例的另一个问题是您无法控制创建站点的资源组和托管计划,这会在搜索站点时造成一些麻烦。

【问题讨论】:

    标签: powershell azure azure-web-app-service azure-app-service-plans


    【解决方案1】:

    这在新的 RM cmdlet 中很容易实现。确保首先拥有最新版本的 Azure PowerShell。

    首先创建一个定义标准价格层的应用服务计划,然后使用该应用服务计划创建一个 Web 应用。

    function Create-AppServicePlan()
    {
        #https://msdn.microsoft.com/en-us/library/mt619306.aspx
        $resource = Find-AzureRmResource -ResourceNameContains $ServicePlanName -ResourceGroupNameContains $ResourceGroupName -ResourceType "Microsoft.Web/ServerFarms"
        if(!$resource)
        {
            # Specify the Tier type that you would like
            $servicePlan = New-AzureRmAppServicePlan -ResourceGroupName $ResourceGroupName -Name $ServicePlanName -Location $WebAppLocation -Tier Standard -NumberofWorkers 1 -WorkerSize "Small"
        }
    }

    接下来使用应用服务计划作为参数创建 Web 应用。

    function Create-AzureRmWebApp()
    {
        #https://msdn.microsoft.com/en-us/library/mt619250.aspx
        $resource = Find-AzureRmResource -ResourceNameContains $WebAppName -ResourceGroupNameContains $ResourceGroupName -ResourceType "Microsoft.Web/sites"
        if(!$resource)
        {
            $webApp = New-AzureRmWebApp -ResourceGroupName $ResourceGroupName -Name $WebAppName -Location $WebAppLocation -AppServicePlan $ServicePlanName
        }
    }

    这是经过验证的完整工作脚本。

    $ServicePlanName = "PSScriptAppServicePlann"
    $WebAppName = "WebAppByPSlooksCool"
    $ResourceGroupName = "MyResourceGroup"
    $WebAppLocation = "australiaeast"
    $ErrorActionPreference = "Stop"
    
    # Step 1: Create the application service plan
    Create-AppServicePlan
    
    # Step 2: Create the web app using the service plan name.
    Create-AzureRmWebApp
    
    function Create-AzureRmWebApp()
    {
        #https://msdn.microsoft.com/en-us/library/mt619250.aspx
        $resource = Find-AzureRmResource -ResourceNameContains $WebAppName -ResourceGroupNameContains $ResourceGroupName -ResourceType "Microsoft.Web/sites"
        if(!$resource)
        {
            $webApp = New-AzureRmWebApp -ResourceGroupName $ResourceGroupName -Name $WebAppName -Location $WebAppLocation -AppServicePlan $ServicePlanName
        }
    }
    
    function Create-AppServicePlan()
    {
        #https://msdn.microsoft.com/en-us/library/mt619306.aspx
        $resource = Find-AzureRmResource -ResourceNameContains $ServicePlanName -ResourceGroupNameContains $ResourceGroupName -ResourceType "Microsoft.Web/ServerFarms"
        if(!$resource)
        {
            # Specify the Tier type that you would like
            $servicePlan = New-AzureRmAppServicePlan -ResourceGroupName $ResourceGroupName -Name $ServicePlanName -Location $WebAppLocation -Tier Standard -NumberofWorkers 1 -WorkerSize "Small"
        }
    }

    【讨论】:

    • 明显的后续问题 - 现在如何将实际网站(从目录)部署到此 AzureRmWebApp 中?
    • @taras.roshko 你的意思是来自 Visual Studio 吗?
    【解决方案2】:

    问题是您在名为“Default1”的默认免费应用服务计划(也称为服务器场或 Web 托管计划 - 它们都是相同的东西)中创建了您的网站。然而,您缩放到标准大小的应用服务计划是一个不同的,称为“devHostingPlanWestEU10”。

    要在预先存在的应用服务计划中创建站点,请使用以下命令:

    (为了便于阅读,分成多行)

    New-AzureResource 
      -Name <YourSiteName>
      -Location "West US" 
      -ResourceGroupName  <YourResourceGroupName> 
      -ApiVersion 2014-11-01 
      -ResourceType "Microsoft.Web/sites" 
      -PropertyObject @{ "serverFarm" = "<Your service plan name>" } 
    

    【讨论】:

    • 感谢您的回复。我确实尝试过使用$analyticsSite = @{"name" = $label; "sku" = "Standard"; "webHostingPlan" = $hostingplan; "serverFarm" = $hostingplan} 添加serverFarm 属性,但它会抛出一个错误,告诉我指定的serverFarm 不存在。在 Troy Hunt 的帖子中,托管计划和服务器场也是相同的,就像您所建议的那样。创建托管计划时我做错了什么吗?似乎无法弄清楚它是什么......
    • 你能分享你正在运行的确切命令(所有变量都内联)吗?取出 webHostingPlan,将 $hostingPlan 变量替换为它的字符串内容。这将使调试更容易
    【解决方案3】:

    使用新的 Azure 资源管理器 Cmdlet。您可以创建一个新的应用服务计划并将其传递给 New-AzureRmWebApp Cmdlet。

    New-AzureRmAppServicePlan -Name StdPlan -Location -ResourceGroupName -Tier Standard

    New-AzureRmWebApp -ResourceGroupName -Name -Location -AppServicePlan StdPlan

    参考文章:https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-app-azure-resource-manager-powershell

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多