Как вернуть Redis primaryKey через вывод шаблона ARM? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь развернуть Redis с помощью шаблона ARM, указанного ниже, а затем вернуть его первичный ключ (секретная строка, доступная на портале Azure для Redis в разделе «Ключи доступа» -> «Первичный»):

portal screenshot

However I get the error message from my pipeline "AzureResourceManagerTemplateDeployment@3" task:

[error]Unable to evaluate template outputs: 'RedisCachePassword'. Please see error details and deployment operations. Please see https://aka.ms/arm-debug для получения сведений об использовании.

[ошибка] Подробности:

[ошибка] DeploymentOutputEvaluationFailed: вывод шаблона RedisCachePassword недействительно: свойство языкового выражения 'primaryKey' не может быть оценено ..

Что не так с моим шаблоном ARM ниже? А как найти правильные имена в таких случаях?

{
    "$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]?

Ответы [ 2 ]

1 голос
/ 12 мая 2020

Алекс упомянул об этом, но я скажу более строго ... не помещайте секреты в выходные данные. Это означает, что любой, у кого есть разрешение на чтение в развертывании, может получить доступ к секрету ресурса, к которому он может не иметь доступа. IOW, у меня может даже не быть доступа к этому redisCache, но если у меня есть доступ к развертыванию, у меня также есть доступ к этому секрету.

Если вам нужно, выведите resourceId redisCache и вызовите listKeys, где вам нужно использовать его (Алекс тоже намекнул на это).

В большинстве случаев вам даже не нужно использовать выходные данные, потому что ресурс, которому нужен ключ, также знает resourceId ресурса.

Технически это возможно, просто помните о площади поверхности, если вы это сделаете ...

1 голос
/ 08 мая 2020

Имейте в виду, что эти выходы в некотором смысле довольно заметны. Возможно, вам будет лучше вызвать команду listKeys вне вашего outputs. Вы можете использовать его в других шаблонах или выполнять команду отдельно через AzureCLI или Powershell.

Outputs are not secrets for Azure

Если вы знаете, что делаете, то это то, как вы должна иметь возможность настроить его:

{
    "$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, и посмотрите вывод и вкладку «Действия»:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...