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'.
これに関するドキュメントは見つかりません。このエラーの意味、または私が間違っていることを誰かが知っていますか?
失敗することはありません。質問を書き出すとすぐに、答えがわかります。
エラーは、これがネストされたリソース(構成オブジェクトがサイトオブジェクト内にネストされている)であるため、名前にこれを反映する必要があることを意味します。したがって、config
の代わりに、名前はmysite/config
。 dependsOn
セクションも追加する必要がありました。正常に検証されたテンプレートは次のとおりです。
"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"
}
}
]
「セグメント長が正しくありません」というエラーメッセージは、英語以外のネイティブでは理解が難しいため、わかりやすい英語/ 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エンドポイントを動的に生成するにはどうすればよいですか?
私は同じ問題にぶつかりましたが、他の回答はどちらもうまくいきませんでした。実際には、他の回答が示すよりも少し多いことがわかります。まず、ルートレベルのリソースの場合、 ドキュメントで指定 でなければなりません。
...リソースタイプよりも名前のセグメントが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": ...
}
]
}