在 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

    
    

部署代码项目

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

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

重要

部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。

  1. 在活动栏中选择 Azure 图标,然后在“工作区”区域中选择你的项目文件夹,并选择“部署...”按钮。

    从 Visual Studio Code 工作区部署项目

  2. 选择“部署到函数应用...”,然后选择刚刚创建的函数应用,选择“部署”。

  3. 在部署完成后,选择“查看输出”以查看创建和部署结果,其中包括你创建的 Azure 资源。 如果错过了通知,请选择右下角的响铃图标以再次查看。

    “查看输出”窗口的屏幕截图。

使用 Maven 创建并部署应用

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

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

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

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

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

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

    • <instanceSize> - 设置函数应用的实例内存大小。 默认值为 2048
    • <maximumInstances> - 设置函数应用的最大实例计数的最大值。
    • <alwaysReadyInstances> - 使用 HTTP 触发器组 (<http>)、Durable Functions 组 (<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/<RESOURCER_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 容器指定为代码的部署源。 还可以更改用于访问容器的身份验证方法。

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

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

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

  • 使用连接字符串连接到部署存储帐户时,包含连接字符串的应用程序设置必须已存在。
  • 使用用户分配的托管标识时,提供的标识会链接到函数应用。 范围限定为部署存储帐户的 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_ACCCOUNT_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_ACCCOUNT_NAME> --deployment-storage-container-name <DEPLOYMENT_CONTAINER_NAME>

配置实例内存

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

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

az functionapp create 命令中指定 --instance-memory 参数。 此示例创建实例大小为 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 命令将实例内存大小设置更改为 4,096 MB:

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

设置始终就绪的实例计数

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

  • 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,并将名为 function5 的服务总线触发函数的始终就绪实例计数设置为 2

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 创建应用时,当前不支持的区域将筛选出区域列表。