Шаблон Azure ARM, позволяющий расширить диагностику Linux с помощью автоматически сгенерированного токена SAS

#azure #diagnostics #azure-diagnostics #sas-token

#azure #диагностика #azure-диагностика #sas-токен

Вопрос:

Я пытаюсь развернуть шаблон arm с новой виртуальной машиной и настроить диагностическое расширение Linux / LAD без создания новой учетной записи хранилища, но используя существующую. Я нашел эту статью https://samcogan.com/generate-sas-tokens-in-arm-teamplates для использования «listAccountSas» и я установил в «ProtectedSettings»:

«storageAccountSasToken»: «[Список учетных записей(параметры(‘existingStorageName’), ‘2018-07-01’, переменные (‘accountSasProperties’)).accountSasToken]»

 "resources": [
{vm creation bla bla},

   {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "apiVersion": "[providers('Microsoft.Compute','virtualMachines/extensions').apiVersions[0]]",
      "location": "[parameters('vmLocation')]",
      "dependsOn": [ 
          "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"     
         ],
      "name": "[concat(parameters('vmName'), '/LinuxDiagnostic')]",      
      "properties": {
          "publisher": "Microsoft.Azure.Diagnostics",
          "type": "LinuxDiagnostic",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "3.0", 

          "protectedSettings": {
            "storageAccountName": "[parameters('existingStorageName')]",
            "storageAccountSasToken": "[listAccountSas(parameters('existingStorageName'), '2018-07-01', variables('accountSasProperties')).accountSasToken]",  

            "storageAccountEndPoint": "https://core.windows.net/",
            "sinksConfig": {
              "sink": [
                {
                  "name": "WADMetricJsonBlob",
                  "type": "JsonBlob"
                }
              ]
            }  

            },

          "settings": {
          "StorageAccount": "[parameters('existingStorageName')]",
          "ladCfg": {
              "diagnosticMonitorConfiguration": {
                  "eventVolume": "Medium", 
                  "metrics": {
                    "metricAggregation": [
                      {
                        "scheduledTransferPeriod": "PT1H"
                      }, 
                      {
                        "scheduledTransferPeriod": "PT1M"
                      }
                    ], 
                    "resourceId": "[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]"
                  }, 

                  "performanceCounters": {
                    "sinks": "WADMetricJsonBlob",
                    "performanceCounterConfiguration": [                                
                      {
                        "annotation": [
                          {
                            "displayName": "Memory percentage", 
                            "locale": "en-us"
                          }
                        ], 
                        "class": "memory", 
                        "counter": "percentusedmemory", 
                        "counterSpecifier": "/builtin/memory/percentusedmemory", 
                        "type": "builtin", 
                        "unit": "Percent"
                      }

                    ]
                  }, 
                  "syslogEvents": {}
                }, 
                "sampleRateInSeconds": 15
              }
            }                  
          }

      },
  

Когда я пытаюсь развернуть шаблон, я получаю ошибку во время проверки:

«InvalidTemplate», «сообщение»: «Ошибка проверки шаблона развертывания: «Ссылка на шаблон «myExistingStorageAccount» недопустима: не удалось найти ресурс шаблона или копию ресурса с этим именем. Пожалуйста, смотрите https://aka.ms/arm-template-expressions/#reference для получения подробной информации об использовании.’.»}

Согласно MS:

Ссылочная функция и функции list * не создают неявной зависимости, когда на ресурс ссылается его идентификатор ресурса. Чтобы создать неявную зависимость, передайте имя ресурса, который развернут в том же шаблоне.

Тем не менее, я попытался с помощью вложенного шаблона, где «создать» токен SAS и в выходных данных установить sasToken.Идентификатор, по которому позже в моем основном шаблоне будет вызываться диагностическое расширение с sastoken.Id:

 {
    "apiVersion": "2017-08-01",
    "name": "SasTokenNestedTemplate",
    "type": "Microsoft.Resources/deployments",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
    ],
    "properties": {
        "mode" : "Incremental",
        "template": {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {},
        "variables": {},
        "resources": [
            {
                "apiVersion" : "2018-03-01",
                "type":  "Microsoft.Resources/deployments",
                "name": "NestedSasTokenCreation",
                "properties": {
                    "sasToken": "[listAccountSas(parameters('existingStorageName'), '2018-07-01', variables('accountSasProperties')).accountSasToken]"
                    }
                }
                ],
                "outputs": {
                    "sasToken": {
                      "type": "string",
                      "value": "[resourceId('Microsoft.Resources/deployments', parameters('sasToken'))]"
                    }
                  }
            }
        }
    },


   {
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "apiVersion": "[providers('Microsoft.Compute','virtualMachines/extensions').apiVersions[0]]",
    "location": "[parameters('vmLocation')]",
    "dependsOn": [ 
        "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"      
     ],
    "name": "[concat(parameters('vmName'), '/LinuxDiagnostic')]",      
    "properties": {
        "publisher": "Microsoft.Azure.Diagnostics",
        "type": "LinuxDiagnostic",
        "autoUpgradeMinorVersion": true,
        "typeHandlerVersion": "3.0", 

        "protectedSettings": {
          "storageAccountName": "[parameters('existingStorageName')]",
          "storageAccountSasToken": { "value": "[reference('SasTokenNestedTemplate', '2017-08-01').outputs.sasToken.value]" }, 

          "storageAccountEndPoint": "https://core.windows.net/",
          "sinksConfig": {
            "sink": [
              {
                "name": "WADMetricJsonBlob",
                "type": "JsonBlob"
              }
            ]
          }  
  

Но по-прежнему выдает ту же ошибку, что и выше.
Заранее спасибо за вашу помощь!

Ответ №1:

вам нужно предоставить ему идентификатор ресурса учетной записи хранилища, потому что это не часть шаблона, он не может разобраться с этим самостоятельно.

 listAccountSas(resourceId('Microsoft.Storage/storageAccounts', parameters('existingStorageName')), '2018-07-01', variables('accountSasProperties')).accountSasToken
  

Комментарии:

1. Ты мой герой! Большое спасибо, приятель!