使用 powershell 部署到 azure 函数

Deploy to azure functions using powershell

有什么方法可以使用 powershell 脚本部署到 azure 函数吗? CI 对我们不起作用,因为我们使用章鱼部署来部署到我们所有的生产服务。因此,如果有一种使用 powershell 脚本进行部署的方法,那将是有益的。

谢谢!

您可以使用 Kudu REST API. You can also see some code/samples of doing this in our templates repository. In this 代码示例将函数部署到 Azure,您可以看到我们的测试脚本如何调用 Kudu Rest api 以将 zip 部署到函数应用程序。

函数的 folder structure 是每个文件夹一个函数。您需要将 Function 文件夹部署到 Function App 上的 ./site/wwwroot。如果您在更新之间添加任何新绑定,您还需要添加任何可能包含您的秘密的应用设置。

PowerShell 代码类似于:

    $apiUrl = $config.scmEndpoint + "/api/zip/"
    if ($destinationPath)
    {
        $apiUrl = $apiUrl + $destinationPath
    }

    $response = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $config.authInfo)} -Method PUT -InFile $zipFilePath -ContentType "multipart/form-data"

除了 Chris 描述的内容之外,还有第一个 class ARM API 可用于部署功能。这是它在 PowerShell 中的样子:

Function DeployHttpTriggerFunction($ResourceGroupName, $SiteName, $FunctionName, $CodeFile, $TestData)
{
    $FileContent = "$(Get-Content -Path $CodeFile -Raw)"

    $props = @{
        config = @{
            bindings = @(
                @{
                    type = "httpTrigger"
                    direction = "in"
                    webHookType = ""
                    name = "req"
                }
                @{
                    type = "http"
                    direction = "out"
                    name = "res"
                }
            )
        }
        files = @{
            "index.js" = $FileContent
        }
        test_data = $TestData
    }

    New-AzureRmResource -ResourceGroupName $ResourceGroupName -ResourceType Microsoft.Web/sites/functions -ResourceName $SiteName/$FunctionName -PropertyObject $props -ApiVersion 2015-08-01 -Force
}

有关底层 API 的信息,请参阅 https://github.com/projectkudu/kudu/wiki/Functions-API

您还可以使用 Azure CLI 2.0 + Azure Function CLI 部署 Azure 函数形式 commandline/powershell

Azure CLI API 可用于配置函数应用程序,使用命令

az functionapp create --name $functionappName --resource-group $resourceGroup --storage-account $storageAccountName --consumption-plan-location $consumptionPlanLocation

并应用应用程序设置

az functionapp config appsettings set --name $functionappName --resource-group $resourceGroup --settings "test=value"

并且 Azure Function CLI api 可用于部署您拥有的功能

func azure functionapp publish <azurefunctionapp>

得心应手的工具!

以防万一有像我这样的人需要逐步解决。这是使用 powershell 部署 azure 函数的过程(非 ARM 方式)

  1. 创建具有以下结构的 azure 函数

    myFunctionName(Folder)
    |
    |_ function.json (contains info on input, output, trigger)
    |_ run.csx (contains code)
    |_ [OPTIONAL] project.json (for nuget packages)
    |_ [OPTIONAL] bin(Folder)
       |_ all custom DLLs go in this folder
    
  2. 创建 myFunctionName 文件夹的 zip - 我们将其命名为 my.zip。确保压缩后 my.zip 包含 myFunctionName 文件夹及其所有内容

  3. 按照here所述找到您的发布配置文件用户名和密码,即

    $creds = Invoke-AzureRmResourceAction -ResourceGroupName YourResourceGroup -ResourceType Microsoft.Web/sites/config -ResourceName YourWebApp/publishingcredentials -Action list -ApiVersion 2015-08-01 -Force

    $username = $creds.Properties.PublishingUserName
    $password = $creds.Properties.PublishingPassword

然后使用 powershell 如下调用 Kudu REST API

    $username = '<publish username>' #IMPORTANT: use single quotes as username may contain $
    $password = "<publish password>"
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))

    $apiUrl = "https://<yourFunctionApp>.scm.azurewebsites.net/api/zip/site/wwwroot"
    $filePath = "<yourFunctionName>.zip"
    Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method PUT -InFile $filePath -ContentType "multipart/form-data"
  1. 前往 <yourFunctionApp>.scm.azurewebsites.net -> Debug menu at the top -> CMD。在出现的页面中,导航到 site -> wwwroot。您应该会在此处看到解压缩的 zip 文件的内容,您还可以验证您的 azure 函数在 azure 门户中是否可用。

参考资料

  1. https://github.com/projectkudu/kudu/wiki/REST-API#sample-of-using-rest-api-with-powershell

  2. http://markheath.net/post/deploy-azure-functions-kudu-powershell

除上述所有内容外,我们还发布了 Azure Functions 的预览模块 (https://www.powershellgallery.com/packages/Az.Functions/0.0.1-preview)。

目前,此模块包含托管函数应用程序和函数应用程序计划的 cmdlet。我已经打开一个问题来请求创建一个 cmdlet 来部署函数应用程序。如果您对此功能感兴趣,请在 https://github.com/Azure/azure-powershell/issues/10966 投票。

要安装 Azure Functions (Az.Functions) 模块,运行 来自最新版本 psws 的以下命令,可在 https://github.com/PowerShell/PowerShell/releases 下载。

Install-Module -Name Az.Functions -AllowPrerelease

请试一试并通过 https://github.com/Azure/azure-powershell/issues 向我们发送反馈。打开问题时,请确保标题中包含 [Az.Functions]。

干杯,

弗朗西斯科