2

Comment appelez-vous correctement la fonction resourceId() définie dans le Azure Resource Manager Template Language?

ContexteAzure Resource Manager Template Language - resourceId(): impossible d'évaluer la fonction de langage de modèle 'resource Id'

/// - 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 
/// 


Cette ligne dans le modèle (voir modèle ci-dessous complet)
"sourceDatabaseId": "[resourceId('Microsoft.Sql/servers/databases', 'TestDB')]"


donne cette erreur lors de l'exécution du PowerShell New-AzureResourceGroup CmdLet:

 
    PS c:\AzureDeployment> New-AzureResourceGroup -Location "North Europe" -Name "psResourceGroup" -DeploymentName "psDeployment" -TemplateFile .\Template.json -TemplateParameterFile .\Parameters.json -Verbose 
    cmdlet New-AzureResourceGroup at command pipeline position 1 
    Supply values for the following parameters: 
    (Type !? for Help.) 
    VERBOSE: Performing the operation "Replacing resource group ..." on target "psDeployment". 
    VERBOSE: 16:22:07 - Created resource group 'psResourceGroup' in location 'northeurope' 
    New-AzureResourceGroup : 16:22:08 - Resource Microsoft.Sql/servers/databases 
    'xxx-sql-server-name-xxx/psDatabaseName' failed with message 
    'Unable to process template language expressions for resource 
    '/subscriptions/xxxxxxxx/resourceGroups/psResourceGroup/providers/Microsoft.Sql/servers/xxx-sql-server-name-xxx/databases/psDatabaseName' 
    at line _ and column _. 
    'Unable to evaluate template language function 'resource Id': the type 'Microsoft.Sql/servers/databases' requires '2' resource name argument(s).'' 
    At line:1 char:1 
    + New-AzureResourceGroup -Location "North Europe" -Name "psResourceGroup" -Templat ... 
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     + CategoryInfo : NotSpecified: (:) [ New-AzureResourceGroup ], Exception 
     + FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureResourceGroupCommand 



La fonction resourceId() a, selon les documentation, deux paramètres, et je l'appelle avec deux chaînes constantes que je Beleve est correct:
resourceId('Microsoft.Sql/servers/databases', 'TestDB')
Encore il produit un message d'erreur indiquant que le nombre de paramètres est faux:
'Unable to evaluate template language function 'resource Id': the type 'Microsoft.Sql/servers/databases' requires '2' resource name argument(s).'

La ressource utilisée, selon le message d'erreur est: '/subscriptions/xxxxxxxx/resourceGroups/psResourceGroup/providers/Microsoft.Sql/servers/xxx-sql-server-name-xxx/databases/psDatabaseName'

Alors, quelle est la bonne façon d'appeler resourceId() pour une base de données?

En outre, si je supprime createMode et sourceDatabaseId du modèle, tout fonctionne correctement.



C'est le modèle utilisé ci-dessus

 
{  
    "$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", 
      "allowedValues": [ 
       "East Asia", 
       "South East Asia", 
       "East US", 
       "West US", 
       "North Central US", 
       "South Central US", 
       "Central US", 
       "North Europe", 
       "West Europe" 
      ] 
     }, 
     "sqlServerName": { "type": "string" }, 
     "sqlAdminUserName": { "type": "string" }, 
     "sqlAdminUserPassword": { "type": "securestring" }, 
     "databaseName": { "type": "string" } 
    }, 

    "resources": [ 
     { 
      "type": "Microsoft.Sql/servers", 
      "apiVersion": "2.0", 
      "location": "[parameters('location')]", 
      "name": "[parameters('sqlServerName')]", 
      "properties": { "administratorLogin": "[parameters('sqlAdminUserName')]", "administratorLoginPassword": "[parameters('sqlAdminUserPassword')]" }, 
      "resources": [ 
       { 
        "type": "databases", 
        "apiVersion": "2.0", 
        "location": "[parameters('location')]", 
        "name": "[parameters('databaseName')]", 
        "dependsOn": [ "[concat('Microsoft.Sql/servers/', parameters('sqlServerName'))]" ], 
        "properties": { 
         "edition": "Standard", 
         "collation": "SQL_Latin1_General_CP1_CI_AS", 
         "maxSizeBytes": "10737418240", 
         "requestedServiceObjectiveId": "f1173c43-91bd-4aaa-973c-54e79e15235b", 
         "createMode": "Copy", 

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

        } 
       } 
      ] 
     } 
    ] 
} 

Répondre

3

je suis tombé sur la solution dans un article tout à fait sans rapport, mais vous devriez être de passage

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

0

J'ai remarqué que vos valeurs apiVersion ne sont pas formatés correctement. Azure utilise des valeurs de date pour les API.

Essayez d'utiliser une valeur comme dans les exemples de fichiers:

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

Comme je l'ai dit, tout fonctionne très bien si je supprime createMode et databaseId. Et si vous regardez les modèles de Microsofts, vous pouvez voir qu'ils utilisent également la version 2.0 comme 'Save-AzureResourceGroupGalleryTemplate Microsoft.WebSiteSQLDatabase.0.3.12-preview' Mais vous avez raison car souvent apiVersion est une chaîne de date .Mais comme vous pouvez le voir si vous exécutez 'Get-AzureProvider | Format-Custom -depth 2' l'apiVersion est absent de Microsoft.Sql/... Donc l'apiVersion est correcte et pas le problème. – NoOneSpecial