ARM 模板中使用内部变量或参数的 listKeys 问题

问题描述 投票:0回答:2

我正在为我的 Azure Functions 设置 ARM 模板。我有

functions_app.json
,它将用作“主”模板,也将用于其他发布管道。

然后会有项目特定的参数模板,例如:

  • counter_function_arm.parameters.test.json
  • counter_function_arm.parameters.acceptance.json
  • weather_function_arm.parameters.test.json

等等

但我被困在这部分,它在

functions_app.json
模板内创建实际的函数资源:

"resources": [
{
    "apiVersion": "2018-11-01",
    "name": "[variables('resourceName')]",
    "type": "Microsoft.Web/sites",
    "properties": {
        "name": "[variables('resourceName')]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~4"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "dotnet"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[toLower(variables('resourceName'))]"
                }
            ]
        }
    }
}

为了简洁起见,我省略了一些内容。导入部分是

appSettings
部分。

我最初的想法是将

array
放入
variables
。这些将是“默认”设置。然后,从我的
counter_function_arm.parameters.test.json
文件中,我将添加另一个特定于该应用程序的数组,然后
union
将这两个组合在一起,以便配置所有
AppSettings

类似这样的:

counter_function_arm.parameters.test.json

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "customAppSettings":{
            "value": [
                {
                    "name": "CustomProperty",
                    "value": "some value"
                }
            ]
        }
    }
}

functions_app.json

"variables": {
    "defaultAppSettings": [
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~4"
                },
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "dotnet"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[toLower(variables('resourceName'))]"
                }
            ]
},
"resources": [
{
    "apiVersion": "2018-11-01",
    "name": "[variables('resourceName')]",
    "type": "Microsoft.Web/sites",
    "properties": {
        "name": "[variables('resourceName')]",
        "siteConfig": {
            "appSettings": "[union(variables('defaultAppSettings'), parameters('customAppSettings'))]"
        }
    }
}

所以在这种情况下,我将变量

union
variables('defaultAppSettings')
放在一起。
但是,问题是我不能在

parameters('customAppSettings')

部分使用

listKeys
。我也无法将其移至
variables
部分并将其设置为
parameters
,因为那里也不允许
defaultValue

listKeys

添加硬编码数组也不起作用:

union

所以我没有主意了。

有办法做到这一点吗?

azure-devops azure-resource-manager azure-rm-template
2个回答
2
投票

"appSettings": "[union([1,2,3], parameters('customAppSettings'))]"

遗憾的是,这是我能想到的最好的方法,它很容易出现语法错误,但如果您使用
多行字符串

,您可以以某种方式对其进行格式化以避免错误(但如果您使用Azure DevOps 不兼容)。 编辑: 还有另一种方法可以完成此任务,可能更适合您,那就是使用 linkedTemplate :

主模板

"resources": [ { "apiVersion": "2018-11-01", "name": "[variables('resourceName')]", "type": "Microsoft.Web/sites", "properties": { "name": "[variables('resourceName')]", "siteConfig": { "appSettings": "[union(variables('staticAppSettings'), parameters('customAppSettings'), json(concat('[{\"name\": \"AzureWebJobsStorage\",\"value\": \"', concat('DefaultEndpointsProtocol=https;AccountName=', parameters('azureFunctionParameters').functionStorageName,';AccountKey=', listKeys(resourceId(parameters('azureFunctionParameters').mainStorageResourceGroup, 'Microsoft.Storage/storageAccounts', parameters('azureFunctionParameters').functionStorageName), '2021-08-01').keys[1].value, ';EndpointSuffix=core.windows.net'),'\"}]')))]" } } } ]

在baseazurefunction.json linkedTemplate中你可以使用

"resources": [ { "type": "Microsoft.Resources/deployments", "apiVersion": "2021-04-01", "name": "yourResourceDeployment", "properties": { "mode": "Incremental", "templateLink": { "uri": "[concat(parameters('blobBaseUrl'), '/', parameters('resourceGroupName'), '/azurefunctions/baseazurefunction.json')]", "contentVersion": "1.0.0.0" }, "parameters": { "azureFunctionParameters": { "value": "[parameters('baseAzureFunctionParameters')]" }, "appSettings": { "value" : "[union(variables('staticAppSettings'), parameters('customAppSettings'))]" }, "someMoreAppSettings": { "value" : [ { "name": "AzureWebJobsStorage", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" }, { "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('xxxx-xxxx','MyResourceGroup','Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" } ] } } } } ]

如果您对将连接字符串作为参数发送到其他模板有安全顾虑,您可以将您的应用程序设置包装在一个安全对象中,其中包含一个名为 array 的属性,该属性将包含您的所有设置,然后像这样使用它

{ "apiVersion": "2018-11-01", "name": "[variables('resourceName')]", "type": "Microsoft.Web/sites", "properties": { "name": "[variables('resourceName')]", "siteConfig": { "appSettings": "[union(parameters('appSettings'), parameters('moreAppSettings'))]" } } }



0
投票
Azure DevOps 部署

一起使用。 这就是我如何组合三个数组,包括函数应用程序的 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 和 AzureWebJobsStorage 设置。

"appSettings": { "type": "secureobject", "metadata": { "description": "Secure object with an array property which contains the appsettings" } }, "moreAppSettings": { "type": "secureobject", "metadata": { "description": "Secure object with an array property which contains more appsettings" } } . . . "appSettings": "[union(parameters('appSettings').array, parameters('moreAppSettings').array)]"

希望这可以帮助那里的人。

© www.soinside.com 2019 - 2024. All rights reserved.