为 Azure Functions 中的函数应用自动执行资源部署
可以使用 Bicep 文件或 Azure 资源管理器模板自动执行将函数应用部署到新的或现有的 Azure 资源的过程。 这种自动化提供了一种好办法,可以将资源部署与 DevOps 中的源代码集成、从备份还原函数应用和相关资源或多次部署应用拓扑。
本文介绍如何自动创建 Azure Functions 的资源和部署。 根据函数使用的触发器和绑定,可能需要部署其他资源,这不属于本文的讨论范畴。
具体模板代码取决于函数应用的托管方式、是部署代码还是容器化函数应用,以及应用使用的操作系统。 本文支持以下托管选项:
托管选项 | 部署类型 | 若要了解详细信息,请参阅... |
---|---|---|
Azure Functions 消耗计划 | 仅限代码 | 消耗计划 |
Azure Functions Elastic Premium 计划 | 代码 |容器 | 高级计划 |
Azure Functions Dedicated(应用服务)计划 | 代码 |容器 | 专用计划 |
所需资源
Azure Functions 托管部署通常包括以下资源:
资源 | 要求 | 语法和属性参考 |
---|---|---|
存储帐户 | 必选 | Microsoft.Storage/storageAccounts |
Application Insights 组件 | 建议 | Microsoft.Insights/components |
托管计划 | 必需1 | Microsoft.Web/serverfarms |
函数应用 | 必选 | Microsoft.Web/sites |
消耗计划的 Azure Functions 部署通常包括以下资源:
资源 | 要求 | 语法和属性参考 |
---|---|---|
存储帐户 | 必选 | Microsoft.Storage/storageAccounts |
Application Insights 组件 | 建议 | Microsoft.Insights/components |
函数应用 | 必选 | Microsoft.Web/sites |
资源 | 要求 | 语法和属性参考 |
---|---|---|
函数应用 | 必选 | Microsoft.Web/sites |
存储帐户 | 必选 | Microsoft.Storage/storageAccounts |
Application Insights 组件 | 可选 | Microsoft.Insights/components |
托管计划 | 可选1 | Microsoft.Web/serverfarms |
1只有选择在高级计划或应用服务计划上运行函数应用时,托管计划才是必需的。
提示
虽然不是必需的,但强烈建议为应用配置 Application Insights。
在单个 Bicep 文件或 ARM 模板中部署多个资源时,创建资源的顺序非常重要。 这一要求是资源之间依赖关系的结果。 对于此类依赖关系,请确保使用 dependsOn
元素在依赖资源中定义依赖关系。 有关详细信息,请参阅在 ARM 模板中定义部署资源的顺序或 Bicep 中的资源依赖关系。
本文假设你对创建 Bicep 文件或创作 Azure 资源管理器模板有基本了解,并且针对特定资源以单独部分的形式展示相关示例。 有关一组广泛的完整 Bicep 文件和 ARM 模板示例,请参阅这些函数应用部署示例。
创建存储帐户
所有函数应用都需要一个 Azure 存储帐户。 你需要一个支持 blob、表、队列和文件的常规用途帐户。 有关详细信息,请参阅 Azure Functions 存储帐户要求。
重要
存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。
本示例部分创建标准常规用途 v2 存储帐户:
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-05-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"kind": "StorageV2",
"sku": {
"name": "[parameters('storageAccountType')]"
},
"properties": {
"supportsHttpsTrafficOnly": true,
"defaultToOAuthAuthentication": true
}
}
]
有关更多上下文,请参阅模板存储库中完整的 azuredeploy.json 文件。
需要将此存储帐户的连接字符串设置为 Functions 所需的 AzureWebJobsStorage
应用设置。 本文中的模板基于创建的存储帐户构造此连接字符串值,这是最佳做法。 有关详细信息,请参阅应用程序配置。
启用存储日志
由于存储帐户用于重要的函数应用数据,因此应该监视此帐户,以了解该内容的修改情况。 要监视存储帐户,需要为 Azure 存储配置 Azure Monitor 资源日志。 在此示例部分,名为 myLogAnalytics
的 Log Analytics 工作区用作这些日志的目标。
"resources": [
{
"type": "Microsoft.Insights/diagnosticSettings",
"apiVersion": "2021-05-01-preview",
"scope": "[format('Microsoft.Storage/storageAccounts/{0}/blobServices/default', parameters('storageAccountName'))]",
"name": "[parameters('storageDataPlaneLogsName')]",
"properties": {
"workspaceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('myLogAnalytics'))]",
"logs": [
{
"category": "StorageWrite",
"enabled": true
}
],
"metrics": [
{
"category": "Transaction",
"enabled": true
}
]
}
}
]
该工作区可用于稍后定义的 Application Insights 资源。 有关详细信息,包括如何使用这些日志,请参阅监视 Azure 存储。
创建 Application Insights
建议使用 Application Insights 监视函数应用执行。 在本示例部分中,Application Insights 资源使用类型 Microsoft.Insights/components
和类型 web
定义:
{
"type": "Microsoft.Insights/components",
"apiVersion": "2020-02-02",
"name": "[variables('applicationInsightsName')]",
"location": "[parameters('appInsightsLocation')]",
"tags": {
"[format('hidden-link:{0}', resourceId('Microsoft.Web/sites', parameters('functionAppName')))]": "Resource"
},
"properties": {
"Application_Type": "web"
},
"kind": "web"
},
有关更多上下文,请参阅模板存储库中完整的 azuredeploy.json 文件。
必须使用 APPLICATIONINSIGHTS_CONNECTION_STRING
应用程序设置向函数应用提供连接。 有关详细信息,请参阅应用程序设置。
本文中的示例获取所创建的实例的连接字符串值。 旧版本可能会改用 APPINSIGHTS_INSTRUMENTATIONKEY
来设置检测密钥,这是不再推荐的做法。
创建托管计划
托管在 Azure Functions Premium 计划或 Dedicated(应用服务)计划中的应用必须显式定义托管计划。
高级计划提供与消耗计划相同的扩展,但包括专用资源和附加功能。 若要了解详细信息,请参阅 Azure Functions 高级计划。
高级计划是特殊类型的 serverfarm
资源。 可通过使用 EP1
、EP2
或 EP3
作为 sku
属性中的 Name
属性值来指定它。 定义 Functions 托管计划的方式取决于函数应用是在 Windows 还是 Linux 上运行。 此示例部分创建 EP1
计划:
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "EP1",
"tier": "ElasticPremium",
"family": "EP"
},
"kind": "elastic",
"properties": {
"maximumElasticWorkerCount": 20
}
}
]
有关更多上下文,请参阅模板存储库中完整的 azuredeploy.json 文件。
有关 sku
对象的详细信息,请参阅 SkuDefinition
或查看示例模板。
在 Dedicated(应用服务)计划中,函数应用在应用服务计划中的基本、标准和高级 SKU 上的专用 VM 上运行,类似于 Web 应用。 有关详细信息,请参阅 Dedicated 计划。
有关 Bicep 文件/Azure 资源管理器模板示例,请参阅基于 Azure 应用服务计划的函数应用
在 Functions 中,专用计划只是由 serverfarm
资源定义的常规应用服务计划。 必须至少提供 name
值。 有关受支持的计划名称列表,请参阅 az appservice plan create
中的 --sku
设置,了解 Dedicated 计划的当前受支持值列表。
定义托管计划的方式取决于函数应用是在 Windows 还是 Linux 上运行:
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"tier": "Standard",
"name": "S1",
"size": "S1",
"family": "S",
"capacity": 1
}
}
]
有关更多上下文,请参阅模板存储库中完整的 azuredeploy.json 文件。
创建托管计划
无需显式定义消耗托管计划资源。 如果跳过此资源定义,则在创建函数应用资源本身时,会基于区域自动创建或选择计划。
可以将消耗计划显式定义为特殊类型的 serverfarm
资源,该资源使用 computeMode
和 sku
属性的值 Dynamic
指定。 本示例部分演示如何显式定义消耗计划。 定义托管计划的方式取决于函数应用是在 Windows 还是 Linux 上运行。
"resources": [
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('hostingPlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Y1",
"tier": "Dynamic",
"size": "Y1",
"family": "Y",
"capacity": 0
},
"properties": {
"computeMode": "Dynamic"
}
}
]
有关更多上下文,请参阅模板存储库中完整的 azuredeploy.json 文件。
创建函数应用
函数应用资源由类型为 Microsoft.Web/sites
和 kind
的资源定义,其中至少包括 functionapp
。
定义函数应用资源的方式取决于是托管在 Linux 上还是 Windows 上:
有关在 Windows 上运行时所需的应用程序设置的列表,请参阅应用程序配置。 如需获取 Bicep 文件/Azure 资源管理器模板示例,请参阅消耗计划中托管在 Windows 上的函数应用模板。
注意
如果选择有选择地定义消耗计划,则必须在应用上设置 serverFarmId
属性,使其指向计划的资源 ID。 确保函数应用还有一个引用该计划的 dependsOn
设置。 如果未显式定义计划,系统会创建一个计划。
在应用上设置 serverFarmId
属性,使其指向计划的资源 ID。 确保函数应用还有一个引用该计划的 dependsOn
设置。
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[toLower(parameters('functionAppName'))]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
}
]
}
}
}
]
如需完整的端到端示例,请参阅此 azuredeploy.json 模板。
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]",
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"alwaysOn": true,
"appSettings": [
{
"name": "APPLICATIONINSIGHTS_CONNECTION_STRING",
"value": "[reference(resourceId('Microsoft.Insights/components', parameters('applicationInsightsName')), '2020-02-02').ConnectionString]"
},
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', parameters('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
}
]
}
}
}
]
如需完整的端到端示例,请参阅此 azuredeploy.json 模板。
部署源
Bicep 文件或 ARM 模板还可以选择性地使用 zip 部署包为函数代码定义部署。
若要使用 Azure 资源管理器成功部署应用程序,了解如何在 Azure 中部署资源尤为重要。 在大多数情况下,使用 siteConfig
应用顶级配置。 请务必在顶级设置这些配置,因为这些配置会将信息传达给 Functions 运行时和部署引擎。 在应用子 sourcecontrols/web
资源之前,需要使用顶级信息。 尽管可以在子级 config/appSettings
资源中配置这些设置,但在某些情况下,必须在应用 config/appSettings
之前部署函数应用。
Zip 部署包
Zip 部署是部署函数应用代码的推荐方法。 默认情况下,使用 zip 部署的函数在部署包本身中运行。 有关详细信息,包括部署包的要求,请参阅 Azure Functions 的 Zip 部署。 使用资源部署自动化时,可以在 Bicep 或 ARM 模板中引用 .zip 部署包。
若要在模板中使用 zip 部署,请将应用中的 WEBSITE_RUN_FROM_PACKAGE
设置设置为 1
并包括 /zipDeploy
资源定义。
对于 Linux 上的消耗计划,请直接在 WEBSITE_RUN_FROM_PACKAGE
设置中设置部署包的 URI,如此示例模板所示。
此示例将 zip 部署源添加到现有应用:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"functionAppName": {
"type": "string",
"metadata": {
"description": "The name of the Azure Function app."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location into which the resources should be deployed."
}
},
"packageUri": {
"type": "string",
"metadata": {
"description": "The zip content url."
}
}
},
"resources": [
{
"name": "[concat(parameters('functionAppName'), '/ZipDeploy')]",
"type": "Microsoft.Web/sites/extensions",
"apiVersion": "2021-02-01",
"location": "[parameters('location')]",
"properties": {
"packageUri": "[parameters('packageUri')]"
}
}
]
}
在模板中添加 zip 部署资源时,请记住以下事项:
- Linux 上的消耗计划不支持
WEBSITE_RUN_FROM_PACKAGE = 1
。 必须直接在WEBSITE_RUN_FROM_PACKAGE
设置中设置部署包的 URI。 有关详细信息,请参阅 WEBSITE_RUN_FROM_PACKAGE。 有关示例模板,请参阅消耗计划中托管在 Linux 上的函数应用。
packageUri
必须是 Functions 可以访问的位置。 请考虑将 Azure Blob 存储与共享访问签名 (SAS) 配合使用。 SAS 过期后,Functions 无法再访问用于部署的共享。 重新生成 SAS 时,请记得使用新的 URI 值更新WEBSITE_RUN_FROM_PACKAGE
设置。添加或更新设置时,请确保始终在
appSettings
集合中设置所有必需的应用程序设置。 更新会删除未显式设置的现有设置。 有关详细信息,请参阅应用程序配置。Functions 不支持将 Web 部署 (msdeploy) 用于包部署。 必须在部署管道和自动化中使用 zip 部署。 有关详细信息,请参阅 Azure Functions 的 Zip 部署。
远程生成
部署过程假定你使用的 .zip 文件或 zip 部署包含可随时运行的应用。 这意味着默认情况下不会运行任何自定义项。
但是,在某些情况下,需要远程重新生成应用,例如,当你需要在 Windows 计算机上开发的 Python 或 Node.js 应用中拉取特定于 Linux 的包时。 在这种情况下,可以将 Functions 配置为在 zip 部署后对代码执行远程生成。
请求远程生成的方式取决于要部署到的操作系统:
Linux 容器
如果要将容器化函数应用 部署到 Azure Functions Premium 或 Dedicated 计划,则必须:
- 使用容器映像的标识符设置
linuxFxVersion
站点设置。 - 从专用注册表获取容器时设置任何所需的
DOCKER_REGISTRY_SERVER_*
设置。 - 将
WEBSITES_ENABLE_APP_SERVICE_STORAGE
应用程序设置设置为false
。
有关详细信息,请参阅应用程序配置。
"resources": [
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-03-01",
"name": "[parameters('functionAppName')]",
"location": "[parameters('location')]",
"kind": "functionapp",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
],
"properties": {
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsStorage",
"value": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-09-01').keys[0].value)]"
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "node"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "~14"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4"
},
{
"name": "DOCKER_REGISTRY_SERVER_URL",
"value": "[parameters('dockerRegistryUrl')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_USERNAME",
"value": "[parameters('dockerRegistryUsername')]"
},
{
"name": "DOCKER_REGISTRY_SERVER_PASSWORD",
"value": "[parameters('dockerRegistryPassword')]"
},
{
"name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
"value": "false"
}
],
"linuxFxVersion": "DOCKER|myacr.azurecr.io/myimage:mytag"
}
}
}
]
使用 Bicep 文件或 ARM 模板处理站点和应用程序设置时,请记住以下注意事项:
- 在自动化部署中设置
WEBSITE_CONTENTSHARE
时,有一些需要考虑的重要事项。 有关详细指南,请参阅WEBSITE_CONTENTSHARE
参考。
- 对于容器部署,还需要将
WEBSITES_ENABLE_APP_SERVICE_STORAGE
设置为false
,因为容器本身中提供了应用内容。
应始终将应用程序设置定义为所创建的
Microsoft.Web/sites
资源的siteConfig/appSettings
集合,如本文示例中所示。 这可确保函数应用运行所需的设置在初始启动时可用。使用模板添加或更新应用程序设置时,请确保在更新中包含所有现有设置。 必须执行此操作,因为基础更新 REST API 调用会替换整个
/config/appsettings
资源。 如果删除现有设置,函数应用将不会运行。 若要以编程方式更新单个应用程序设置,可以改用 Azure CLI、Azure PowerShell 或 Azure 门户进行更改。 有关详细信息,请参阅使用应用程序设置。
槽部署
Functions 支持将不同版本的代码部署到函数应用中的唯一终结点。 这样就可以更轻松地开发、验证和部署函数更新,而不会影响生产环境中运行的函数。 部署槽位是 Azure 应用服务的一项功能。 可用槽数取决于托管计划。 有关详细信息,请参阅 Azure Functions 部署槽位函数。
槽资源的定义方式与函数应用资源 (Microsoft.Web/sites
) 相同,但使用 Microsoft.Web/sites/slots
资源标识符。 有关在 Premium 计划中创建生产槽和过渡槽的示例部署(在 Bicep 和 ARM 模板中),请参阅具有部署槽位的 Azure 函数应用。
若要了解如何使用模板执行交换,请参阅使用资源管理器模板自动执行。
使用槽部署时,请记住以下注意事项:
不要在部署槽位定义中显式设置
WEBSITE_CONTENTSHARE
设置。 在部署槽位中创建应用时,会生成此设置。交换槽时,某些应用程序设置被视为“有粘性的”,因为它们与槽保持一致,而不是与被交换的代码保持一致。 可以通过在模板中的特定应用程序设置定义中包含
"slotSetting":true
来定义此类槽设置。 有关详细信息,请参阅管理设置。
安全部署
可以在部署中创建函数应用,其中一个或多个资源已通过与虚拟网络集成受到保护。 函数应用的虚拟网络集成由 Microsoft.Web/sites/networkConfig
资源定义。 此集成取决于引用的函数应用和虚拟网络资源。 函数应用还可能依赖于其他专用网络资源,例如专用终结点和路由。 有关详细信息,请参阅 Azure Functions 网络选项。
创建使用安全存储帐户的部署时,必须显式设置 WEBSITE_CONTENTSHARE
设置并创建在此设置中命名的文件共享资源。 确保使用 WEBSITE_CONTENTSHARE
值创建 Microsoft.Storage/storageAccounts/fileServices/shares
资源,如本示例(ARM 模板|Bicep 文件)所示。 还需要将站点属性 vnetContentShareEnabled
设置为 true。
注意
如果这些设置不是使用安全存储帐户的部署的一部分,那么在部署验证期间会看到此错误:Could not access storage account using provided connection string
。
这些项目提供 Bicep 和 ARM 模板示例,演示如何在虚拟网络中部署函数应用,包括有网络访问限制的情况:
受限制的场景 | 说明 |
---|---|
创建具有虚拟网络集成的函数应用 | 函数应用是在具有对该网络中资源的完全访问权限的虚拟网络中创建的。 对函数应用的入站和出站访问不受限制。 有关详细信息,请参阅虚拟网络集成。 |
创建访问安全存储帐户的函数应用 | 创建的函数应用使用安全存储帐户,Functions 使用专用终结点访问该帐户。 有关详细信息,请参阅将存储帐户限制在虚拟网络中。 |
创建使用专用终结点的函数应用和存储帐户 | 创建的函数应用只能使用专用终结点进行访问,并且它使用专用终结点访问存储资源。 有关详细信息,请参阅专用终结点。 |
受限网络设置
当函数应用存在网络限制时,可能还需要使用这些设置:
设置 | 值 | 说明 |
---|---|---|
WEBSITE_CONTENTOVERVNET |
1 |
使函数应用能够在存储帐户限制在虚拟网络中时进行缩放的应用程序设置。 有关详细信息,请参阅将存储帐户限制在虚拟网络中。 |
vnetrouteallenabled |
1 |
强制来自函数应用的所有流量使用虚拟网络的站点设置。 有关详细信息,请参阅区域虚拟网络集成。 此站点设置取代了应用程序设置 WEBSITE_VNET_ROUTE_ALL 。 |
网络限制注意事项
通过专用终结点限制对存储帐户的访问时,无法通过门户或虚拟网络外部的任何设备访问存储帐户。 可以通过管理默认网络访问规则授予对存储帐户中安全 IP 地址或虚拟网络的访问权限。
创建模板
使用 Bicep 或 ARM 模板的专家可以使用简单的文本编辑器对部署手动编码。 对于其他人来说,有几种方法可以简化开发过程:
Visual Studio Code:有一些扩展可帮助你处理 Bicep 文件和 ARM 模板。 可以使用这些工具来帮助确保代码正确,这些工具可提供一些基本验证。
Azure 门户:在门户中创建函数应用和相关资源时,最后的“查看 + 创建”屏幕有“下载自动化模板”链接。
此链接显示基于在门户中选择的选项生成的 ARM 模板。 虽然在创建包含许多新资源的函数应用时,此模板可能有点复杂,但它可以为 ARM 模板的外观提供良好的参考。
验证模板
手动创建部署模板文件时,请务必在部署之前验证模板。 所有部署方法都验证模板语法并引发 validation failed
错误消息,如以下 JSON 格式的示例所示:
{"error":{"code":"InvalidTemplate","message":"Deployment template validation failed: 'The resource 'Microsoft.Web/sites/func-xyz' is not defined in the template. Please see https://aka.ms/arm-template for usage details.'.","additionalInfo":[{"type":"TemplateViolation","info":{"lineNumber":0,"linePosition":0,"path":""}}]}}
以下方法可用于在部署之前验证模板:
带有 deploymentMode: 'Validation'
的以下 Azure 资源组部署 v2 任务可指示 Azure Pipelines 验证模板。
- task: AzureResourceManagerTemplateDeployment@3
inputs:
deploymentScope: 'Resource Group'
subscriptionId: # Required subscription ID
action: 'Create Or Update Resource Group'
resourceGroupName: # Required resource group name
location: # Required when action == Create Or Update Resource Group
templateLocation: 'Linked artifact'
csmFile: # Required when TemplateLocation == Linked Artifact
csmParametersFile: # Optional
deploymentMode: 'Validation'
部署模板
可以使用以下任意方法部署 Bicep 文件和模板:
“部署到 Azure”按钮
备注
这种方法目前不支持部署 Bicep 文件。
将 <url-encoded-path-to-azuredeploy-json>
替换为 GitHub 中 azuredeploy.json
文件的原始路径的 URL 编码版本。
下面为使用 Markdown 的示例:
[![Deploy to Azure](https://azuredeploy.net/deploybutton.png)](https://portal.azure.cn/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)
下面为使用 HTML 的示例:
<a href="https://portal.azure.cn/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>" target="_blank"><img src="https://azuredeploy.net/deploybutton.png"></a>
使用 PowerShell 进行部署
以下 PowerShell 命令将创建一个资源组并部署一个 Bicep 文件/ARM 模板,该文件/模板将创建具有所需资源的函数应用。 若要在本地运行,必须安装 Azure PowerShell。 运行 Connect-AzAccount -Environment AzureChinaCloud
进行登录。
# Register Resource Providers if they're not already registered
Register-AzResourceProvider -ProviderNamespace "microsoft.web"
Register-AzResourceProvider -ProviderNamespace "microsoft.storage"
# Create a resource group for the function app
New-AzResourceGroup -Name "MyResourceGroup" -Location 'China North 2'
# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile azuredeploy.json -Verbose
若要测试此部署,可以使用这样的模板,该模板在消耗计划中在 Windows 上创建函数应用。
后续步骤
深入了解如何开发和配置 Azure Functions。