Язык шаблонов Azure Resource Manager - resourceId(): невозможно оценить функцию языка шаблонов "идентификатор ресурса"

Как правильно вызвать функцию resourceId(), определенную на языке шаблонов Azure Resource Manager?

контекст

///  - Azure
///  - Azure Resource Management
///      https://msdn.microsoft.com/en-us/library/azure/dn578292.aspx
///
///  - Azure Resource Manager Template Language
///      https://msdn.microsoft.com/en-us/library/azure/dn835138.aspx
///
///  - Azure Resource Manager Template Language functions and expressions
///  - Azure Resource Manager Template Language function:
///      resourceId('resourceNamespace/resourceType','resourceName')
///
///  - Powershell
///  - Azure PowerShell
///  - Azure PowerShell Resource Manager Mode (Switch-AzureMode AzureResourceManager)
///  - Azure PowerShell CmdLet: New-AzureResourceGroup
///


Эта строка в шаблоне (см. Полный шаблон ниже)
"sourceDatabaseId": "[resourceId('Microsoft.Sql/servers/databases', 'TestDB')]"


Выдает эту ошибку при запуске PowerShell New-AzureResourceGroup CmdLet:

    PS c: \ AzureDeployment> New-AzureResourceGroup -Расположение "Северная Европа" -Имя "psResourceGroup" -DeploymentName "psDeployment" -TemplateFile .\Template.json -TemplateParameterFile .\Parameters.json -Verbose позиция командлета конвейер 1-группа-AzureResourceG Задайте значения для следующих параметров:
    (Введите!? Для справки.)
    VERBOSE: Выполнение операции "Замена группы ресурсов..." для цели "psDeployment".
    VERBOSE: 16:22:07 - Создана группа ресурсов 'psResourceGroup' в расположении 'northeurope'
    New-AzureResourceGroup: 16:22:08 - Ресурс Microsoft.Sql/servers/database 'xxx-sql-server-name-xxx/psDatabaseName' не удалось с сообщением "Невозможно обработать выражения языка шаблона для ресурса" /subscription/xxxxxxxx/resourceGroups/psResourceGroup/providers/Microsoft.Sql/servers/xxx-sql-server-name-xxx/databases/psDatabaseName'в строке _ и столбце _, "Невозможно оценить функцию языка шаблонов" Идентификатор ресурса: для типа "Microsoft.Sql/servers/database" требуются аргументы "2" для имени ресурса. '' В строке: 1 символ:1
    + New-AzureResourceGroup -Location " Северная Европа "-Name "psResourceGroup" -Templat ... 
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo: NotSpecified: (:) [ New-AzureResourceGroup ], Exception 
        + FullyQualifiedErrorId: Microsoft.Azure.Commands.Resources.NewAzureResourceGroupCommand



Функция resourceId() имеет, согласно документации, 2 параметра, и я называю это двумя константными строками, которые я считаю правильными:
resourceId('Microsoft.Sql/servers/databases', 'TestDB')
Тем не менее он выдает сообщение об ошибке, указывающее, что число параметров неверно:
'Unable to evaluate template language function 'resource Id': the type 'Microsoft.Sql/servers/databases' requires '2' resource name argument(s).'

Используемый ресурс, согласно сообщению об ошибке:'/subscriptions/xxxxxxxx/resourceGroups/psResourceGroup/providers/Microsoft.Sql/servers/xxx-sql-server-name-xxx/databases/psDatabaseName'

Итак, как правильно вызвать resourceId() для базы данных?

Кроме того, если я удаляю createMode и sourceDatabaseId из шаблона, все работает нормально.



Это шаблон, использованный выше

{    
    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json",
    "contentVersion": "1.0.0.0",

    "parameters": {
        "location": {
            "type": "string",
            "defaultValue": "North Europe",
            "allowValues ​​": [
                " Восточная Азия "," Юго-Восточная Азия "," Восточная часть США "," Западная часть США "," Северо-центральная часть " US",
                " South Central US",
                " Central US",
                " North Europe",
                "West Europe"
            ]
        },
        "sqlServerName": { "type": "string" },
        "sqlAdminUserName": { "type": " строка " },
        "sqlAdminUserPassword": { "type": "securestring" },
        "databaseName": { "type": "string" }
    },

    "resources": [
        {
            "type": "Microsoft.Sql/servers",
            "apiVersion": "2.0",
            "location": "[parameters('location')]",
            "name": "[parameters('sqlServerName')]",
            "properties": { "administratorLogin": "[ параметры ('sqlAdminUserName')]", "administratorLoginPassword": "[параметры ('sqlAdminUserPassword')]" },
            "resources": [
                {
                    "type": "database "," apiVersion ":" 2.0 "," location ": "[параметры ('местоположение')]", "имя": "[параметры ('имя_базы_данных')]", "зависящий от": [ "[concat('Microsoft.Sql/servers/', параметры ('sqlServerName'))]" ],
                    "properties": {
                        "edition": "Standard",
                        "collation": "SQL_Latin1_General_CP1_CI_AS",
                        "maxSizeBytes": "10737418240",
                        "requiredServiceObjectiveId": "f1173c43-91bd-4aaa-973c-54e79e15235b",
                        "createMode": "Copy",

====>                   "sourceDatabaseId": "[resourceId('Microsoft.Sql/servers/database', 'TestDB')]"

                    }
                }
            ]
        }
    ]
}

2 ответа

Решение

Я наткнулся на решение в совершенно не связанной статье, но вы должны пропустить

[resourceId('Microsoft.SQL/servers/databases', parameters('sqlServerName'), 'TestDB')]

Я заметил, что ваши значения apiVersion не отформатированы должным образом. Azure использует значения даты для API.

Попробуйте использовать значение, как в примерах файлов:

"apiVersion": "2014-04-01-preview"

Потому что вы потеряли имя сервера SQL?

Другие вопросы по тегам