你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
若要自动部署函数应用,请使用 Bicep 文件或 Azure 资源管理器模板(ARM 模板)。 在部署期间,可以使用现有的 Azure 资源或创建新资源。
通过使用部署自动化,基础结构即代码(IaC)和持续集成和部署(CI/CD),可以为生产应用带来以下优势:
- 一致性:在代码中定义基础结构,以确保跨环境进行一致的部署。
- 版本控制:跟踪源代码管理中基础结构和应用程序配置的更改以及项目代码。
- 自动化:自动化部署,可减少手动错误并缩短发布过程。
- 可伸缩性:轻松复制多个环境的基础结构,例如开发、测试和生产。
- 灾难恢复:在发生故障或迁移期间快速重新创建基础结构。
本文介绍如何自动为Azure Functions创建Azure资源和部署配置。 若要详细了解项目代码的持续部署,请参阅
用于创建所需Azure资源的模板代码取决于函数应用的所需托管选项。 本文支持以下托管选项:
| 托管选项 | 部署类型 | 示例模板 |
|---|---|---|
| Flex 消耗计划 | 仅限代码 |
Bicep ARM 模板 Terraform |
| 高级计划 | 代码 | 容器 |
Bicep ARM 模板 |
| 专用计划 | 代码 | 容器 |
Bicep ARM 模板 |
| Azure 容器应用 | 仅限容器 | Bicep |
| 消耗计划(旧版) | 仅限代码 |
Bicep ARM 模板 |
对于新的无服务器函数应用,请使用 Flex Consumption 计划。
消费计划是传统的托管计划。 对于现有应用, 请迁移到 Flex Consumption 计划。
请确保选择文章顶部的托管计划。
重要说明
在 2026 年 9 月 30 日之后,在 Linux 上运行的使用消耗计划中的函数应用将停止运行这些生命周期结束的 v3 运行时。 为了避免服务中断, 请将应用迁移到 v4 运行时。
在消耗计划中托管 Linux 上的函数应用的选项将于 2028 年 9 月 30 日停用。 Linux 消费计划未获取任何新功能或 语言版本。 消耗计划中Windows上运行的应用当前不受影响。 在停用日期之前,将应用迁移到 Flex Consumption 计划。
使用本文时,请记住以下注意事项:
没有用于构造 ARM 模板的规范方法。
可以将 Bicep 部署模块化为多个 Bicep 文件和 Azure 已验证模块(AVM)。
本文假定你已基本了解 创建 Bicep 文件或 编写 Azure Resource Manager 模板。
- 显示的示例为特定资源的各个部分。 有关一组广泛的完整 Bicep 文件和 ARM 模板示例,请参阅 这些功能应用部署示例。
- 显示的示例为特定资源的各个部分。 对于 Bicep,如果有可用的 Azure 验证模块 (AVM),则会显示。 有关一系列完整的 Bicep 文件和 ARM 模板示例,请参阅 Flex 消耗应用部署示例。
- 显示的示例为特定资源的各个部分。
所需资源
必须为Azure Functions托管的部署创建或配置这些资源:
| 资源 | 要求 | 语法和属性参考 |
|---|---|---|
| 存储帐户 | 必需 | Microsoft。Storage/storageAccounts |
| Application Insights 组件 | 推荐 | Microsoft。Insights/components* |
| 托管计划 | 必需 | Microsoft.Web/serverfarms |
| 函数应用 | 必需 | Microsoft。网站 |
必须为Azure Functions托管的部署创建或配置这些资源:
| 资源 | 要求 | 语法和属性参考 |
|---|---|---|
| 存储帐户 | 必需 | Microsoft。Storage/storageAccounts |
| Application Insights 组件 | 推荐 | Microsoft。Insights/components* |
| 函数应用 | 必需 | Microsoft。网站 |
Azure Container Apps托管的部署通常包含以下资源:
| 资源 | 要求 | 语法和属性参考 |
|---|---|---|
| 存储帐户 | 必需 | Microsoft。Storage/storageAccounts |
| Application Insights 组件 | 推荐 | Microsoft。Insights/components* |
| 托管环境 | 必需 | Microsoft.App/managedEnvironments |
| 函数应用 | 必需 | Microsoft。网站 |
*如果还没有 Application Insights 实例可以使用的 Log Analytics 工作区,则还需要创建此资源。
在单个Bicep文件或 ARM 模板中部署多个资源时,创建资源的顺序非常重要。 此要求源于资源之间的依赖关系。 对于此类依赖关系,请确保使用 dependsOn 元素在依赖资源中定义依赖关系。 有关详细信息,请参阅
先决条件
- 这些示例在现有资源组的上下文中工作。
- Application Insights 和存储日志都需要现有的 Azure Log Analytics 工作区。 可以在服务之间共享工作区。 若要提高性能,请在每个地理区域中创建一个工作区。 有关如何创建Log Analytics工作区的示例,请参阅 创建Log Analytics工作区。 可以在 Azure 门户中的“设置” “属性” 下的工作区页面上找到完全限定的工作区资源 ID。
- 本文假定已在 Azure 容器应用中创建了 托管环境 。 需要使用托管环境的名称和 ID 才能创建在容器应用上托管的函数应用。
创建存储帐户
所有函数应用都需要Azure存储帐户。 需要一个支持 Blob、表、队列和文件的常规用途帐户。 有关详细信息,请参阅Azure Functions存储帐户要求。
重要说明
存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。
本示例部分创建标准常规用途 v2 存储帐户:
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
properties: {
supportsHttpsTrafficOnly: true
defaultToOAuthAuthentication: true
allowBlobPublicAccess: false
minimumTlsVersion: 'TLS1_2'
}
}
有关更多上下文,请参阅模板存储库中完整的 main.bicep 文件。
有关更多上下文,请参阅示例存储库中的完整 storage-PrivateEndpoint.bicep 文件。
函数应用需要连接到此存储帐户。 使用 AzureWebJobsStorage 设置配置此连接。 有关详细信息,请参阅应用程序配置。
Tip
为了提高安全性,请将 allowSharedKeyAccess: false 添加到存储帐户属性,并使用基于托管标识的连接,而不是使用连接字符串。 本文中的 Flex Consumption 计划示例使用此方法,包括 AzureWebJobsStorage__* 基于标识的设置和系统分配的托管标识。 有关详细信息,请参阅使用标识连接到宿主存储。
Tip
为了提高安全性,请在存储帐户上设置为allowSharedKeyAccessfalse,并使用基于托管标识的连接,而不是连接字符串。 有关详细信息,请参阅使用标识连接到宿主存储。
重要说明
弹性高级版和消耗计划使用 Azure Files 来共享内容,而 Azure Files 目前不支持基于托管标识的连接。 此限制意味着这些计划需要对存储帐户进行共享密钥访问,因此不要设置为 allowSharedKeyAccessfalse。 当必须使用连接字符串时,将它们存储在 Azure Key Vault 中,并在应用设置中使用 Key Vault 引用 ,而不是直接存储密钥。 如果要删除 Azure 文件依赖项,请参阅 “创建没有 Azure 文件存储的应用”。
部署容器
若要部署到在 Flex Consumption 计划中运行的应用,需要 Azure Blob 存储中的容器作为部署源。 可以使用默认存储帐户或指定单独的存储帐户。 有关详细信息,请参阅配置部署设置。
创建应用时必须配置此部署帐户,包括用于部署的特定容器。 若要详细了解如何配置部署,请参阅部署源。
此示例演示如何在存储帐户中创建容器:
}
// Azure Functions Flex Consumption
module functionApp 'br/public:avm/res/web/site:0.16.0' = {
name: 'functionapp'
scope: rg
params: {
kind: 'functionapp,linux'
name: functionAppName_resolved
location: location
tags: union(tags, { 'azd-service-name': 'api' })
serverFarmResourceId: appServicePlan.outputs.resourceId
managedIdentities: {
systemAssigned: true
}
functionAppConfig: {
deployment: {
storage: {
type: 'blobContainer'
value: '${storage.outputs.primaryBlobEndpoint}${deploymentStorageContainerName}'
authentication: {
type: 'SystemAssignedIdentity'
}
启用存储日志
由于存储帐户用于重要的函数应用数据,因此请监视帐户以修改该内容。 若要监视存储帐户,请为 Azure 存储配置 Azure Monitor 资源日志。 在本示例中,名为 myLogAnalytics 的Log Analytics工作区用作这些日志的目标。
resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-05-01' existing = {
name:'default'
parent:storageAccountName
}
resource storageDataPlaneLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
name: '${storageAccountName}-logs'
scope: blobService
properties: {
workspaceId: myLogAnalytics.id
logs: [
{
category: 'StorageWrite'
enabled: true
}
]
metrics: [
{
category: 'Transaction'
enabled: true
}
]
}
}
可以将同一工作区用于稍后定义的 Application Insights 资源。 有关详细信息,包括如何使用这些日志,请参阅 Monitoring Azure Storage。
创建 Application Insights
使用 Application Insights 监视函数应用程序的执行。 Application Insights 现在需要一个可以共享的Azure Log Analytics工作区。 以下示例假设你使用现有工作区,并且具有工作区的完全限定的资源 ID。 有关详细信息,请参阅 Azure Log Analytics 工作区。
在本示例部分中,定义带有类型 Microsoft.Insights/components 和种类 web 的 Application Insights 资源:
resource applicationInsight 'Microsoft.Insights/components@2020-02-02' = {
name: applicationInsightsName
location: appInsightsLocation
tags: tags
kind: 'web'
properties: {
Application_Type: 'web'
WorkspaceResourceId: '<FULLY_QUALIFIED_RESOURCE_ID>'
}
}
有关更多上下文,请参阅模板存储库中完整的 main.bicep 文件。
必须使用应用程序设置提供与函数应用 APPLICATIONINSIGHTS_CONNECTION_STRING 的连接。 有关详细信息,请参阅应用程序配置。
本文中的示例获取所创建的实例的连接字符串值。 旧版本可能会改用 APPINSIGHTS_INSTRUMENTATIONKEY 来设置检测密钥,这是不再推荐的做法。
创建托管计划
必须为 Azure Functions Flex Consumption 计划、 高级计划或 专用(应用服务)计划中托管的应用显式定义托管计划。
Flex Consumption 是基于 Linux 的托管计划,它基于 Consumption 按使用付费的无服务器计费模型。 计划的特点是支持专用网络、实例内存大小选择和改进的托管标识支持。
Flex Consumption 计划是一种特殊的 serverfarm 资源。 可通过在 FC1 属性中使用 Name 作为 sku 属性值并将 tier 值设为 FlexConsumption 来指定它。
本示例部分创建 Flex 消耗计划:
scaleAndConcurrency: {
maximumInstanceCount: maximumInstanceCount
instanceMemoryMB: instanceMemoryMB
}
runtime: {
name: functionAppRuntime
version: functionAppRuntimeVersion
}
}
siteConfig: {
alwaysOn: false
}
configs: [{
name: 'appsettings'
properties:{
此示例使用应用服务计划的 AVM。 有关上下文中的代码片段,请参阅 此部署示例。
由于 Flex 消耗计划目前仅支持 Linux,因此还必须将 reserved 属性设置为 true。
高级计划提供与消耗计划相同的扩展,但包括专用资源和附加功能。 若要了解详细信息,请参阅 Azure Functions Premium Plan。
高级计划是特殊类型的 serverfarm 资源。 可通过使用 EP1、EP2 或 EP3 作为 Name 属性中的 sku 属性值来指定它。 定义 Functions 托管计划的方式取决于函数应用是在Windows还是在 Linux 上运行。 此示例部分创建 EP1 计划:
resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
name: 'EP1'
tier: 'ElasticPremium'
family: 'EP'
}
kind: 'elastic'
properties: {
maximumElasticWorkerCount: 20
}
}
有关更多上下文,请参阅模板存储库中完整的 main.bicep 文件。
有关 sku 对象的详细信息,请参阅 SkuDefinition 或查看示例模板。
在专用(应用服务)计划中,函数应用在应用服务计划中的基本、标准和高级 SKU 上的专用虚拟机上运行,类似于 Web 应用。 有关详细信息,请参阅专用计划。
有关 Bicep 文件/Azure 资源管理器模板示例,请参阅基于 Azure 应用服务计划的函数应用。
在 Functions 中,专用计划只是由 serverfarm 资源定义的常规应用服务计划。 必须至少提供 name 值。 有关受支持的计划名称列表,请参阅 --sku 中的 az appservice plan create 设置,了解 Dedicated 计划的当前受支持值列表。
定义托管计划的方式取决于函数应用是在 Windows 还是在 Linux 上运行:
resource hostingPlanName 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
tier: 'Standard'
name: 'S1'
size: 'S1'
family: 'S'
capacity: 1
}
}
有关更多上下文,请参阅模板存储库中完整的 main.bicep 文件。
创建托管计划
无需显式定义消耗托管计划资源。 跳过此资源定义时,门户会在创建函数应用资源本身时按区域自动创建或选择计划。
可以将消耗计划显式定义为特殊类型的 serverfarm 资源。 将 computeMode 和 sku 属性设置为 Dynamic. 本示例部分演示如何显式定义消耗计划。 定义托管计划的方式取决于函数应用是在 Windows 还是在 Linux 上运行。
resource hostingPlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: hostingPlanName
location: location
sku: {
name: 'Y1'
tier: 'Dynamic'
size: 'Y1'
family: 'Y'
capacity: 0
}
properties: {
computeMode: 'Dynamic'
}
}
有关更多上下文,请参阅模板存储库中完整的 main.bicep 文件。
创建函数应用
将函数应用资源定义为Microsoft.Web/sites类型的资源,并为其定义包含functionapp的kind属性。
定义函数应用资源的方式取决于是托管在 Linux 上还是 Windows 上:
有关在 Windows 上运行时所需的应用程序设置列表,请参阅 Application 配置。 有关示例 Bicep 文件或 Azure 资源管理器模板,请参阅 消耗计划模板中 Windows 上托管的函数应用 。
有关在 Windows 上运行时所需的应用程序设置列表,请参阅 Application 配置。
Flex 消耗取代了 Bicep 和 ARM 模板部署中使用的多个标准应用程序设置和站点配置属性。 有关详细信息,请参阅应用程序配置。
AzureWebJobsStorage__blobServiceUri: 'https://${storage.outputs.name}.blob.${environment().suffixes.storage}'
AzureWebJobsStorage__queueServiceUri: 'https://${storage.outputs.name}.queue.${environment().suffixes.storage}'
AzureWebJobsStorage__tableServiceUri: 'https://${storage.outputs.name}.table.${environment().suffixes.storage}'
// Application Insights settings are always included
APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.outputs.connectionString
APPLICATIONINSIGHTS_AUTHENTICATION_STRING: 'Authorization=AAD'
}
}]
}
}
// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
name: 'rbacAssignments'
scope: rg
params: {
storageAccountName: storage.outputs.name
appInsightsName: applicationInsights.outputs.name
managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
userIdentityPrincipalId: principalId
allowUserIdentityPrincipal: !empty(principalId)
}
}
// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString
注意
如果选择有选择地定义消耗计划,则必须在应用上设置 serverFarmId 属性,使其指向计划的资源 ID。 确保函数应用还有一个引用该计划的 dependsOn 设置。 如果未显式定义计划,系统会创建一个计划。
在应用上设置 serverFarmId 属性,使其指向计划的资源 ID。 确保函数应用还有一个引用该计划的 dependsOn 设置。
resource functionAppName_resource 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlanName.id
siteConfig: {
appSettings: [
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'WEBSITE_CONTENTSHARE'
value: toLower(functionAppName)
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
]
}
}
}
有关完整的端到端示例,请参阅此 main.bicep 文件。
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
alwaysOn: true
appSettings: [
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
]
}
}
}
有关完整的端到端示例,请参阅此 main.bicep 文件。
部署源
使用 linuxFxVersion 站点设置请求特定的 Linux 容器在创建应用时部署到应用。 若要访问专用存储库中的映像,需要更多设置。 有关详细信息,请参阅应用程序配置。
重要说明
创建自己的容器时,需要将容器的基本映像更新到最新的受支持基础映像。 Azure Functions 所支持的基础映像是与语言相关的。 请参阅 Azure Functions 基础映像存储库。
Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 你应该定期从最新的基础映像更新容器,并重新部署更新后的容器版本。 有关详细信息,请参阅 维护自定义容器。
Flex Consumption 计划在 Blob 存储容器(称为 部署容器)的 zip 压缩包文件中维护项目代码。 可以配置用于部署的存储帐户和容器。 有关更多信息,请参阅部署。
必须使用一个部署将代码包发布到部署容器。 在 ARM 模板或 Bicep 部署期间,可以通过定义使用该扩展的/onedeploy来执行此步骤。 如果选择直接将包上传到容器,则不会自动部署包。
部署容器
在functionAppConfig.deployment.storage元素的properties中设置用于站点部署的特定存储帐户和容器、身份验证方法及凭据。 创建应用时,容器和任何应用程序设置必须存在。 有关如何创建存储容器的示例,请参阅部署容器。
此示例使用系统分配的托管标识访问在部署中的其他位置创建的指定 Blob 存储容器:
// Consolidated Role Assignments
module rbacAssignments 'rbac.bicep' = {
name: 'rbacAssignments'
scope: rg
params: {
storageAccountName: storage.outputs.name
appInsightsName: applicationInsights.outputs.name
managedIdentityPrincipalId: functionApp.outputs.?systemAssignedMIPrincipalId ?? ''
userIdentityPrincipalId: principalId
allowUserIdentityPrincipal: !empty(principalId)
}
}
// Outputs
output AZURE_LOCATION string = location
output AZURE_TENANT_ID string = tenant().tenantId
output AZURE_FUNCTION_NAME string = functionApp.outputs.name
output APPLICATIONINSIGHTS_CONNECTION_STRING string = applicationInsights.outputs.connectionString
使用托管标识时,还必须使函数应用能够使用标识访问存储帐户,如以下示例所示:
module storageRoleAssignment_User 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.2' = if (allowUserIdentityPrincipal && !empty(userIdentityPrincipalId)) {
name: 'storageRoleAssignment-User-${uniqueString(storageAccount.id, userIdentityPrincipalId)}'
params: {
resourceId: storageAccount.id
roleDefinitionId: roleDefinitions.storageBlobDataOwner
principalId: userIdentityPrincipalId
principalType: 'User'
description: 'Storage Blob Data Owner role for user identity (development/testing)'
roleName: 'Storage Blob Data Owner'
}
}
此示例使用 AVM 进行资源范围的角色分配。 有关上下文中的代码片段,请参阅 此部署示例。
此示例要求你知道要分配的角色的 GUID 值。 若要获取任何友好角色名称的此 ID 值,请使用 az role definition list 命令,如以下示例所示:
az role definition list --output tsv --query "[?roleName=='Storage Blob Data Owner'].{name:name}"
当您使用连接字符串而不是托管标识时,将 authentication.type 设置为 StorageAccountConnectionString,并将 authentication.storageAccountConnectionStringName 设置为包含部署存储帐户连接字符串的应用程序设置的名称。
部署包
Flex Consumption 计划使用一个部署来部署代码项目。 代码包本身与您在其他 Azure Functions 托管计划中用于 ZIP 压缩包部署的包相同。 但是,包文件的名称必须是 released-package.zip。
若要在模板中包含一个部署包,请将 /onedeploy 资源定义用于包含部署包的远程 URL。 Functions 主机必须能够访问此远程包源和部署容器。
此示例将一个部署源添加到现有应用:
@description('The name of the function app.')
param functionAppName string
@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location
@description('The zip content URL for released-package.zip.')
param packageUri string
resource functionAppName_OneDeploy 'Microsoft.Web/sites/extensions@2022-09-01' = {
name: '${functionAppName}/onedeploy'
location: location
properties: {
packageUri: packageUri
remoteBuild: false
}
}
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 部署源添加到现有应用:
@description('The name of the function app.')
param functionAppName string
@description('The location into which the resources should be deployed.')
param location string = resourceGroup().location
@description('The zip content url.')
param packageUri string
resource functionAppName_ZipDeploy 'Microsoft.Web/sites/extensions@2024-04-01' = {
name: '${functionAppName}/ZipDeploy'
location: location
properties: {
packageUri: 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设置。将
WEBSITE_RUN_FROM_PACKAGE设置为 URI 时,必须手动同步触发器。添加或更新设置时,始终在集合中
appSettings设置所有必需的应用程序设置。 更新将删除您未明确设置的现有设置。 有关详细信息,请参阅应用程序配置。Functions 不支持包部署的 Web 部署(
msdeploy)。 必须在你的部署管道和自动化过程中改用 zip 部署。 有关详细信息,请参阅 适用于 Azure Functions 的 Zip 部署。
远程生成
部署过程假定你使用的 .zip 文件或 zip 部署包含一个现成的应用。 此假设意味着默认情况下不会运行任何自定义项。
某些方案要求远程重新生成应用。 例如,你需要在 Python 或 windows 计算机上开发的 Node.js 应用中包括特定于 Linux 的包。 在这种情况下,可以将 Functions 配置为在 zip 部署后对代码执行远程生成。
请求远程生成的方式取决于要部署到的操作系统:
Linux 容器
如果要将容器化函数应用 部署到 Azure Functions Premium 或 Dedicated 计划,则必须:
- 使用容器映像的标识符设置
linuxFxVersion站点设置。 - 从专用注册表获取容器时设置任何所需的
DOCKER_REGISTRY_SERVER_*设置。 - 将
WEBSITES_ENABLE_APP_SERVICE_STORAGE应用程序设置设置为false。
如果缺少某些设置,则应用程序预配可能会失败,并出现以下 HTTP/500 错误:
Function app provisioning failed.
有关详细信息,请参阅应用程序配置。
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
appSettings: [
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'node'
}
{
name: 'WEBSITE_NODE_DEFAULT_VERSION'
value: '~20'
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'DOCKER_REGISTRY_SERVER_URL'
value: dockerRegistryUrl
}
{
name: 'DOCKER_REGISTRY_SERVER_USERNAME'
value: dockerRegistryUsername
}
{
name: 'DOCKER_REGISTRY_SERVER_PASSWORD'
value: dockerRegistryPassword
}
{
name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'
value: 'false'
}
]
linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
}
}
dependsOn: [
storageAccount
]
}
将 containerized 函数部署到 Azure Container Apps 时,模板必须:
- 将
kind字段设置为functionapp,linux,container,azurecontainerapps的值。 - 将
managedEnvironmentId站点属性设置为容器应用环境的完全限定 URI。 - 与站点同时创建
dependsOn资源时,在站点的Microsoft.App/managedEnvironments集合中添加资源链接。
从专用容器注册表部署到现有容器应用环境的容器化函数应用的定义可能如以下示例所示:
resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
name: functionAppName
kind: 'functionapp,linux,container,azurecontainerapps'
location: location
properties: {
serverFarmId: hostingPlanName
siteConfig: {
linuxFxVersion: 'DOCKER|myacr.azurecr.io/myimage:mytag'
appSettings: [
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: applicationInsightsName.properties.ConnectionString
}
]
}
managedEnvironmentId: managedEnvironmentId
}
dependsOn: [
storageAccount
hostingPlan
]
}
应用程序配置
在 Flex Consumption 计划中,您可以在 Azure 中配置函数应用,并使用两种类型的属性:
| 配置 |
Microsoft.Web/sites 属性 |
|---|---|
| 应用程序配置 | functionAppConfig |
| 应用程序设置 |
siteConfig.appSettings 集合 |
在functionAppConfig中维护这些应用程序配置。
| 行为 |
functionAppConfig 中的设置 |
|---|---|
| 始终就绪实例 | scaleAndConcurrency.alwaysReady |
| 部署源 | deployment |
| 实例大小 | scaleAndConcurrency.instanceMemoryMB |
| HTTP 触发器并发 | scaleAndConcurrency.triggers.http.perInstanceConcurrency |
| 语言运行时 | runtime.name |
| 语言版本 | runtime.version |
| 最大实例计数 | scaleAndConcurrency.maximumInstanceCount |
| 站点更新策略 | siteUpdateStrategy.type |
Flex 消耗计划还支持以下应用程序设置:
Functions 提供了以下选项,用于在 Azure 中配置函数应用:
| 配置 |
Microsoft.Web/sites 属性 |
|---|---|
| 站点设置 | siteConfig |
| 应用程序设置 |
siteConfig.appSettings 集合 |
siteConfig 属性需要以下站点设置:
仅当使用托管标识从 Azure 容器注册表实例获取映像时,才需要这些站点设置:
对于特定操作系统和托管选项,这些应用程序设置是必需的(或推荐的):
容器部署需要以下应用程序设置:
仅当从专用容器注册表进行部署时,才需要这些设置:
使用Bicep文件或 ARM 模板处理站点和应用程序设置时,请记住以下注意事项:
- 可选的
alwaysReady设置包含一个由一个或多个{name,instanceCount}对象组成的数组,每个按函数缩放组对应一个对象。 这些扩展组做出持续就绪的扩展决策。 此示例为http组和名为helloworld的单个函数(非分组触发器类型)设置了始终就绪的计数:
- 考虑何时在自动部署中设置
WEBSITE_CONTENTSHARE。 有关详细指南,请参阅WEBSITE_CONTENTSHARE参考。
- 对于容器部署,还需要将
WEBSITES_ENABLE_APP_SERVICE_STORAGE设置为false,因为容器本身中提供了应用内容。
始终将应用程序设置定义为
siteConfig/appSettings要创建的资源的Microsoft.Web/sites集合,如本文中的示例所示。 此定义可保证函数应用运行所需的设置在初始启动时可用。使用模板添加或更新应用程序设置时,请确保在更新中包含所有现有设置。 必须执行此操作,因为基础更新 REST API 调用会替换整个
/config/appsettings资源。 如果删除现有设置,函数应用将不会运行。 若要以编程方式更新单个应用程序设置,可以改用Azure CLI、Azure PowerShell或Azure门户进行更改。 有关详细信息,请参阅使用应用程序设置。如果可能,请使用基于托管标识的连接与其他 Azure 服务进行连接,包括
AzureWebJobsStorage连接。 有关详细信息,请参阅配置基于标识的连接。
槽部署
Functions 支持将不同版本的代码部署到函数应用中的唯一终结点。 使用此选项可以更轻松地开发、验证和部署函数更新,而不会影响生产环境中运行的函数。 部署槽位是Azure App Service的一项功能。 可用槽数取决于托管计划。 有关详细信息,请参阅 Azure Functions 部署插槽。
可以像函数应用程序资源(Microsoft.Web/sites)一样定义槽资源,但要使用 Microsoft.Web/sites/slots 资源标识符。 有关在 Premium 计划中创建生产槽和过渡槽的示例部署(在 Bicep 和 ARM 模板中),请参阅具有部署槽位的 Azure 函数应用。
若要了解如何使用模板交换槽,请参阅 Automate with Resource Manager templates。
使用槽部署时,请注意以下注意事项:
不要在部署槽位定义中显式设置
WEBSITE_CONTENTSHARE设置。 部署槽中的应用创建过程会为你生成此设置。交换槽时,某些应用程序设置被视为“有粘性的”,因为它们与槽保持一致,而不是与被交换的代码保持一致。 可以通过在模板中的特定应用程序设置定义中包含 来定义此类槽设置
"slotSetting":true。 有关详细信息,请参阅管理设置。
安全部署
可以在部署中创建函数应用,通过与虚拟网络集成来保护一个或多个资源。
Microsoft.Web/sites/networkConfig 资源定义了您的函数应用程序的虚拟网络集成。 此集成取决于引用的函数应用和虚拟网络资源。 函数应用还可能依赖于其他专用网络资源,例如专用终结点和路由。 有关详细信息,请参阅 Azure Functions 网络选项。
这些项目提供了基于 Bicep 的示例,展示了如何在虚拟网络中部署功能应用,包括网络访问限制:
- 高规模 HTTP 触发的函数连接到受虚拟网络保护的事件中心:HTTP 触发的函数(.NET隔离辅助角色模式)接受来自任何源的调用,然后使用虚拟网络集成将这些 HTTP 调用的正文发送到虚拟网络中运行的安全事件中心。
- Function 由在虚拟网络中保护的Service Bus队列触发:Python函数由在虚拟网络中保护的Service Bus队列触发。 使用专用终结点在虚拟网络中访问队列。 虚拟网络中的虚拟机用于发送消息。
创建使用安全存储帐户的部署时,必须显式设置 WEBSITE_CONTENTSHARE 该设置并创建此设置中指定的文件共享资源。 请确保使用值Microsoft.Storage/storageAccounts/fileServices/shares创建WEBSITE_CONTENTSHARE资源,如此示例中所示(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 地址或虚拟网络的访问权限。
函数访问密钥
将主机级 函数访问密钥 定义为 Azure 资源。 此方法允许你在 ARM 模板和 Bicep 文件中创建和管理主机密钥。 主机密钥定义为类型为 Microsoft.Web/sites/host/functionKeys 的资源。 以下示例创建一个主机级访问密钥,该密钥在创建函数应用时命名 my_custom_key :
resource functionKey 'Microsoft.Web/sites/host/functionKeys@2022-09-01' = {
name: '${parameters('name')}/default/my_custom_key'
properties: {
name: 'my_custom_key'
}
dependsOn: [
resourceId('Microsoft.Web/Sites', parameters('name'))
]
}
在此示例中,name 参数是新函数应用的名称。 必须包含一个 dependsOn 设置,以确保使用新的函数应用创建密钥。 最后, properties 主机密钥的对象还可以包含一个 value 可用于设置特定密钥的属性。
如果未设置 value 属性,则建议 Functions 在创建资源时自动生成一个新密钥。 若要详细了解访问密钥,包括使用访问密钥的安全最佳做法,请参阅
创建模板
具有 Bicep 或 ARM 模板的专家可以使用简单的文本编辑器手动编写部署代码。 对于我们其他人来说,有几个选项可以简化开发过程:
Visual Studio Code:扩展可用于帮助你处理 Bicep 文件和ARM 模板。 使用这些工具来帮助确保代码正确无误。 它们提供一些 基本验证。
Azure 门户:当您在门户中创建函数应用和相关资源时,最终的 Review + create 界面中有一个 下载模板用于自动化 的链接。
下载 Azure Portal 中 Azure Functions 创建过程中的模板链接。
此链接显示基于在门户中选择的选项生成的 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":""}}]}}
使用以下方法在部署之前验证模板:
以下 Azure 资源组部署 v2 任务(具有 deploymentMode: 'Validation')指示 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版本。
下面为使用 Markdown 的示例:
[](https://portal.azure.com/#create/Microsoft.Template/uri/<url-encoded-path-to-azuredeploy-json>)
下面为使用 HTML 的示例:
<a href="https://portal.azure.com/#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 。 若要登录到 Azure,请先运行 Connect-AzAccount。
# 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 'West Europe'
# Deploy the template
New-AzResourceGroupDeployment -ResourceGroupName "MyResourceGroup" -TemplateFile main.bicep -Verbose
若要测试此部署,请使用 类似于此的模板,在 Windows 上的消耗计划中创建一个函数应用。
后续步骤
详细了解如何开发和配置Azure Functions。