本文介绍如何将函数应用项目文件从 .zip(压缩)文件部署到 Azure。 可在本文中了解如何通过 Azure CLI 和 REST API 进行推送部署。 Azure Functions 核心工具在将本地项目发布到 Azure 时也使用这些部署 API。
Zip 部署也是从 Azure 中的包文件运行函数的简单方法。 它是消耗、弹性高级和专用(应用服务)托管计划中的默认部署技术。
Azure Functions 具有完整的持续部署范围,以及由 Azure 应用服务提供的集成选项。
为了加快开发速度,你可能会发现直接通过 .zip 文件部署函数应用项目文件更为简单。 .zip 部署 API 接受 .zip 文件的内容并将内容提取到你的函数应用的 wwwroot 文件夹中。 此 .zip 文件部署使用相同的 Kudu 服务,支持基于持续集成的部署,包括:
- 删除之前的部署留下的文件。
- 部署自定义,包括运行部署脚本。
- 部署日志。
- 同步函数触发器在消耗计划函数应用中。
有关详细信息,请参阅 .zip 部署参考。
重要
使用 .zip 部署时,在后续部署到函数应用期间,会删除或更新上一部署中的任何文件。 函数应用中不属于上一部署的其他文件和目录将得到维护。
部署.zip 文件的要求
部署的 zip 存档必须包含运行函数应用所需的所有文件。 可以使用内置 .zip 压缩功能或非Microsoft工具从 Functions 项目文件夹的内容手动创建 zip 存档。
存档必须在提取文件夹的根目录中包含 host.json 文件。 函数应用的所选语言堆栈会创建其他要求:
重要
对于生成用于部署的已编译输出的语言,请确保压缩你计划发布的输出文件夹(而不是整个项目文件夹)的内容。 当 Functions 提取 zip 存档的内容时,host.json 文件必须存在于包的根目录中。
Zip 部署过程会在 wwwroot 目录中提取 zip 存档的文件和文件夹。 如果在创建存档时包括父目录,则系统不会找到它期望在其中 wwwroot看到的文件。
使用 Azure CLI 进行部署
可使用 Azure CLI 来触发推送部署。 使用 az functionapp deployment source config-zip 命令将 .zip 文件推送部署到函数应用。 要使用此命令,必须使用 Azure CLI 版本 2.0.21 或更高版本。 若要查看正在使用的 Azure CLI 版本,请使用 az --version 该命令。
以下命令将 <zip_file_path> 占位符替换为 .zip 文件的位置路径。 此外,请将 <app_name> 替换为函数应用的唯一名称,并将 <resource_group> 替换为资源组的名称。
az functionapp deployment source config-zip -g <resource_group> -n \
<app_name> --src <zip_file_path>
此命令将项目文件从下载的 .zip 文件部署到 Azure 中的函数应用。 然后重启应用。 要查看此函数应用的部署列表,必须使用 REST API。
在本地计算机上使用 Azure CLI 时,<zip_file_path> 是计算机中 .zip 文件的路径。
使用 REST API 部署 ZIP 文件
可以使用部署服务 REST API 将 .zip 文件部署到 Azure 中的应用。 若要部署,请将 POST 请求发送到 https://<app_name>.scm.chinacloudsites.cn/api/zipdeploy。 POST 请求必须在消息正文中包含此 .zip 文件。 应用的部署凭据是通过使用 HTTP BASIC 身份验证在请求中提供的。 有关详细信息,请参阅 .zip 推送部署参考。
对于 HTTP 基本身份验证,需使用应用服务部署凭据。 若要了解如何设置部署凭据,请参阅设置和重置用户级别凭据。
使用 cURL
以下示例使用 cURL 工具部署 .zip 文件。 替换占位符 <deployment_user>、<zip_file_path> 和 <app_name>。 出现 cURL 提示时,键入密码。
curl -X POST -u <deployment_user> --data-binary "@<zip_file_path>" https://<app_name>.scm.chinacloudsites.cn/api/zipdeploy
此请求从已上传的 .zip 文件触发推送部署。 可以使用 https://<app_name>.scm.chinacloudsites.cn/api/deployments 终结点查看当前和之前的部署,如以下 cURL 示例所示。 再次,将 <app_name> 替换为您的应用名称,并将 <deployment_user> 替换为您的部署凭据用户名。
curl -u <deployment_user> https://<app_name>.scm.chinacloudsites.cn/api/deployments
异步 Zip 文件部署
同步部署时,可能会收到与连接超时相关的错误。 将 ?isAsync=true 添加到 URL 能够以异步方式进行部署。 一旦 zip 文件上传,就会收到 Location 响应,其中包含指向可轮询部署状态 URL 的标头。 轮询 Location 标头中提供的 URL 时,您会在过程进行中收到 HTTP 202(已接受)响应,而在归档展开且部署成功完成后收到 HTTP 200(正常)响应。
Microsoft Entra 身份验证
对 zip 部署使用 HTTP BASIC 身份验证的替代方法是使用 Microsoft Entra 标识。 如果 SCM 站点禁用 HTTP BASIC 身份验证,则可能需要Microsoft Entra 标识。
需要为执行部署的用户或服务主体提供有效的Microsoft Entra 访问令牌。 可以使用 Azure CLI 的 az account get-access-token 命令检索访问令牌。 访问令牌在 HTTP POST 请求的身份验证标头中使用。
curl -X POST \
--data-binary "@<zip_file_path>" \
-H "Authorization: Bearer <access_token>" \
"https://<app_name>.scm.chinacloudsites.cn/api/zipdeploy"
使用 PowerShell
下面的示例使用 Publish-AzWebapp 上传 .zip 文件。 替换占位符 <group-name>、<app-name> 和 <zip-file-path>。
Publish-AzWebapp -ResourceGroupName <group-name> -Name <app-name> -ArchivePath <zip-file-path>
此请求从已上传的 .zip 文件触发推送部署。
若要查看当前和之前的部署,请运行以下命令。 再次替换 <deployment-user>、<deployment-password> 和 <app-name> 占位符。
$username = "<deployment-user>"
$password = "<deployment-password>"
$apiUrl = "https://<app-name>.scm.chinacloudsites.cn/api/deployments"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET
使用 ARM 模板进行部署
可以使用 ZipDeploy ARM 模板扩展将 .zip 文件推送到函数应用。
ZipDeploy ARM 模板示例
此模板包括生产槽和过渡槽,并部署到一个或另一个槽。 通常,您会使用此模板部署到暂存槽,并进行交换以使新的 zip 包在生产槽上运行。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appServiceName": {
"type": "string"
},
"deployToProduction": {
"type": "bool",
"defaultValue": false
},
"slot": {
"type": "string",
"defaultValue": "staging"
},
"packageUri": {
"type": "secureString"
}
},
"resources": [
{
"condition": "[parameters('deployToProduction')]",
"type": "Microsoft.Web/sites/extensions",
"apiVersion": "2021-02-01",
"name": "[format('{0}/ZipDeploy', parameters('appServiceName'))]",
"properties": {
"packageUri": "[parameters('packageUri')]",
"appOffline": true
}
},
{
"condition": "[not(parameters('deployToProduction'))]",
"type": "Microsoft.Web/sites/slots/extensions",
"apiVersion": "2021-02-01",
"name": "[format('{0}/{1}/ZipDeploy', parameters('appServiceName'), parameters('slot'))]",
"properties": {
"packageUri": "[parameters('packageUri')]",
"appOffline": true
}
}
]
}
对于初始部署,可以直接部署到生产槽。 有关详细信息,请参阅槽部署。
从部署包中运行函数
还可以选择直接从部署包文件中运行你的函数。 此方法跳过了将文件从包中复制到函数应用的 wwwroot 目录这一部署步骤。 相反,Functions 运行时会装载包文件,wwwroot 目录的内容变为只读。
Zip 部署集成了此功能,可以通过将函数应用设置 WEBSITE_RUN_FROM_PACKAGE 设置为 1 值来启用此功能。 有关详细信息,请参阅从部署包文件运行函数。
部署定制化
部署过程假设推送的 .zip 文件包含随时可运行的应用。 默认情况下,不会运行自定义。 若要启用通过持续集成获取的同一生成进程,请将以下内容添加到应用程序设置:
SCM_DO_BUILD_DURING_DEPLOYMENT=true
使用 .zip 推送部署时,此设置默认为“false”。 持续集成部署的设置默认为“true”。 当设置为“true”时,将使用您的部署相关设置进行部署。 可以将这些设置配置为应用设置或在位于 .zip 文件根目录中的 .deployment 配置文件中进行配置。 有关详细信息,请参阅部署参考中的 Repository and deployment-related settings(存储库和与部署相关的设置)。
下载您的函数应用文件
如果使用 Azure 门户中的编辑器创建了函数,则可以通过以下方式之一将现有函数应用项目下载为 .zip 文件:
通过 Azure 门户:
登录 Azure 门户,并转到函数应用。
在“概述”选项卡中,选择“下载应用内容”。 选择下载选项,然后选择“下载”。
所下载的 .zip 文件格式正确,可使用 .zip 推送部署将其重新发布到函数应用。 门户下载还可以添加直接在 Visual Studio 中打开您的 Function App 所需的文件。
使用 REST API:
使用以下部署 GET API 从
<function_app>项目中下载文件:https://<function_app>.scm.chinacloudsites.cn/api/zip/site/wwwroot/包含
/site/wwwroot/可确保 zip 文件仅包含函数应用项目文件,而不是整个站点。 如果尚未登录到 Azure,系统会要求你登录。
还可从 GitHub 存储库下载 .zip 文件。 在以 .zip 文件形式下载 GitHub 存储库时,GitHub 会为分支添加一个额外的文件夹级别。 此额外的文件夹级别意味着无法直接部署从 GitHub 下载的 .zip 文件。