【问题标题】:Setup Azure Function from Powershell从 Powershell 设置 Azure 函数
【发布时间】:2020-10-16 02:17:36
【问题描述】:

在 Azure CLI 中,有 az functionapp,但在 Powershell AzureRM-libraryAz-library 中找不到这样的等价物。

使用原始 Azure 资源,我尝试过这样的事情来在我的应用程序服务计划中创建一个函数应用程序:

New-AzResource -ResourceType 'Microsoft.Web/Sites' `
    -ResourceGroupName "MyRgName" `
    -Location "westeurope" `
    -ResourceName "MyFunctionName" `
    -kind 'functionapp' `
    -Properties @{ServerFarmId="abc-123"; alwaysOn=$True;} `
    -ApiVersion '2018-11-01' `
    -Force;

它几乎可以工作,但不能创建 100% 工作的功能应用程序。 Azure 门户会吐出大量错误和警告,例如缺少主机密钥。

替代方案:

  • ARM 模板。将什么放入模板以成功创建 Azure Function?我不知道。 Azure Portal 生成的那个没用。
  • Azure 门户:从 Azure DevOps 发布管道进行环境设置的方法不是很方便,但它会创建一个功能齐全的功能应用程序。

问题是:如何从 Powershell 脚本创建 Function App?

【问题讨论】:

    标签: function azure powershell


    【解决方案1】:

    我正在做同样的事情来创建一个开发沙盒环境。

    预配功能应用程序是 Az Powershell 模块中的一个缺口,但似乎确实可行。

    我按照https://clouddeveloper.space/2017/10/26/deploy-azure-function-using-powershell/ 此处的步骤配置了我的函数应用,但将其更改为使用现有的应用服务计划而不是消费计划。

    $AppServicePlan = "abc-123"
    $AppInsightsKey = "your key here"
    $ResourceGroup = "MyRgName"
    $Location = "westeurope"
    $FunctionAppName = "MyFunctionName"
    $AzFunctionAppStorageAccountName = "MyFunctionAppStorageAccountName"
    $FunctionAppSettings = @{
        ServerFarmId="/subscriptions/<GUID>/resourceGroups/$ResourceGroup/providers/Microsoft.Web/serverfarms/$AppServicePlan";
        alwaysOn=$True;
    }
    
    # Provision the function app service
    New-AzResource -ResourceGroupName $ResourceGroup -Location $Location -ResourceName $FunctionAppName -ResourceType "microsoft.web/sites" -Kind "functionapp" -Properties $FunctionAppSettings -Force | Out-Null
    
    $AzFunctionAppStorageAccountKey = Get-AzStorageAccountKey -ResourceGroupName $ResourceGroup -AccountName $AzFunctionAppStorageAccountName | Where-Object { $_.KeyName -eq "Key1" } | Select-Object Value
    $AzFunctionAppStorageAccountConnectionString = "DefaultEndpointsProtocol=https;AccountName=$AzFunctionAppStorageAccountName;AccountKey=$($AzFunctionAppStorageAccountKey.Value)"
    $AzFunctionAppSettings = @{
        APPINSIGHTS_INSTRUMENTATIONKEY = $AppInsightsKey;
        AzureWebJobsDashboard = $AzFunctionAppStorageAccountConnectionString;
        AzureWebJobsStorage = $AzFunctionAppStorageAccountConnectionString;
        FUNCTIONS_EXTENSION_VERSION = "~2";
        FUNCTIONS_WORKER_RUNTIME = "dotnet";
    }
    
    # Set the correct application settings on the function app
    Set-AzWebApp -Name $FunctionAppName -ResourceGroupName $ResourceGroup -AppSettings $AzFunctionAppSettings | Out-Null
    

    【讨论】:

    • 这个解决方案非常接近我的解决方案。有更多的应用程序设置,但它仍然会在缺少主机密钥时产生“内部服务器错误”。知道如何解决这个问题吗?
    • 有趣,我没看到。您在哪里看到内部服务器错误?您看到了哪些主机密钥?
    • 我看到的内部错误是关于缺少主机密钥的。这意味着缺少主机密钥,因为没有主机密钥可见。
    • 我有一个我喜欢的代码。由于我的 Powershell 脚本没有彻底改变,我必须假设 Azure 端发生了一些变化。另一种解释是,在修复了我的金丝雀部署槽的错误而不使用相同的 ASP 之后,一切都按预期开始工作。
    • @JariTurkia 我只是想知道重现步骤以查看错误,我确实在 Azure 门户的 Manage 选项卡上看到了两个主机密钥,_masterdefault。对不起,如果我的问题不清楚。
    【解决方案2】:

    这可能会有所帮助: 要创建 Azure 函数,我们依赖于“存储帐户”、“服务计划”、“资源组”和“应用程序洞察力”(可选)。下面我最初定义变量。发布我正在检查资源组是否存在。如果没有,它将创建一个新的。发布我创建 Azure 存储帐户、服务计划和 Application Insight 的帖子。在 Azure 函数中,我们需要选择运行时堆栈,可以是“Java”/“DotNet”/“Python”等。这里我使用的是“Dotnet”。 Azure Function 需要存储帐户密钥才能链接相同,该密钥在下面的变量“WEBSITE_CONTENTAZUREFILECONNECTIONSTRING”等下提取。要将 AppInsight 与 Function 链接,我们需要映射 Application_Insight_InstrumentationKey。请关注内联 cmets:

    #=============Defining All Variables=========
    $location = 'Southeast Asia'
    $resourceGroupName = 'functionrgnew1'
    $storageAccount = 'functionsasdnewqq1'
    $subscriptionId = '<id>'
    $functionAppName = 'functionapppsdfsdnew1'
    $appInsightsName = 'appinsightnameprdad' 
    $appServicePlanName = 'functionappplan'
    $tier = 'Premium'
    
    #========Creating Azure Resource Group========
    $resourceGroup = Get-AzResourceGroup | Where-Object { $_.ResourceGroupName -eq $resourceGroupName }
    if ($resourceGroup -eq $null)
    {
      New-AzResourceGroup -Name $resourceGroupName -Location $location -force
    }
    
    #selecting default azure subscription by name
    Select-AzSubscription -SubscriptionID $subscriptionId
    Set-AzContext $subscriptionId
    
    #========Creating Azure Storage Account========
    if(!(Test-AzureName -Storage $storageAccount))
    {
      New-AzStorageAccount -ResourceGroupName $resourceGroupName -AccountName $storageAccount -Location $location -SkuName "Standard_LRS"
    }
    
    #========Creating App Service Plan============
    New-AzAppServicePlan -ResourceGroupName $resourceGroupName -Name $appServicePlanName -Location $location -Tier $tier
    $functionAppSettings = @{
        ServerFarmId="/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/serverfarms/$appServicePlanName";
        alwaysOn=$True;
    }
    
    #========Creating Azure Function========
    $functionAppResource = Get-AzResource | Where-Object { $_.ResourceName -eq $functionAppName -And $_.ResourceType -eq "Microsoft.Web/Sites" }
    if ($functionAppResource -eq $null)
    {
      New-AzResource -ResourceType 'Microsoft.Web/Sites' -ResourceName $functionAppName -kind 'functionapp' -Location $location -ResourceGroupName $resourceGroupName -Properties $functionAppSettings -force
    }
    
    #========Creating AppInsight Resource========
    New-AzApplicationInsights -ResourceGroupName $resourceGroupName -Name $appInsightsName -Location $location
    $resource = Get-AzResource -Name $appInsightsName -ResourceType "Microsoft.Insights/components"
    $details = Get-AzResource -ResourceId $resource.ResourceId
    $appInsightsKey = $details.Properties.InstrumentationKey
    
    #========Retrieving Keys========
    $keys = Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -AccountName $storageAccount
    $accountKey = $keys | Where-Object { $_.KeyName -eq 'Key1' } | Select-Object -ExpandProperty Value
    $storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName='+$storageAccount+';AccountKey='+$accountKey
    
    #========Defining Azure Function Settings========
    $AppSettings =@{}
    $AppSettings =@{'APPINSIGHTS_INSTRUMENTATIONKEY' = $appInsightsKey;
                    'AzureWebJobsDashboard' = $storageAccountConnectionString;
                    'AzureWebJobsStorage' = $storageAccountConnectionString;
                    'FUNCTIONS_EXTENSION_VERSION' = '~2';
                    'FUNCTIONS_WORKER_RUNTIME' = 'dotnet';
                    'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING' = $storageAccountConnectionString;
                    'WEBSITE_CONTENTSHARE' = $storageAccount;}
    Set-AzWebApp -Name $functionAppName -ResourceGroupName $resourceGroupName -AppSettings $AppSettings
    

    【讨论】:

    • 请在您的解决方案中添加详细信息,以便每个人都能理解您的答案。仅提供代码是不够的
    • 谢谢。我编辑了相同的解决方案的简短描述
    【解决方案3】:

    从 PowerShell 执行此操作的最佳方法是使用 ARM 模板,而不是尝试单独创建每个资源。您可以找到示例模板here。它还将应用程序连接到 github,但如果您只想要一个空应用程序,则可以省略该部分

    【讨论】:

    • 你确定这会起作用吗?它使用 API 版本“2015-05-01-preview”和“2016-03-01”。另外,“FUNCTIONS_EXTENSION_VERSION=~1”,这不是我正在使用的。我的想法是,这与 Azure 门户(错误)生成的一样是无用的 ARM 模板。如果能提供几岁以下的东西,那将会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多