web-dev-qa-db-ja.com

Azure Webサイトリソーステンプレートエラー

AzureResourceManager PowerShellモジュールを使用してWebサイトを作成および構成しようとしています。私はVisual Studioによって生成されたテンプレートファイルから始めましたが、New-AzureResourceGroup -TemplateFile website.jsonを介して使用すると問題なく機能します。

だから今私はサイトを構成するためにテンプレートファイルを微調整しようとしています。私はphpと.NET Frameworkのバージョンを設定しようとしています。 schema によると、これらのプロパティはリソース配列の構成オブジェクトを介して設定されます。

これが私のjsonテンプレートのウェブサイトセクションです。 「リソース」セクションは私が追加したものです:

    {
        "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"
                }
            }
        ]
    },

このテンプレートをTest-AzureResourceGroupTemplateに渡すと、次のエラーが発生します。

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'.

これに関するドキュメントは見つかりません。このエラーの意味、または私が間違っていることを誰かが知っていますか?

27
BenV

失敗することはありません。質問を書き出すとすぐに、答えがわかります。

エラーは、これがネストされたリソース(構成オブジェクトがサイトオブジェクト内にネストされている)であるため、名前にこれを反映する必要があることを意味します。したがって、configの代わりに、名前はmysite/configdependsOnセクションも追加する必要がありました。正常に検証されたテンプレートは次のとおりです。

"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

「セグメント長が正しくありません」というエラーメッセージは、英語以外のネイティブでは理解が難しいため、わかりやすい英語/ jsonで説明があります。たとえば、タイプMicrosoft.Network/trafficManagerProfilesリソースのリソースがあり、何らかの理由でネストを定義する必要があるタイプMicrosoft.Network/trafficManagerProfiles/ExternalEndpointsを別のリソースとして持つリソース。

ネストされたリソースにはparent_resource_name/nested_res_nameという名前が必要です

正しい(簡略化された)スキーマは次のとおりです。

{
  "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
  ],
   ...
}

pS 3番目のリソースの数に基づいてネストされたリソースを動的に生成する必要がある場合は、この質問にも興味があるかもしれません。 ARMテンプレートでTraffic Managerエンドポイントを動的に生成するにはどうすればよいですか?

4
Putnik

私は同じ問題にぶつかりましたが、他の回答はどちらもうまくいきませんでした。実際には、他の回答が示すよりも少し多いことがわかります。まず、ルートレベルのリソースの場合、 ドキュメントで指定 でなければなりません。

...リソースタイプよりも名前のセグメントが1つ少ない

言い換えれば、あなたが作成している場合:

"type": "Microsoft.Web/sites"

次に、名前にはタイプよりも1つ少ないセグメントが必要であるため、この例では名前に単一のセグメントのみを使用できます。

"name": "MySite"

ネストされたリソースのルールは次のとおりです。

タイプと名前が同じ数のセグメントを持っている

ただし、これは、ネストされたリソースのタイプを短くすることを前提としています。タイプ「Microsoft.Web/sites/config」をタイプ「Microsoft.Web/sites」の親内にネストされたリソースとして作成し、ネストされたリソースに対して以下を指定します。

"type": "config"

したがって、ここでは単一のセグメント名のみを指定することもできます。例:

"name": "MyConfig"

それをまとめると、次のようになります。

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

一方、ネストされたリソースで完全なタイプ名を指定する場合(承認された回答に示されているように)、タイプよりも名前のセグメントが1つ少ないというルート命名規則に頼る必要があります。あなたが持っている上記のものを変換する:

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