我有一个天蓝色功能应用程序,我想以可重复(自动)的方式设置它,以便我可以在不同的环境/资源组中复制它。我可以通过 azure cli 创建函数应用程序,但我还需要配置 CORS 选项,以便可以从浏览器调用它。
我找到了在 azure 门户 Web ui 中执行此操作的位置, 在“平台功能”选项卡中(https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings#cors),但是我找不到任何有关通过 azure cli 修改该设置的信息,或者通过我设置的 VSTS 部署任务(当我更改应用程序中的功能时进行发布)来修改该设置的信息。
您甚至可以通过 local.settisg.json 指定本地开发的 CORS 设置,但这仅适用于本地(https://learn.microsoft.com/en-us/azure/azure-functions/functions-运行本地#本地设置)。如果我通过 azure 函数工具 cli 部署应用程序,我应该可以在部署时指定
--publish-local-settings
标志,但我不会以这种方式部署。
看来一定有一种方法可以在不使用Web UI的情况下修改CORS配置,我只是没有找到它吗?
Fabio 的答案是正确的,Azure 资源管理器模板适用于此。由于他链接到的示例是关于逻辑应用程序而不是 Azure 函数,因此正确使用模板需要进行一些更改,我想添加一些细节,以帮助其他人更快地实现目标。
为了制作模板,我最终从手动创建的功能应用程序下载了自动化模板,然后删除内容,直到达到我认为的最小值。这是我正在使用的:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"function_app_name": {
"defaultValue": "my-function-app",
"type": "string"
}
},
"variables": {},
"resources": [
{
"comments": "CORS allow origins *.",
"type": "Microsoft.Web/sites/config",
"name": "[concat(parameters('function_app_name'), '/web')]",
"apiVersion": "2016-08-01",
"properties": {
"cors": {
"allowedOrigins": [
"*"
]
}
},
"dependsOn": []
}
]
}
我还有一个与之配套的参数文件,如下所示:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"function_app_name": {
"value": null
}
}
}
然后我的发布定义中有一个
Azure Resource Group Deployment
步骤,用于部署此步骤并根据我要部署到的环境替换所需的函数应用程序名称。
要以编程方式设置 CORS 设置,您需要使用 ARM。
这是您可以遵循的示例:https://msftplayground.com/2016/08/setting-api-definition-url-cors-value-arm/
我倾向于将函数 CORS 条目自动化作为部署的一部分(在函数应用程序资源已经在管道或另一个管道中的早期使用 ARM 模板构建之后)。
由于您可以在函数应用程序中拥有多个函数,因此我考虑了特定于函数应用程序中部署的函数的 CORS 要求,并且我认为任何 CORS 条目都应该是实际函数部署过程的一部分。
我使用 Azure CLI 来自动化 CORS 设置。请参阅如何通过Azure Functions自动化设置CORS
az functionapp cors add --allowed-origins
[--ids]
[--name]
[--resource-group]
[--slot]
[--subscription]
您还可以检查/显示现有条目,如下所示:
az functionapp cors show --name MyFunctionApp --resource-group MyResourceGroup
当您使用 Azure/bicep 进行部署时,您可以使用以下代码片段(注意 cors 选项):
@description('The name of you Web Site.')
param siteName string = 'FuncApp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
var hostingPlanName = 'hpn-${resourceGroup().name}'
resource site 'Microsoft.Web/sites@2022-03-01' = {
name: siteName
kind: 'functionapp,linux'
location: location
properties: {
siteConfig: {
appSettings: [
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'python'
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
]
cors: {
allowedOrigins: [
'https://portal.azure.com'
]
supportCredentials: true
}
}
serverFarmId: hostingPlan.id
clientAffinityEnabled: false
}
}
resource hostingPlan 'Microsoft.Web/serverfarms@2022-03-01' = {
name: hostingPlanName
location: location
kind: 'linux'
properties: {
reserved: true
}
sku: {
tier: 'Standard'
name: 'S1'
}
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageAccountName
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}