在 Flex Consumption 计划中创建和管理函数应用

选择编程语言

本文介绍如何在 Azure Functions 中创建托管在 Flex Consumption 计划 中的函数应用。 还演示了如何管理 Flex Consumption 计划托管应用的某些功能。

函数应用资源特定于语言。 确保在文章开始处选择喜欢的代码开发语言。

先决条件

创建 Flex Consumption 应用

本部分介绍如何使用 Azure CLI、Azure 门户或 Visual Studio Code 在 Flex Consumption 计划中创建函数应用。 有关使用 Bicep/ARM 模板在 Flex Consumption 计划中创建应用的示例,请参阅 Flex Consumption 存储库

如果选择使用 Maven 创建和部署应用,则可以跳过此部分。

若要支持函数代码,需要创建三个资源:

  • 一个资源组:相关资源的逻辑容器。
  • 一个存储帐户:用于维护有关函数的状态和其他信息。
  • Flex Consumption 计划中的一个函数应用,它提供用于执行函数代码的环境。 函数应用映射到本地函数项目,可让你将函数分组为逻辑单元,以便更轻松地管理、部署和共享 Flex Consumption 计划中的资源。
  1. 请登录到 Azure(如果尚未这样做):

    az login
    

    使用 az login 命令登录到 Azure 帐户。

  2. 使用 az functionapp list-flexconsumption-locations 命令查看当前支持 Flex Consumption 的区域列表。

    az functionapp list-flexconsumption-locations --output table
    
  1. 当前支持的区域之一中创建资源组:

    az group create --name <RESOURCE_GROUP> --location <REGION>
    

    在上一个命令中,将<RESOURCE_GROUP>替换为您的订阅中唯一的值,并将<REGION>替换为当前支持的区域之一。 az group create 命令可创建资源组。

  2. 在资源组和区域中创建常规用途存储帐户:

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group <RESOURCE_GROUP> --sku Standard_LRS --allow-blob-public-access false
    

    在上一个示例中,将 <STORAGE_NAME> 替换为适合你且在 Azure 存储中唯一的名称。 名称只能包含 3 到 24 个数字和小写字母字符。 Standard_LRS 指定 Functions 支持的常规用途帐户。 az storage account create 命令可创建存储帐户。

    重要

    存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。

  3. 在 Azure 中创建函数应用:

    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime dotnet-isolated --runtime-version 8.0 
    

    在 Flex Consumption 计划中运行时,当前不支持进程内运行的 C# 应用

    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime java --runtime-version 17 
    

    对于 Java 应用,当前还支持 Java 11。

    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime node --runtime-version 20 
    
    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime python --runtime-version 3.11 
    

    对于 Python 应用,当前还支持 Python 3.10。

    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime powershell --runtime-version 7.4 
    

    在此示例中,请将 <RESOURCE_GROUP><STORAGE_NAME> 分别替换为上一步中使用的资源组和帐户名称。 此外,将 <APP_NAME> 替换为适合自己的全局唯一名称。 <APP_NAME> 也是函数应用的默认域名服务器 (DNS) 域。 az functionapp create 命令在 Azure 中创建函数应用。

    此命令创建一个在 Flex Consumption 计划中运行的函数应用。

    由于在未指定始终就绪实例时创建了应用,因此应用仅在主动执行函数时产生费用。 该命令还会在同一资源组中创建关联的 Azure Application Insights 实例,可以使用它来监视函数应用和查看日志。 有关详细信息,请参阅监视 Azure Functions

部署代码项目

对于部署,Flex Consumption 计划应用使用 Blob 存储容器托管 .zip 包文件,其中包含项目代码以及运行应用所需的所有库。 有关更多信息,请参阅部署

如果选择使用 Maven 创建和部署应用,则可以跳过此部分。

可以选择使用各种工具将项目代码部署到现有函数应用:

可以使用 Azure CLI 将部署包文件上传到 Azure 中函数应用的部署共享。 为此,必须生成一个 .zip 包文件,该文件在将包载入到应用时可以运行。

此包文件必须包含项目运行所需的所有生成输出文件和引用的库。

对于具有大量库的项目,应打包项目文件的根目录并请求 远程生成

对于 Python 项目,应打包项目文件的根目录,并始终请求 远程生成。 使用远程生成可防止在 Windows 上生成要在 Linux 上部署的项目时可能出现的潜在问题。

  1. 使用首选的开发工具生成代码项目。

  2. 创建包含生成目录输出的 .zip 文件。 有关详细信息,请参阅 项目结构

  3. 如果需要,请登录到 Azure 帐户,并使用 az login 命令选择活动订阅。

    az login
    
  4. az functionapp deployment source config-zip运行命令以部署位于相对<FILE_PATH>位置的应用程序包。

    az functionapp deployment source config-zip --src <FILE_PATH> --name <APP_NAME> --resource-group <RESOURCE_GROUP>
    
  1. 使用首选的开发工具生成代码项目。

  2. 创建包含生成目录输出的 .zip 文件。 有关详细信息,请参阅 文件夹结构

  3. 如果需要,请登录到 Azure 帐户,并使用 az login 命令选择活动订阅。

    az login
    
  4. az functionapp deployment source config-zip运行命令以部署位于相对<FILE_PATH>位置的应用程序包。

    az functionapp deployment source config-zip --src <FILE_PATH> --name <APP_NAME> --resource-group <RESOURCE_GROUP>
    
  1. 创建包含代码项目的根目录的 .zip 文件。 有关详细信息,请参阅 文件夹结构

  2. 如果需要,请登录到 Azure 帐户,并使用 az login 命令选择活动订阅。

    az login
    
  3. az functionapp deployment source config-zip运行命令以部署位于相对<FILE_PATH>位置的应用程序包。

    az functionapp deployment source config-zip --src <FILE_PATH> --name <APP_NAME> --resource-group <RESOURCE_GROUP>
    
  1. 创建包含代码项目的根目录的 .zip 文件。 有关详细信息,请参阅 文件夹结构

  2. 如果需要,请登录到 Azure 帐户,并使用 az login 命令选择活动订阅。

    az login
    
  3. az functionapp deployment source config-zip运行命令以部署位于相对<FILE_PATH>位置的应用程序包。

    az functionapp deployment source config-zip --src <FILE_PATH> --name <APP_NAME> --resource-group <RESOURCE_GROUP> --build-remote true
    

    请确保设置--build-remote true以执行远程构建

  1. 创建包含代码项目的根目录的 .zip 文件。 有关详细信息,请参阅 文件夹结构

  2. 如果需要,请登录到 Azure 帐户,并使用 az login 命令选择活动订阅。

    az login
    
  3. az functionapp deployment source config-zip运行命令以部署位于相对<FILE_PATH>位置的应用程序包。

    az functionapp deployment source config-zip --src <FILE_PATH> --name <APP_NAME> --resource-group <RESOURCE_GROUP> --build-remote true
    

    请确保设置--build-remote true以执行远程构建

使用 Maven 创建并部署应用

可以通过修改 pom.xml 文件,使用 Maven 在部署期间创建 Flex Consumption 托管函数应用和所需的资源。

  1. 通过完成以下快速入门文章的第一部分来创建 Java 代码项目:

  2. 在 Java 代码项目中,打开 pom.xml 文件,并在 Flex Consumption 计划中创建函数应用:

    • <properties>.<azure.functions.maven.plugin.version> 的值更改为 1.34.0

    • <plugin>.<configuration>azure-functions-maven-plugin 部分中,添加或取消注释 <pricingTier> 元素,如下所示:

      <pricingTier>Flex Consumption</pricingTier>
      
  3. (可选)通过在 <plugin>.<configuration> 部分中包括以下元素,在 Maven 部署中自定义 Flex Consumption 计划。

    • <instanceSize> - 设置函数应用的实例内存大小。 默认值为 2048
    • <maximumInstances> - 设置函数应用的最大实例计数的最大值。
    • <alwaysReadyInstances> - 使用 HTTP 触发器组 ()、Durable Functions 组 (<http>) 和其他特定触发器 (<durable>) 的子元素设置<my_function>。 设置任何大于零的实例计数时,无论函数是否执行,都会对这些实例收费。 有关详细信息,请参阅计费
  4. 在部署之前,请使用 Azure CLI 登录到 Azure 订阅。

    az login
    

    使用 az login 命令登录到 Azure 帐户。

  5. 使用以下命令将代码项目部署到 Flex Consumption 中的新函数应用。

    mvn azure-functions:deploy
    

    Maven 使用 pom.xml 模板中的设置在 Azure 中的 Flex Consumption 计划中创建函数应用,以及其他所需的资源。 如果这些资源已存在,代码将部署到函数应用,覆盖任何现有代码。

启用虚拟网络集成

可以在 Flex Consumption 计划中为应用启用虚拟网络集成。 本部分中的示例假定你已 创建帐户中具有子网的虚拟网络 。 可以在创建应用时或以后启用虚拟网络集成。

重要

Flex Consumption 计划目前不支持名称包含下划线 (_) 字符的子网。

若要在创建应用时启用虚拟网络,请执行以下操作:

可以通过运行 az functionapp create 命令并包括 --vnet--subnet 参数来启用虚拟网络集成。

  1. 创建虚拟网络和子网(如果尚未创建)。

  2. 完成创建 Flex Consumption 应用中的的步骤 1-4,创建应用所需的资源。

  3. 运行 az functionapp create 命令,包括 --vnet--subnet 参数,如以下示例所示:

    az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime <RUNTIME_NAME> --runtime-version <RUNTIME_VERSION> --vnet <VNET_RESOURCE_ID> --subnet <SUBNET_NAME>
    

    <VNET_RESOURCE_ID> 值为虚拟网络的资源 ID,格式为:/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Network/virtualNetworks/<VNET_NAME>。 可以使用此命令获取虚拟网络 ID 列表,按 <RESOURCE_GROUP>: az network vnet list --resource-group <RESOURCE_GROUP> --output tsv --query "[]".id 进行筛选。

有关如何使用虚拟网络集成在 Flex Consumption 中创建应用的端到端示例,请参阅以下资源:

若要在现有应用中修改或删除虚拟网络集成,请执行以下操作:

使用 az functionapp vnet-integration add 命令启用与现有函数应用的虚拟网络集成:

az functionapp vnet-integration add --resource-group <RESOURCE_GROUP> --name <APP_NAME> --vnet <VNET_RESOURCE_ID> --subnet <SUBNET_NAME>

使用 az functionapp vnet-integration remove 命令在应用中禁用虚拟网络集成:

az functionapp vnet-integration remove --resource-group <RESOURCE_GROUP> --name <APP_NAME>

使用 az functionapp vnet-integration list 命令列出应用的当前虚拟网络集成:

az functionapp vnet-integration list --resource-group <RESOURCE_GROUP> --name <APP_NAME>

选择子网时,以下注意事项适用:

  • 选择的子网不能用于其他目的,例如专用终结点或服务终结点,或者委托给任何其他托管计划或服务。
  • 可以在 Flex Consumption 计划中运行的多个应用共享同一子网。 由于网络资源在所有应用中共享,因此一个函数应用可能会影响同一子网上其他人的性能。
  • 在 Flex Consumption 计划中,单个函数应用可能最多使用 40 个 IP 地址,即使应用扩展到超过 40 个实例也是如此。 虽然此经验法则有助于估算所需的子网大小,但并未严格执行。

配置部署设置

在 Flex 消耗计划中,包含应用代码的部署包保留在 Azure Blob 存储容器中。 默认情况下,部署使用 Functions 运行时用来维护应用的相同存储帐户 (AzureWebJobsStorage) 和连接字符串值。 连接字符串存储在 DEPLOYMENT_STORAGE_CONNECTION_STRING 应用程序设置中。 但可以改为将单独的存储帐户中的 Blob 容器指定为代码的部署源。 还可以更改用于访问容器的身份验证方法。

自定义部署源应满足以下条件:

  • 存储帐户必须已存在。
  • 用于部署的容器也必须存在。
  • 当多个应用使用相同的存储帐户时,每个应用都应有自己的部署容器。 对每个应用使用唯一容器可防止覆盖部署包,如果应用共享同一容器,则会发生此情况。

配置部署存储身份验证时,请记住以下注意事项:

  • 最佳做法是,从应用连接到 Azure 存储时,应使用托管标识。 有关详细信息,请参阅连接
  • 使用连接字符串连接到部署存储帐户时,包含连接字符串的应用程序设置必须已存在。
  • 使用用户分配的托管标识时,提供的标识会链接到函数应用。 范围限定为部署存储帐户的 Storage Blob Data Contributor 角色也会分配给该标识。
  • 使用系统分配的托管标识时,会在应用中不存在有效的系统分配标识时创建一个标识。 当存在系统分配的标识时,范围限定为部署存储帐户的 Storage Blob Data Contributor 角色也会分配给该标识。

在 Flex 消耗计划中创建函数应用时配置部署设置:

使用 az functionapp create 命令并提供以下额外选项以自定义部署存储空间:

参数 描述
--deployment-storage-name 部署存储帐户的名称。
--deployment-storage-container-name 帐户中要包含应用的部署包的容器的名称。
--deployment-storage-auth-type 用于连接到部署存储帐户的身份验证类型。 接受的值包括 StorageAccountConnectionStringUserAssignedIdentitySystemAssignedIdentity
--deployment-storage-auth-value 使用 StorageAccountConnectionString 时,此参数设置为包含部署存储帐户连接字符串的应用程序设置名称。 设置 UserAssignedIdentity 时,此参数设置为要使用的标识的资源 ID 的名称。

此示例使用单独的部署存储帐户和用户分配的标识在 Flex 消耗计划中创建函数应用:

az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage <STORAGE_NAME> --runtime dotnet-isolated --runtime-version 8.0 --flexconsumption-location "<REGION>" --deployment-storage-name <DEPLOYMENT_ACCOUNT_NAME> --deployment-storage-container-name <DEPLOYMENT_CONTAINER_NAME> --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value <MI_RESOURCE_ID>

还可以修改现有应用的部署存储配置。

使用 az functionapp deployment config set 命令修改部署存储配置:

az functionapp deployment config set --resource-group <RESOURCE_GROUP> --name <APP_NAME> --deployment-storage-name <DEPLOYMENT_ACCOUNT_NAME> --deployment-storage-container-name <DEPLOYMENT_CONTAINER_NAME>

配置实例内存

创建应用时,可以显式设置 Flex Consumption 计划使用的实例内存大小。 有关支持的大小的详细信息,请参阅实例内存

若要设置与创建应用时默认不同的实例内存大小,请执行以下操作:

--instance-memory 命令中指定 az functionapp create 参数。 此示例创建实例大小为 4096 的 C# 应用:

az functionapp create --instance-memory 4096 --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage-account <STORAGE_NAME> --flexconsumption-location <REGION> --runtime dotnet-isolated --runtime-version 8.0

可随时更改应用使用的实例内存大小设置。

此示例使用 az functionapp scale config set 命令将实例内存大小设置更改为 512 MB:

az functionapp scale config set --resource-group <resourceGroup> --name <APP_NAME> --instance-memory 512

设置始终就绪的实例计数

可以为每个函数缩放组或各个单独函数设置特定数量的始终就绪实例,使函数保持加载状态并随时可以执行。 有三个特殊组,就像每个函数缩放一样:

  • http - 应用中所有 HTTP 触发的函数一起扩展到自己的实例。
  • durable - 应用中所有持久触发的函数(业务流程、活动、实体)一起扩展到自己的实例。
  • blob - 应用中所有 blob(事件网格)触发的函数一起扩展到自己的实例。

httpdurableblob 用作名称值对设置的名称来配置这些组的始终就绪计数。 对于应用中的所有其他函数,需要使用 function:<FUNCTION_NAME>=n 格式为每个单独的函数配置始终就绪计数。

若要定义一个或多个始终就绪的实例名称,请使用 --always-ready-instances 参数和 az functionapp create 命令。 此示例将所有 HTTP 触发的函数的始终就绪实例计数设置为 5

az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage <STORAGE_NAME> --runtime <LANGUAGE_RUNTIME> --runtime-version <RUNTIME_VERSION> --flexconsumption-location <REGION> --always-ready-instances http=10

本示例将所有 Durable 触发器函数的始终就绪实例计数设置为 3,并将名为 2 的服务总线触发函数的始终就绪实例计数设置为 function5

az functionapp create --resource-group <RESOURCE_GROUP> --name <APP_NAME> --storage <STORAGE_NAME> --runtime <LANGUAGE_RUNTIME> --runtime-version <RUNTIME_VERSION> --flexconsumption-location <REGION> --always-ready-instances durable=3 function:function5=2

还可以通过添加或删除实例指定或更改现有实例指定计数来修改现有应用上的始终就绪实例。

此示例使用 az functionapp scale config always-ready set 命令将 HTTP 触发器组的始终就绪实例计数更改为 10

az functionapp scale config always-ready set --resource-group <RESOURCE_GROUP> --name <APP_NAME> --settings http=10

若要移除始终就绪的实例,请使用 az functionapp scale config always-ready delete 命令,就像这个示例中一样,它会从 HTTP 触发器组和名为 hello_world 的函数中移除所有始终就绪的实例。:

az functionapp scale config always-ready delete --resource-group <RESOURCE_GROUP> --name <APP_NAME> --setting-names http function:hello_world

设置 HTTP 并发限制

除非设置了特定限制,否则 Flex Consumption 计划应用的 HTTP 并发默认值会根据实例大小设置确定。 有关详细信息,请参阅 HTTP 触发器并发

下面介绍如何为现有应用设置 HTTP 并发限制:

使用 az functionapp scale config set 命令为应用设置特定的 HTTP 并发限制,而不考虑实例大小。

az functionapp scale config set --resource-group <RESOURCE_GROUP> --name <APP_NAME> --trigger-type http --trigger-settings perInstanceConcurrency=10

此示例将 HTTP 触发器并发级别设置为 10。 在专门设置 HTTP 并发值后,即使应用实例大小设置发生任何更改,该值仍会保持。

查看当前支持的区域

若要查看当前支持 Flex Consumption 计划的区域列表,请执行以下操作:

  1. 请登录到 Azure(如果尚未这样做):

    az login
    

    使用 az login 命令登录到 Azure 帐户。

  2. 使用 az functionapp list-flexconsumption-locations 命令查看当前支持 Flex Consumption 的区域列表。

    az functionapp list-flexconsumption-locations --output table
    

Azure 门户中或使用 Visual Studio Code 创建应用时,当前不支持的区域将筛选出区域列表。

在 Azure 中监视应用

Azure Monitor 提供了这些不同的指标集,可帮助你更好地了解函数应用在 Azure 中的运行方式:

  • 平台指标:提供基础结构级见解
  • Application Insights:提供代码级见解,包括跟踪和错误日志。

如果尚未这样做,则应 在应用中启用 Application Insights 才能:

  • 跟踪详细的执行时间和依赖项
  • 监视单个函数性能
  • 分析失败和异常
  • 将平台指标与应用程序行为与自定义查询相关联

有关详细信息,请参阅监视 Azure Functions

支持的指标

运行此脚本以查看当前可用的应用的所有平台指标:

appId=$(az functionapp show --name <APP_NAME> --resource-group <RESOURCE_GROUP> --query id -o tsv)
az monitor metrics list-definitions --resource $appId --query "[].{Name:name.localizedValue,Value:name.value}" -o table

在此示例中,将 <RESOURCE_GROUP> 替换为资源组名称,将 <APP_NAME> 替换为函数应用名称。 此脚本获取完全限定的应用 ID,并返回表中的可用平台指标。

查看指标

可以在 Azure 门户中或使用 Azure CLI 查看当前指标。

在 Azure 门户中,还可以创建指标警报,并将图表和其他报表固定到门户中的仪表板。

使用此脚本为应用生成当前指标的报告:

appId=$(az functionapp show --name <APP_NAME> --resource-group <RESOURCE_GROUP> --query id -o tsv)

appId=$(az functionapp show --name func-fuxigh6c255de --resource-group exampleRG --query id -o tsv)

echo -e "\nAlways-ready and on-emand execution counts..."
az monitor metrics list --resource $appId --metric "AlwaysReadyFunctionExecutionCount" --interval PT1H --output table
az monitor metrics list --resource $appId --metric "OnDemandFunctionExecutionCount" --interval PT1H --output table

echo -e "\nExecution units (MB-ms) in always-ready and on-emand execution counts..."
az monitor metrics list --resource $appId --metric "AlwaysReadyFunctionExecutionUnits" --interval PT1H --output table
az monitor metrics list --resource $appId --metric "OnDemandFunctionExecutionUnits" --interval PT1H --output table

echo -e "\nAlways-ready resource utilization..."
az monitor metrics list --resource $appId --metric "AlwaysReadyUnits" --interval PT1H --output table

echo -e "\nMemory utilization..."
az monitor metrics list --resource $appId --metric "AverageMemoryWorkingSet" --interval PT1H --output table
az monitor metrics list --resource $appId --metric "MemoryWorkingSet" --interval PT1H --output table

echo -e "\nInstance count and CPU utilization..."
az monitor metrics list --resource $appId --metric "InstanceCount" --interval PT1H --output table
az monitor metrics list --resource $appId --metric "CpuPercentage" --interval PT1H --output table

若要详细了解 Azure Functions 的指标,请参阅 “监视 Azure Functions”。

查看日志

当应用连接到 Application Insights 时,可以更好地分析应用性能并在执行过程中排查问题。

  • 使用“性能”分析响应时间和依赖项

  • 使用“失败”识别迁移后发生的任何错误

  • 在“日志”中创建自定义查询以分析函数行为:

    // Compare success rates by instance
    requests
    | where timestamp > ago(7d)
    | summarize successCount=countif(success == true), failureCount=countif(success == false) by bin(timestamp, 1h), cloud_RoleName
    | render timechart
    

查看成本

由于你可以优化应用以调整性能与运营成本,因此在 Flex Consumption 计划中跟踪与运行应用相关的成本非常重要。

查看当前成本:

  1. Azure 门户的函数应用页中,选择资源组链接。

  2. 在资源组页中,选择 “成本管理>成本分析”。

  3. 查看应用本身的当前成本和成本轨迹。

  4. (可选)选择 “成本管理>警报 ”,然后选择 “+ 添加 ”,为应用创建新警报。

微调应用程序

Flex Consumption 计划提供了多个设置,你可以进行优化以优化应用的性能。 实际性能和成本可能因特定于应用的工作负荷模式和配置而异。 例如,较高的 内存实例大小 可以提高内存密集型作的性能,但每个活动周期的成本更高。

以下是可以调整性能与成本的一些调整: