如何通过arm模板输出返回redis primarykey?

4si2a6ki  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(348)

我正试图借助下面列出的arm模板部署redis,然后返回它的主键(azure portal for redis中“access keys”->“primary”下的秘密字符串):

但是,我从管道中得到错误消息“azureresourcemanagertemplatedeployment@3“任务:
[错误]无法评估模板输出:“rediscachepassword”。请参阅错误详细信息和部署操作。请看https://aka.ms/arm-debug 有关用法的详细信息。
[错误]详细信息:
[错误]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] 工作?

nqwrtyyt

nqwrtyyt1#

亚历克斯提到了这一点,但我会更强烈地说。。。不要把秘密放在输出中。这意味着任何对部署具有读取权限的人都可以访问他们可能无权访问的资源的机密。瞧,我甚至可能无法访问那个rediscache,但是如果我可以访问部署,我也可以访问那个秘密。
如果需要,可以输出rediscache的resourceid,并在需要使用它的地方调用listkeys(alex也暗示了这一点)。
在大多数情况下,甚至不需要使用输出,因为需要密钥的资源也知道资源的resourceid。
从技术上讲,这是可能的,只要注意表面积,如果你这样做。。。

4ngedf3f

4ngedf3f2#

请注意,这些输出在某些方面是非常明显的。你最好调用 listKeys 命令超出你的范围 outputs . 您可以在其他模板中使用它,也可以通过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": []
}

下面是一些关于如何工作的更多信息。
要“调试”这样的东西,我喜欢用https://resources.azure.com,并查看输出和“操作”选项卡:

相关问题