【问题标题】:Create a consumption based App Service Plan with Powershell使用 Powershell 创建基于消费的应用服务计划
【发布时间】:2020-11-23 17:11:17
【问题描述】:

我为question找到了这个答案

有人知道如何使用 Azure 创建消费应用服务计划吗?

当我查看我(由 Gui 制作)的属性(使用 https://resources.azure.com/ )时,我看到以下属性;

  },
  "sku": {
    "name": "Y1",
    "tier": "Dynamic",
    "size": "Y1",
    "family": "Y",
    "capacity": 0
  }


{
  "id": "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.Web/serverfarms/MyHandMadeConsumptionAppServicePlan",
  "name": "MyHandMadeConsumptionAppServicePlan",
  "type": "Microsoft.Web/serverfarms",
  "kind": "functionapp",
  "location": "East US",

但如果我尝试(重要的部分是“-Tier Dynamic”)

$plan = New-AzureRmAppServicePlan -Name 'MyPowershellCreatedAppServicePlan' -ResourceGroupName 'MyResourceGroup' -Location 'PickALocation' -Tier Dynamic

我得到了例外:

异常 - + 无法验证参数“Tier”上的参数。这 参数“动态”不属于集合 “Free,Shared,Basic,Standard,Premium,PremiumV2”由 验证集属性。提供一个在集合中的参数,然后 再次尝试该命令。

【问题讨论】:

    标签: azure azure-powershell


    【解决方案1】:

    天哪,露易丝。

    这已经折磨了我 3 天了。我终于找到了一些帮助(我提到的网址)。

    使用 New-AzureRmAppServicePlan (目前)似乎无法实现这一点。

    但您可以回退到更通用的 New-AzureRmResource。

    我终于开始工作的代码:

    function SafeCreateAppServicePlan(
        [Parameter(Mandatory = $true)]
        [System.String]$location, 
        [Parameter(Mandatory = $true)]
        [System.String]$resourceGroupName,
        [Parameter(Mandatory = $true)]
        [String]$appServicePlanName 
    )
    {
    
        Write-Host "SafeCreateAppServicePlan.Parameter:location: $location"
        Write-Host "SafeCreateAppServicePlan.Parameter:resourceGroupName: $resourceGroupName"
        Write-Host "SafeCreateAppServicePlan.Parameter:appServicePlanName: $appServicePlanName"
    
        $SkuName = "Y1"
        $SkuTier = "Dynamic"
        $WebAppApiVersion = "2015-08-01"
    
        $fullObject = @{
            location = $location
            sku = @{
                name = $SkuName
                tier = $SkuTier
            }
        }
    
        Write-Host "Ensuring the $appServicePlanName app service plan exists"
        $plan = Get-AzureRmAppServicePlan -Name $appServicePlanName -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue
        if(-not $plan) {
            Write-Host "Creating $appServicePlanName app service plan"
            New-AzureRmResource -ResourceGroupName $resourceGroupName -ResourceType Microsoft.Web/serverfarms -Name $appServicePlanName -IsFullObject -PropertyObject $fullObject -ApiVersion $WebAppApiVersion -Force
        }
        else {
            Write-Host "$appServicePlanName app service plan already exists"   
        }
    
    }
    

    我得到的帮助:

    https://github.com/davidebbo/AzureWebsitesSamples/blob/master/PowerShell/HelperFunctions.ps1

    (在上面的网址中搜索“SkuName”以找到神奇的线条。

    请注意,这只是为 azure 函数部署基础架构的整体方程式的一部分(如果您不使用 arm 模板)。当我说基础架构时,下面的代码本身并没有部署 azure-functions,但下面将设置执行此操作所需的基础架构。

    这家伙解释得很好:

    https://clouddeveloper.space/2017/10/26/deploy-azure-function-using-powershell/

    “clouddeveloper”基本上是说消费计划Azure功能,你需要有一个存储帐户。这与您通过 azure 门户手动添加功能应用时获得的“信息”按钮一致。

    “支持 Blob、Queue 和 Table Storage 的存储帐户是 必需的。当使用消耗计划函数定义是 存储在文件存储中。”

    所以我的完整代码将创建一个应用服务计划,创建一个存储帐户,创建一个应用服务(即对天蓝色功能/功能应用程序友好)并将存储帐户与应用服务匹配是:

    function SafeCreateAppServicePlan(
        [Parameter(Mandatory = $true)]
        [System.String]$location, 
        [Parameter(Mandatory = $true)]
        [System.String]$resourceGroupName,
        [Parameter(Mandatory = $true)]
        [String]$appServicePlanName 
    )
    {
    
        Write-Host "SafeCreateAppServicePlan.Parameter:location: $location"
        Write-Host "SafeCreateAppServicePlan.Parameter:resourceGroupName: $resourceGroupName"
        Write-Host "SafeCreateAppServicePlan.Parameter:appServicePlanName: $appServicePlanName"
    
        $SkuName = "Y1"
        $SkuTier = "Dynamic"
        $WebAppApiVersion = "2015-08-01"
    
        $fullObject = @{
            location = $location
            sku = @{
                name = $SkuName
                tier = $SkuTier
            }
        }
    
        Write-Host "Ensuring the $appServicePlanName app service plan exists"
        $plan = Get-AzureRmAppServicePlan -Name $appServicePlanName -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue
        if(-not $plan) {
            Write-Host "Creating $appServicePlanName app service plan"
            New-AzureRmResource -ResourceGroupName $resourceGroupName -ResourceType Microsoft.Web/serverfarms -Name $appServicePlanName -IsFullObject -PropertyObject $fullObject -ApiVersion $WebAppApiVersion -Force
        }
        else {
            Write-Host "$appServicePlanName app service plan already exists"   
        }
    
    }
    
    function SafeCreateAzureFunctionAppService(
        [Parameter(Mandatory = $true)]
        [System.String]$location, 
        [Parameter(Mandatory = $true)]
        [System.String]$resourceGroupName,
        [Parameter(Mandatory = $true)]
        [String]$appServicePlanName,
        [Parameter(Mandatory = $true)]
        [String]$functionAppName        
    )
    {
    
        Write-Host "SafeCreateAzureFunctionAppService.Parameter:location: $location"
        Write-Host "SafeCreateAzureFunctionAppService.Parameter:resourceGroupName: $resourceGroupName"
        Write-Host "SafeCreateAzureFunctionAppService.Parameter:appServicePlanName: $appServicePlanName"
        Write-Host "SafeCreateAzureFunctionAppService.Parameter:functionAppName: $functionAppName"
    
        [String]$planId = ''
    
        $plan = Get-AzureRmAppServicePlan -Name $appServicePlanName -ResourceGroupName $resourceGroupName -ErrorAction SilentlyContinue
        if(-not $plan) {
            throw [System.ArgumentOutOfRangeException] "Missing App Service Plan.  (ResourceGroupName='$resourceGroupName', AppServicePlan.Name = '$appServicePlanName')"
        }
        else {
            Write-Host "START AzureRmAppServicePlan Properties"   
            $plan.PSObject.Properties   
            Write-Host "END AzureRmAppServicePlan Properties"   
    
            #get the planId, so that can be used as the backing-app-service-plan for this AppService
            [String]$planId = $plan.Id
        }
    
        #wire up the necessary properties for this AppService
        $props = @{
            ServerFarmId = $planId
            }
    
    
        $functionAppResource = Get-AzureRmResource | Where-Object { $_.ResourceName -eq $functionAppName -And $_.ResourceType -eq 'Microsoft.Web/Sites' }
    
        if ($functionAppResource -eq $null)
        {
            New-AzureRmResource -ResourceType 'Microsoft.Web/Sites' -ResourceName $functionAppName -kind 'functionapp' -Location $location -ResourceGroupName $resourceGroupName -Properties $props -force
        }    
    
    }
    
    
    function SafeCreateStorageAccountToBackConsumptionAzureFunctions(
        [Parameter(Mandatory = $true)]
        [System.String]$location, 
        [Parameter(Mandatory = $true)]
        [System.String]$resourceGroupName,
        [Parameter(Mandatory = $true)]
        [String]$storageAccountName   
    )
    {
    
        Write-Host "SafeCreateStorageAccount.Parameter:location: $location"
        Write-Host "SafeCreateStorageAccount.Parameter:resourceGroupName: $resourceGroupName"
        Write-Host "SafeCreateStorageAccount.Parameter:storageAccountName: $storageAccountName"
    
        $azureRmStorageAccountGetCheck = Get-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -AccountName $storageAccountName -ErrorAction SilentlyContinue
    
        if(-not $azureRmStorageAccountGetCheck) 
        {
            New-AzureRmStorageAccount -ResourceGroupName $resourceGroupName -AccountName $storageAccountName -Location $location -SkuName 'Standard_LRS'
        }
        else 
        {
            Write-Host "$storageAccountName storage account already exists"
        }    
    }
    
    
    
    function MatchStorageSettingsToAppService(
        [Parameter(Mandatory = $true)]
        [System.String]$location, 
        [Parameter(Mandatory = $true)]
        [System.String]$resourceGroupName,
        [Parameter(Mandatory = $true)]
        [String]$functionAppName,
        [Parameter(Mandatory = $true)]
        [String]$storageAccountName       
    )
    {
    
        Write-Host "MatchStorageSettingsToAppService.Parameter:location: $location"
        Write-Host "MatchStorageSettingsToAppService.Parameter:resourceGroupName: $resourceGroupName"
        Write-Host "MatchStorageSettingsToAppService.Parameter:functionAppName: $functionAppName"    
        Write-Host "MatchStorageSettingsToAppService.Parameter:storageAccountName: $storageAccountName"
    
        $keys = Get-AzureRmStorageAccountKey -ResourceGroupName $resourceGroupName -AccountName $storageAccountName
    
        $accountKey = $keys | Where-Object { $_.KeyName -eq "Key1" } | Select Value
    
        $storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=' + $storageAccountName + ';AccountKey=' + $accountKey.Value
    
        $AppSettings = @{}
    
        $AppSettings = @{'AzureWebJobsDashboard' = $storageAccountConnectionString;
    
        'AzureWebJobsStorage' = $storageAccountConnectionString;
    
        'FUNCTIONS_EXTENSION_VERSION' = '~1';
    
        'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING' = $storageAccountConnectionString;
    
        'WEBSITE_CONTENTSHARE' = $storageAccountName;
    
    }
    
        Set-AzureRMWebApp -Name $functionAppName -ResourceGroupName $resourceGroupName -AppSettings $AppSettings
    
    }
    

    我也从这个 ARM 模板中得到了一些提示:

    https://github.com/Azure/azure-quickstart-templates/blob/master/101-function-app-create-dynamic/azuredeploy.json

    【讨论】:

    • 根据 SOF 规则,直到 2 天后我才能接受自己的答案。但会在可能的情况下这样做。
    【解决方案2】:

    这并不是对您问题的真正答案,而只是一些研究......

    您会注意到,在较旧的 Microsoft.Web 架构中,不支持“动态”。相反,我们会看到一个类似于您在错误消息中看到的列表。

    https://github.com/Azure/azure-resource-manager-schemas/blob/master/schemas/2015-08-01/Microsoft.Web.json#L37

    在较新的架构中(从 2016 年 9 月 1 日开始),这是我在 resources.azure.com 中查看我的消费应用服务计划时看到的,您会在下面找到“动态”作为有效值computeMode:https://github.com/Azure/azure-resource-manager-schemas/blob/master/schemas/2016-09-01/Microsoft.Web.json#L189

    我不确定如何在 PowerShell 中设置 computeMode 值,因为文档没有显示这是公开的: https://docs.microsoft.com/en-us/powershell/module/azurerm.websites/new-azurermappserviceplan?view=azurermps-5.0.0

    【讨论】:

    • 有用的提示。感谢您抽出宝贵时间。 (赞成但显然不是“答案”)。是的,我想你找到了缺少的属性设置能力
    • 我终于想通了.......添加了一个完整的答案。 #不平凡。感谢您提示让火车继续行驶。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多