本文介绍如何在 Azure Functions 中创建托管在 Flex Consumption 计划 中的函数应用。 还演示了如何管理 Flex Consumption 计划托管应用的某些功能。
函数应用资源特定于语言。 确保在文章开始处选择喜欢的代码开发语言。
具有活动订阅的 Azure 帐户。 如果还没有帐户,可以免费创建一个帐户。
Azure CLI:用于在 Azure 中创建和管理资源。 在本地计算机上使用 Azure CLI 时,请确保使用版本 2.60.0 或更高版本。
Visual Studio Code:用于创建和开发应用、创建 Azure 资源并将代码项目部署到 Azure。 使用 Visual Studio Code 时,请确保还要安装最新的 Azure Functions 扩展。 还可以安装 Azure Tools 扩展包。
虽然无需创建 Flex Consumption 计划应用,但需要代码项目才可部署到并验证新的函数应用。 完成以下快速入门文章的第一部分,其中使用 HTTP 触发的函数创建代码项目:
若要在 Maven 部署期间在新的 Flex Consumption 计划中创建应用,必须创建本地应用项目,然后更新项目的 pom.xml 文件。 有关详细信息,请参阅使用 Maven 创建 Java Flex Consumption 应用
在创建并运行本地项目之后,但在被要求创建 Azure 资源之前,请回到本文。 在下一部分中创建函数应用和其他 Azure 资源。
本部分介绍如何使用 Azure CLI、Azure 门户或 Visual Studio Code 在 Flex Consumption 计划中创建函数应用。 有关使用 Bicep/ARM 模板在 Flex Consumption 计划中创建应用的示例,请参阅 Flex Consumption 存储库。
如果选择使用 Maven 创建和部署应用,则可以跳过此部分。
若要支持函数代码,需要创建三个资源:
- 一个资源组:相关资源的逻辑容器。
- 一个存储帐户:用于维护有关函数的状态和其他信息。
- Flex Consumption 计划中的一个函数应用,它提供用于执行函数代码的环境。 函数应用映射到本地函数项目,可让你将函数分组为逻辑单元,以便更轻松地管理、部署和共享 Flex Consumption 计划中的资源。
请登录到 Azure(如果尚未这样做):
az login
使用
az login
命令登录到 Azure 帐户。使用
az functionapp list-flexconsumption-locations
命令查看当前支持 Flex Consumption 的区域列表。az functionapp list-flexconsumption-locations --output table
在当前支持的区域之一中创建资源组:
az group create --name <RESOURCE_GROUP> --location <REGION>
在上述命令中,将
<RESOURCE_GROUP>
替换为订阅中唯一的值,并将<REGION>
替换为当前受支持的区域之一。 az group create 命令可创建资源组。在资源组和区域中创建常规用途存储帐户:
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 命令可创建存储帐户。重要
存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。
在 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 中的内容。
在活动栏中选择 Azure 图标,然后在“工作区”区域中选择你的项目文件夹,并选择“部署...”按钮。
选择“部署到函数应用...”,然后选择刚刚创建的函数应用,选择“部署”。
在部署完成后,选择“查看输出”以查看创建和部署结果,其中包括你创建的 Azure 资源。 如果错过了通知,请选择右下角的响铃图标以再次查看。
可以通过修改 pom.xml 文件,使用 Maven 在部署期间创建 Flex Consumption 托管函数应用和所需的资源。
通过完成以下快速入门文章的第一部分来创建 Java 代码项目:
在 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>
(可选)通过在
<plugin>.<configuration>
部分中包括以下元素,在 Maven 部署中自定义 Flex Consumption 计划。在部署之前,请使用 Azure CLI 登录到 Azure 订阅。
az login
使用
az login
命令登录到 Azure 帐户。使用以下命令将代码项目部署到 Flex Consumption 中的新函数应用。
mvn azure-functions:deploy
Maven 使用 pom.xml 模板中的设置在 Azure 中的 Flex Consumption 计划中创建函数应用,以及其他所需的资源。 如果这些资源已存在,代码将部署到函数应用,覆盖任何现有代码。
可以在 Flex Consumption 计划中为应用启用虚拟网络集成。 本部分中的示例假定已在帐户中创建一个带有子网的虚拟网络。 可以在创建应用时或以后启用虚拟网络集成。
重要
Flex Consumption 计划目前不支持名称包含下划线 (_
) 字符的子网。
若要在创建应用时启用虚拟网络,请执行以下操作:
可以通过运行 az functionapp create
命令并包括 --vnet
和 --subnet
参数来启用虚拟网络集成。
创建虚拟网络和子网(如果尚未创建)。
完成创建 Flex Consumption 应用中的的步骤 1-4,创建应用所需的资源。
运行
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 |
用于连接到部署存储帐户的身份验证类型。 接受的值包括 StorageAccountConnectionString 、UserAssignedIdentity 和 SystemAssignedIdentity 。 |
--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(事件网格)触发的函数一起扩展到自己的实例。
将 http
、durable
或 blob
用作名称值对设置的名称来配置这些组的始终就绪计数。 对于应用中的所有其他函数,需要使用 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
除非设置了特定限制,否则 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 计划的区域列表,请执行以下操作:
请登录到 Azure(如果尚未这样做):
az login
使用
az login
命令登录到 Azure 帐户。使用
az functionapp list-flexconsumption-locations
命令查看当前支持 Flex Consumption 的区域列表。az functionapp list-flexconsumption-locations --output table
在 Azure 门户中或使用 Visual Studio Code 创建应用时,当前不支持的区域将筛选出区域列表。