管理函数应用
在 Azure Functions 中,Function App 提供各个函数的执行上下文。 Function App 行为适用于由给定 Function App 托管的所有函数。 函数应用中的所有函数必须使用同一语言。
函数应用中的各个函数一起部署并一起缩放。 同一函数应用中的所有函数在函数应用缩放时共享每个实例的资源。
将为每个函数应用单独定义连接字符串、环境变量以及其他应用程序设置。 必须在函数应用之间共享的任何数据都应该以外部方式存储在持久存储中。
在 Azure 门户中开始
注意
不要将本地开发和门户开发混合在同一函数应用中。 从本地项目创建和发布函数时,无法维护或修改门户中的项目代码。
要查看函数应用中的应用设置,请执行以下步骤:
使用 Azure 帐户登录到 Azure 门户。 搜索函数应用并选择它。
在函数应用的左窗格中,展开“设置”,选择“环境变量”,然后选择“应用设置”选项卡。
使用应用程序设置
除 Azure Functions 使用的预定义应用设置之外,还可根据函数代码的要求创建任意数量的应用设置。 有关详细信息,请参阅 Azure Functions 的应用设置参考。
这些设置是加密存储的。 有关详细信息,请参阅应用设置安全性。
可从 Azure 门户管理应用设置,并使用 Azure CLI 和 Azure PowerShell。 还可通过 Visual Studio Code 和 Visual Studio 管理应用设置。
要查找应用设置,请参阅在 Azure 门户中开始操作。
“应用设置”选项卡维护函数应用使用的设置:
要查看应用设置的值,请选择“显示值”。
要添加设置,请选择“+ 添加”,然后输入新键值对的名称和值。
az functionapp config appsettings list
命令返回现有的应用程序设置,例如:
az functionapp config appsettings list --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME>
az functionapp config appsettings set
命令添加或更新某个应用程序设置。 以下示例创建的设置包含的键其名称为 CUSTOM_FUNCTION_APP_SETTING
,其值为 12345
:
az functionapp config appsettings set --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--settings CUSTOM_FUNCTION_APP_SETTING=12345
Get-AzFunctionAppSetting
cmdlet 返回现有的应用程序设置,例如:
Get-AzFunctionAppSetting -Name <FUNCTION_APP_NAME> -ResourceGroupName <RESOURCE_GROUP_NAME>
Update-AzFunctionAppSetting
命令添加或更新某个应用程序设置。 以下示例创建的设置包含的键其名称为 CUSTOM_FUNCTION_APP_SETTING
,其值为 12345
:
Update-AzFunctionAppSetting -Name <FUNCTION_APP_NAME> -ResourceGroupName <RESOURCE_GROUP_NAME> -AppSetting @{"CUSTOM_FUNCTION_APP_SETTING" = "12345"}
使用应用程序设置
还可以在代码中将函数应用设置值读取为环境变量。 有关详细信息,请参阅以下特定于语言的参考主题的“环境变量”部分:
在本地开发函数应用时,必须将这些值的本地副本保留在 local.settings.json 项目文件中。 有关详细信息,请参阅本地设置文件。
FTPS 部署设置
Azure Functions 支持使用 FTPS 将项目代码部署到函数应用。 由于此部署方法需要同步触发器,因此不推荐。 要安全地传输项目文件,请始终使用 FTPS 而不是 FTP。
可以使用以下方法之一来获取 FTPS 部署所需的凭据:
可以通过下载函数应用的发布配置文件来在 Azure 门户中获取 FTPS 发布凭据。
重要
发布配置文件包含重要的安全凭据。 始终保护本地计算机上下载的文件。
若要下载函数应用的发布配置文件:
选择函数应用的“概述”页,然后选择“获取发布配置文件”。
保存并复制该文件的内容。
- 在文件中,找到具有属性
publishMethod="FTP"
的 publishProfile
元素。 在此元素中,publishUrl
、userName
、userPWD
属性包含用于 FTPS 发布的目标 URL 和凭据。
运行此 Azure CLI 命令,它会从发布配置文件返回 FTPS 凭据。
az functionapp deployment list-publishing-profiles --name <APP_NAME> --resource-group <GROUP_NAME> --query "[?publishMethod=='FTP'].{URL:publishUrl, username:userName, password:userPWD}" -o table
在此示例中,将 <APP_NAME>
替换为你的函数应用名称,将 <GROUP_NAME>
替换为资源组。 返回的 URL
、username
、password
列包含用于 FTPS 发布的目标 URL 和凭据。
运行此 Azure PowerShell 命令,它会从发布配置文件返回 FTPS 凭据。
$profile = [xml](Get-AzWebAppPublishingProfile -ResourceGroupName "<GROUP_NAME>" -Name "<APP_NAME>" -Format "Ftp")
$profile.publishData.publishProfile | Where-Object -Property publishMethod -eq Ftp | Select-Object -Property @{Name="URL"; Expression = {$_.publishUrl}},
@{Name="username"; Expression = {$_.userName}}, @{Name="password"; Expression = {$_.userPWD}} | Format-Table
在此示例中,将 <APP_NAME>
替换为你的函数应用名称,将 <GROUP_NAME>
替换为资源组。 返回的 URL
、username
、password
列包含用于 FTPS 发布的目标 URL 和凭据。
托管计划类型
创建函数应用时,你还需要创建托管计划,应用将在其中运行。 一个计划可以有一个或多个函数应用。 函数的功能、缩放和定价取决于计划的类型。 有关详细信息,请参阅 Azure Functions 托管选项。
可以从 Azure 门户中或通过使用 Azure CLI 或 Azure PowerShell API 确定函数应用所使用的计划类型。
以下值指示计划类型:
计划类型 |
Azure 门户 |
Azure CLI/PowerShell |
消耗 |
消耗 |
Dynamic |
高级 |
ElasticPremium |
ElasticPremium |
专用(应用服务) |
各种 |
各种 |
要确定你的函数应用所使用的计划的类型,请在 Azure 门户中查看该函数应用的“概述”页中的“应用服务计划”。
若要查看定价层,请选择“应用服务计划”的名称,然后从左侧窗格中选择“设置”>“属性”。
运行以下 Azure CLI 命令以获取托管计划类型:
functionApp=<FUNCTION_APP_NAME>
resourceGroup=FunctionMonitoringExamples
appServicePlanId=$(az functionapp show --name $functionApp --resource-group $resourceGroup --query appServicePlanId --output tsv)
az appservice plan list --query "[?id=='$appServicePlanId'].sku.tier" --output tsv
在前面的示例中,将 <RESOURCE_GROUP>
和 <FUNCTION_APP_NAME>
分别替换为资源组和函数应用名称。
运行以下 Azure PowerShell 命令以获取托管计划类型:
$FunctionApp = '<FUNCTION_APP_NAME>'
$ResourceGroup = '<RESOURCE_GROUP>'
$PlanID = (Get-AzFunctionApp -ResourceGroupName $ResourceGroup -Name $FunctionApp).AppServicePlan
(Get-AzFunctionAppPlan -Name $PlanID -ResourceGroupName $ResourceGroup).SkuTier
在前面的示例中,将 <RESOURCE_GROUP>
和 <FUNCTION_APP_NAME>
分别替换为资源组和函数应用名称。
计划迁移
你可以在 Windows 上的消耗计划和高级计划之间迁移函数应用。 在计划之间迁移时,请记住以下注意事项:
- 不支持直接迁移到专用(应用服务)计划。
- Linux 不支持迁移。
- 源计划和目标计划必须位于同一资源组和地理区域中。 有关详细信息,请参阅将应用移到另一个应用服务计划。
- 具体的 CLI 命令取决于迁移方向。
- 在计划之间迁移函数应用时,函数执行会出现故障。
- 状态和其他特定于应用的内容将得到维护,因为应用在迁移之前和之后都使用相同的 Azure 文件存储共享。
可以使用这些工具迁移计划:
可以使用 Azure CLI 命令手动创建新计划,切换应用以使用新计划,并删除原始计划。
可以使用 Azure PowerShell 命令手动创建新计划,切换应用以使用新计划,并删除原始计划。
在 Windows 上为应用选择迁移方向。
在 Azure 门户中,导航到“消耗”计划应用,然后选择“应用服务计划”下的“更改应用服务计划”。
在“计划类型”下选择“高级”,创建新的高级计划,然后选择“确定”。
有关详细信息,请参阅将应用移到另一个应用服务计划。
在 Azure 门户中,导航到“高级”计划应用,然后选择“应用服务计划”下的“更改应用服务计划”。
在“计划类型”下选择“消耗”,创建新的消耗计划,然后选择“确定”。
有关详细信息,请参阅将应用移到另一个应用服务计划。
可以使用以下过程从 Windows 上的消耗计划迁移到高级计划:
按如下所示运行 az functionapp create 命令,在现有函数应用所在的同一区域和资源组中创建新的应用服务计划(弹性高级):
az functionapp plan create --name <NEW_PREMIUM_PLAN_NAME> --resource-group <MY_RESOURCE_GROUP> --location <REGION> --sku EP1
按如下所示运行 az functionapp update 命令,将现有函数应用迁移到新的高级计划:
az functionapp update --name <MY_APP_NAME> --resource-group <MY_RESOURCE_GROUP> --plan <NEW_PREMIUM_PLAN>
如果不再需要应用原来使用的消耗计划,请在确认已成功迁移到新的计划后,删除原始的函数应用计划。 按如下所示运行 az functionapp plan list 命令,以获取资源组中所有消耗计划的列表:
az functionapp plan list --resource-group <MY_RESOURCE_GROUP> --query "[?sku.family=='Y'].{PlanName:name,Sites:numberOfSites}" -o table
你可以放心地删除没有站点的计划,这是你从其进行迁移的计划。
按如下所示运行 az functionapp plan delete 命令,以删除从中迁移了应用的消耗计划。
az functionapp plan delete --name <CONSUMPTION_PLAN_NAME> --resource-group <MY_RESOURCE_GROUP>
可以使用以下过程从 Windows 上的高级计划迁移到消耗计划:
按如下所示运行 az functionapp create 命令,在现有函数应用所在的同一区域和资源组中创建新的函数应用(消耗)。 此命令还会创建一个将在其中运行函数应用的新消耗计划:
az functionapp create --resource-group <MY_RESOURCE_GROUP> --name <NEW_CONSUMPTION_APP_NAME> --consumption-plan-location <REGION> --runtime <LANGUAGE_RUNTIME> --functions-version 4 --storage-account <STORAGE_NAME>
按如下所示运行 az functionapp show 命令,获取使用新函数应用创建的消耗计划的名称:
az functionapp show --resource-group <MY_RESOURCE_GROUP> --name <NEW_CONSUMPTION_APP_NAME> --query "{appServicePlanId}" -o tsv
消耗计划名称是返回的完全限定资源 ID 的最终段。
按如下所示运行 az functionapp update 命令,将现有函数应用迁移到新的消耗计划:
az functionapp update --name <MY_APP_NAME> --resource-group <MY_RESOURCE_GROUP> --plan <NEW_CONSUMPTION_PLAN> --force
按如下所示运行 az functionapp delete 命令以删除在步骤 1 中创建的函数应用,因为只需使用创建的计划来运行现有函数应用:
az functionapp delete --name <NEW_CONSUMPTION_APP_NAME> --resource-group <MY_RESOURCE_GROUP>
如果不再需要应用原来使用的高级计划,请在确认已成功迁移到新的计划后,删除原始的函数应用计划。 在删除高级计划之前,将继续为此向你收取费用。 按如下所示运行 az functionapp plan list 命令,以获取资源组中所有高级计划的列表:
az functionapp plan list --resource-group <MY_RESOURCE_GROUP> --query "[?sku.family=='EP'].{PlanName:name,Sites:numberOfSites}" -o table
按如下所示运行 az functionapp plan delete 命令,以删除从中迁移了应用的高级计划:
az functionapp plan delete --name <PREMIUM_PLAN> --resource-group <MY_RESOURCE_GROUP>
可以使用以下过程从 Windows 上的消耗计划迁移到高级计划:
按如下所示运行 New-AzFunctionAppPlan 命令,在现有函数应用所在的同一区域和资源组中创建新的应用服务计划(弹性高级):
New-AzFunctionAppPlan -Name <NEW_PREMIUM_PLAN_NAME> -ResourceGroupName <MY_RESOURCE_GROUP> -Location <REGION> -Sku EP1 -WorkerType Windows
按如下所示运行 Update-AzFunctionApp 命令,将现有函数应用迁移到新的高级计划:
Update-AzFunctionApp -Name <MY_APP_NAME> -ResourceGroupName <MY_RESOURCE_GROUP> -PlanName <NEW_PREMIUM_PLAN> -Force
不再需要应用最初使用的消耗计划时,可以按如下所示运行 Remove-AzFunctionAppPlan 命令,删除从中迁移的消耗计划:
Remove-AzFunctionAppPlan -Name <CONSUMPTION_PLAN_NAME> -ResourceGroupName <MY_RESOURCE_GROUP> -Force
可以使用以下过程从 Windows 上的高级计划迁移到消耗计划:
按如下所示运行 New-AzFunctionApp 命令,在现有函数应用所在的同一区域和资源组中创建新的函数应用(消耗)。 此命令还会创建一个将在其中运行函数应用的新消耗计划:
New-AzFunctionApp -Name <NEW_CONSUMPTION_APP_NAME> -StorageAccountName <STORAGE_NAME> -Location <REGION> -ResourceGroupName <MY_RESOURCE_GROUP> -Runtime <LANGUAGE_RUNTIME> -RuntimeVersion <LANGUAGE_VERSION> -FunctionsVersion 4 -OSType Windows
按如下所示运行 Get-AzFunctionApp 命令,获取使用新函数应用创建的消耗计划的名称:
Get-AzFunctionApp -ResourceGroupName <MY_RESOURCE_GROUP> -Name <NEW_CONSUMPTION_APP_NAME> | Select-Object -Property AppServicePlan | Format-List
按如下所示运行 Update-AzFunctionApp 命令,将现有函数应用迁移到新的消耗计划:
Update-AzFunctionApp -Name <MY_APP_NAME> -ResourceGroupName <MY_RESOURCE_GROUP> -PlanName <NEW_CONSUMPTION_PLAN> -Force
不再需要应用最初使用的消耗计划时,可以按如下所示运行 Remove-AzFunctionAppPlan 命令,删除从中迁移的消耗计划:
Remove-AzFunctionAppPlan -Name <CONSUMPTION_PLAN_NAME> -ResourceGroupName <MY_RESOURCE_GROUP> -Force
Azure 门户中的开发限制
下表显示了支持门户内编辑的操作系统和语言:
Language |
Windows 消耗计划 |
Windows 高级计划 |
Windows 专用计划 |
Linux 消耗计划 |
Linux 高级计划 |
Linux 专用计划 |
C# |
|
|
|
|
|
|
Java |
|
|
|
|
|
|
JavaScript (Node.js) |
✔ |
✔ |
✔ |
|
✔ |
✔ |
Python |
|
|
|
✔ |
✔ |
✔ |
PowerShell |
✔ |
✔ |
✔ |
|
|
|
TypeScript (Node.js) |
|
|
|
|
|
|
在 Azure 门户中开发函数时,请考虑以下限制:
- 仅在 Azure 门户中创建或修改的函数支持门户内编辑。
- 仅 JavaScript、PowerShell、Python 和 C# 脚本函数支持门户内编辑。
- 弹性消耗计划目前不支持门户内编辑。
- 从 Azure 门户外部将代码部署到函数应用时,不能再在门户中编辑该函数应用的任何代码。 在这种情况下,只需继续使用本地开发。
- 对于 Python,门户中当前不支持使用自定义模块进行开发。 若要将自定义模块添加到函数应用,必须在本地开发应用。
- 对于编译的 C# 函数和 Java 函数,可以在门户中创建函数应用和相关资源。 但是,你必须在本地创建函数代码项目,然后将其发布到 Azure。
如果可能,请在本地开发函数并将代码项目发布到 Azure 中的函数应用。 有关详细信息,请参阅在本地对 Azure Functions 进行编码和测试。
手动安装扩展
C# 类库函数可以将用于绑定扩展的 NuGet 包直接包含在类库项目中。 对于其他非 .NET 语言和 C# 脚本,应使用扩展捆绑包。 如果必须手动安装扩展,可以通过在本地使用 Azure Functions Core Tools 来执行此操作。 如果无法使用扩展捆绑包并且只能在门户中工作,则需要使用 Advanced Tools (Kudu) 直接在站点中手动创建 extensions.csproj 文件。 请确保首先从 host.json 文件中删除 extensionBundle
元素。
此过程适用于需要添加到应用的任何其他文件。
Azure 门户中内置的 Functions 编辑器允许直接在门户中更新函数代码和配置文件:
选择函数应用,然后在“函数”下,选择“函数”。
选择函数,然后在“开发人员”下选择“代码 + 测试”。
选择要编辑的文件,并在完成后选择“保存”。
需要使用高级工具 (Kudu) 创建和编辑应用根目录中的文件,例如 function.proj 或 extensions.csproj:
选择函数应用,展开 “开发工具”,然后选择“高级工具”>“Go”。
如果出现提示,请使用 Azure 凭据登录到源代码管理 (SCM) 站点。
在“调试控制台”菜单中,选择“CMD”。
导航到 .\site\wwwroot
,选择顶部的加号 (+) 按钮,然后选择“新建文件”。
为文件命名(例如 extensions.csproj
),然后按 Enter。
选择新文件旁边的编辑按钮,在文件中添加或更新代码,然后选择“保存”。
对于 extensions.csproj 等项目文件,请运行以下命令以重新生成扩展项目:
dotnet build extensions.csproj
函数应用在 Azure 应用服务平台中运行,并由该平台维护。 在这种情况下,Function App 有权访问 Azure 核心 Web 托管平台的大多数功能。 使用 Azure 门户时,可在左侧窗格中访问可用于函数应用的应用服务平台中的许多功能。
以下矩阵指示托管计划和操作系统支持的 Azure 门户功能:
功能 |
消耗计划 |
Flex 消耗计划 |
高级计划 |
专用计划 |
高级工具 (Kudu) |
Windows:✔ Linux:X |
X |
✔ |
✔ |
应用服务编辑器 |
Windows:✔ Linux:X |
X |
Windows:✔ Linux:X |
Windows:✔ Linux:X |
备份 |
X |
X |
X |
✔ |
Console |
Windows:命令行 Linux:X |
X |
Windows:命令行 Linux:SSH |
Windows:命令行 Linux:SSH |
本文的其余部分侧重于门户中以下可用于函数应用的功能:
若要深入了解如何使用应用服务设置,请参阅配置 Azure 应用服务设置。
应用服务编辑器
应用服务编辑器是一种高级的门户内编辑器,可用于修改诸如 JSON 配置文件和代码文件等内容。 选择此选项会启动单独的浏览器选项卡和基本编辑器。 借助此编辑器,可与 Git 存储库集成、运行和调试代码,并可修改函数应用设置。 同内置的函数编辑器相比,此编辑器为 Functions 提供了增强的开发环境。
建议你考虑在本地计算机上开发函数。 在本地开发项目并将其发布到 Azure 时,项目文件在 Azure 门户中处于只读状态。 有关详细信息,请参阅在本地对 Azure Functions 进行编码和测试。
控制台
要从命令行与 Function App 交互时,门户内控制台就是非常合适的开发人员工具。 常见命令包括创建和导航目录与文件,以及执行批处理文件和脚本。
在本地进行开发时,建议使用 Azure Functions Core Tools 和 Azure CLI。
高级工具 (Kudu)
应用服务的高级工具(也称为 Kudu)提供对 Function App 高级管理功能的访问。 从 Kudu 中,可以管理系统信息、应用设置、环境变量、站点扩展、HTTP 头和服务器变量。 也可通过浏览到 Function App 的 SCM 终结点(如 https://<myfunctionapp>.scm.chinacloudsites.cn/
),启动 Kudu。
部署中心
使用源代码管理解决方案来开发和维护函数代码时,可以使用部署中心通过源代码管理进行生成和部署。 进行更新时,会生成项目并将其部署到 Azure。 有关详细信息,请参阅 Azure Functions 中的部署技术。
跨域资源共享
为了防止在客户端执行恶意代码,新式的浏览器会阻止 Web 应用程序向正在单独的域中运行的资源发送请求。 跨域资源共享 (CORS) 允许 Access-Control-Allow-Origin
标头声明允许哪些域调用函数应用上的终结点。
配置函数应用的“允许的域”列表时,Access-Control-Allow-Origin
标头会自动添加到函数应用中 HTTP 终结点发出的所有响应。
如果存在另一个域条目,则会忽略通配符 (*)。
使用 az functionapp cors add
命令将域添加到“允许的域”列表。 以下示例添加 contoso.com 域:
az functionapp cors add --name <FUNCTION_APP_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--allowed-origins https://contoso.com
使用 az functionapp cors show
命令列出目前允许的域。
当前无法使用 Azure PowerShell 更新 CORS 设置。
身份验证
函数使用 HTTP 触发器时,可以要求首先对调用进行身份验证。 应用服务支持使用社交提供程序进行 Microsoft Entra 身份验证和登录。 有关配置特定身份验证提供程序的详细信息,请参阅 Azure 应用服务身份验证概述。
相关内容