Azure 如何通过ARM模板输出返回Redis primaryKey?

Azure 如何通过ARM模板输出返回Redis primaryKey?,azure,redis,azure-resource-manager,arm-template,azure-template,Azure,Redis,Azure Resource Manager,Arm Template,Azure Template,我正试图在下面列出的ARM模板的帮助下部署Redis,然后返回其主键(Azure portal for Redis中“Access key”->“primary”下的机密字符串): 但是,我从管道中收到错误消息“AzureResourceManagerTemplateDeployment@3“任务: [错误]无法评估模板输出:“RedisCachePassword”。请参阅错误详细信息和部署操作。有关用法的详细信息,请参阅 [错误]详细信息: [错误]DeploymentOutputEvalu

我正试图在下面列出的ARM模板的帮助下部署Redis,然后返回其主键(Azure portal for Redis中“Access key”->“primary”下的机密字符串):

但是,我从管道中收到错误消息“AzureResourceManagerTemplateDeployment@3“任务:

[错误]无法评估模板输出:“RedisCachePassword”。请参阅错误详细信息和部署操作。有关用法的详细信息,请参阅

[错误]详细信息:

[错误]DeploymentOutputEvaluationFailed:模板输出“RedisCachePassword”无效:无法计算语言表达式属性“primaryKey”

下面我的手臂模板有什么问题?在这种情况下,如何找到正确的名字

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "redisCacheName": {
            "defaultValue": "my-redis",
            "type": "String"
        }
    },
    "variables": {
        "resourceName": "[concat(resourceGroup().name, '-', parameters('redisCacheName'))]"
    },
    "outputs": {
      "RedisCacheEndpoint": {
        "type": "string",
        "value": "[concat(reference(variables('resourceName')).hostName, ':', reference(variables('resourceName')).sslPort)]"
      },
      "RedisCachePassword": {
        "type": "string",
        "value": "[reference(variables('resourceName')).accessKeys.primaryKey]"
      }
    },
    "resources": [
        {
            "type": "Microsoft.Cache/Redis",
            "apiVersion": "2019-07-01",
            "name": "[variables('resourceName')]",
            "location": "[resourceGroup().location]",
            "properties": {
                "sku": {
                    "name": "Basic",
                    "family": "C",
                    "capacity": 1
                },
                "enableNonSslPort": false
            }
        }
    ]
}

为什么
[reference(variables('resourceName')).accessKeys.primaryKey]
不起作用?

请注意,这些输出在某些方面非常可见。您最好在
输出之外调用
listKeys
命令。您可以在其他模板中使用它,也可以通过AzureCLI或Powershell单独执行该命令

如果您知道自己在做什么,以下是您应该如何设置它:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "redisCacheName": {
            "defaultValue": "myredisinstance",
            "type": "String"
        }
    },
    "variables": {
        "resourceId": "[resourceId('Microsoft.Cache/Redis', parameters('redisCacheName'))]",
        "apiVersion": "[providers('Microsoft.Cache', 'redis').apiVersions[0]]"
    },
    "outputs": {
      "RedisCachePassword": {
        "type": "string",
        "value": "[listKeys(variables('resourceId'), variables('apiVersion')).primaryKey]"
      }
    },
    "resources": []
}
关于这通常是如何工作的

要“调试”这些东西,我喜欢使用,并查看输出和“操作”选项卡:


亚历克斯提到了这一点,但我会更强烈地说。。。不要把秘密放在输出中。这意味着对部署具有读取权限的任何人都可以访问他们可能无权访问的资源的机密。我甚至可能无法访问redisCache,但如果我可以访问部署,我也可以访问该机密

如果需要,输出redisCache的resourceId,并在需要使用它的地方调用listKeys(Alex也暗示了这一点)

在大多数情况下,您甚至不需要使用输出,因为需要密钥的资源也知道资源的resourceId


从技术上讲,这是可能的,如果您这样做,请注意表面积…

谢谢,但由于某些原因,只有左侧选项卡“DATA(Get,Put)”为我启用。下一个选项卡“操作(发布、删除)”被禁用。也许这是我(相当大)组织的设置?不确定,但听起来似乎取决于一些权限