web-dev-qa-db-fra.com

Erreur de modèle de ressource de site Web Azure

J'essaie d'utiliser le module AzureResourceManager PowerShell pour créer et configurer un site Web. J'ai commencé avec un fichier modèle généré par Visual Studio, qui fonctionne très bien lorsque je l'utilise via New-AzureResourceGroup -TemplateFile website.json.

Alors maintenant, j'essaie de modifier le fichier de modèle pour configurer le site. J'essaie de définir les versions php et .NET Framework. Selon le schéma ces propriétés sont définies via un objet config dans un tableau de ressources.

Voici la section site Web de mon modèle json. La section "ressources" est ce que j'ai ajouté:

    {
        "apiVersion": "2014-06-01",
        "name": "[parameters('siteName')]",
        "type": "Microsoft.Web/sites",
        "location": "[parameters('siteLocation')]",
        "tags": {
            "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource"
        },
        "dependsOn": [
            "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
        ],
        "properties": {
            "name": "[parameters('siteName')]",
            "serverFarm": "[parameters('hostingPlanName')]"
        },
        "resources": [
            {
                "apiVersion": "2014-04-01",
                "type": "Microsoft.Web/sites/config",
                "name": "config",
                "properties": {
                    "name": "config",
                    "phpVersion": "",
                    "netFrameworkVersion": "V4.5"
                }
            }
        ]
    },

Lorsque je passe ce modèle à Test-AzureResourceGroupTemplate J'obtiens cette erreur:

Code    : InvalidTemplate
Message : Deployment template validation failed: 'The template resource 'config' for type 'Microsoft.Web/sites/config' has 
          incorrect segment lengths. A nested resource type must have identical number of segments as its resource name. A root 
          resource type must have segment length one greater than its resource name'.

Je ne trouve aucune documentation à ce sujet. Est-ce que quelqu'un sait ce que cette erreur signifie ou ce que je fais mal?

27
BenV

N'échoue jamais, dès que j'écris la question, je trouve la réponse.

L'erreur signifie que, car il s'agit d'une ressource imbriquée (l'objet config est imbriqué dans l'objet site), le nom doit refléter cela. Ainsi, au lieu de config, le nom devrait ressembler à mysite/config. J'ai également dû ajouter la section dependsOn. Voici le modèle qui a été validé avec succès:

"resources": [
    {
        "apiVersion": "2014-04-01",
        "type": "Microsoft.Web/sites/config",
        "name": "[concat(parameters('siteName'), '/config')]",
        "dependsOn": [
            "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
        ],
        "properties": {
            "phpVersion": "",
            "netFrameworkVersion": "V4.5"
        }
    }
]
39
BenV

Le message d'erreur "longueurs de segment incorrectes" est difficile à comprendre pour les natifs non anglais, il y a donc une explication en anglais/json: Par exemple, vous avez une ressource de type Microsoft.Network/trafficManagerProfiles ressource et pour une raison quelconque, vous devez définir une ressource imbriquée de type Microsoft.Network/trafficManagerProfiles/ExternalEndpoints en tant que ressource distincte.

La ressource imbriquée doit avoir le nom parent_resource_name/nested_res_name

Le schéma correct (simplifié) est:

{
  "type": "Microsoft.Network/trafficManagerProfiles",
  "name": "[variables('trafManagerProfileName')]",
   ...
},
{
  "type": "Microsoft.Network/trafficManagerProfiles/ExternalEndpoints",
  "name": "[concat(variables('trafManagerProfileName'), '/Endpoint', copyIndex())]",
  "dependsOn": [
    "[concat('Microsoft.Network/trafficManagerProfiles/', variables('trafManagerProfileName'))]",
    "[parameters('app_name')]" # where the endpoint should look at
  ],
   ...
}

p.s. cette question pourrait également vous intéresser si vous avez besoin de générer dynamiquement des ressources imbriquées en fonction du nombre de troisièmes ressources: Comment générer dynamiquement des points de terminaison Traffic Manager dans un modèle ARM?

4
Putnik

J'ai rencontré le même problème et aucune des autres réponses n'a fonctionné pour moi, il s'avère qu'il y a en fait un peu plus que les autres réponses. Tout d'abord, pour une ressource de niveau racine, les documents spécifient elle doit:

... ont un segment de moins dans le nom que dans le type de ressource

En d'autres termes, si vous créez un:

"type": "Microsoft.Web/sites"

Ensuite, comme le nom doit avoir un segment de moins que le type, nous ne pouvons utiliser qu'un seul segment pour le nom dans cet exemple, c'est-à-dire un:

"name": "MySite"

Pour une ressource imbriquée, la règle est:

le type et le nom ont le même nombre de segments

Cependant, cela suppose que vous raccourcissez le type d'une ressource imbriquée, par exemple créer un type de "Microsoft.Web/sites/config" en tant que ressource imbriquée dans un parent de type "Microsoft.Web/sites" et pour la ressource imbriquée en spécifiant:

"type": "config"

Ici, vous ne pouvez également spécifier qu'un seul nom de segment, par exemple:

"name": "MyConfig"

Donc, tout cela ensemble, vous avez:

{
  "type": "Microsoft.Web/sites",
  "name": "MySite",
  "various other properties": ...,
  "resources": [
    {
      "type": "config",
      "name": "MyConfig"
      "various other properties": ...
    }
  ]
}

Si, d'autre part, vous spécifiez le nom de type complet dans la ressource imbriquée (comme indiqué dans la réponse acceptée), vous devez recourir à la convention de dénomination racine d'avoir un segment de moins dans le nom que le type! En convertissant ce qui précède, vous auriez:

{
  "type": "Microsoft.Web/sites",
  "name": "MySite",
  "various other properties": ...,
  "resources": [
    {
      "type": "Microsoft.Web/sites/config",
      "name": "MySite/MyConfig"
      "various other properties": ...
    }
  ]
}
3
Matt