Azure 웹 사이트 리소스 템플릿 오류
AzureResourceManager PowerShell 모듈을 사용하여 웹 사이트를 만들고 구성하려고 합니다.Visual Studio에서 생성한 템플릿 파일로 시작했는데, 이 파일은 다음을 통해 사용할 때 정상적으로 작동합니다.New-AzureResourceGroup -TemplateFile website.json
.
그래서 이제 사이트를 구성하기 위해 템플릿 파일을 수정하려고 합니다.php와 .NET Framework 버전을 설정하려고 합니다.스키마에 따라 이러한 속성은 리소스 배열의 구성 개체를 통해 설정됩니다.
제 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"
}
}
]
저는 같은 문제에 부딪혔지만 다른 답들은 저에게 효과가 없었습니다. 사실 다른 답들이 보여주는 것보다 이것에 약간 더 많은 것이 있습니다.첫째, 루트 수준 리소스의 경우 문서는 다음과 같이 지정합니다.
...이름에 리소스 유형보다 세그먼트가 하나 적습니다.
즉, 다음을 만드는 경우:
"type": "Microsoft.Web/sites"
그런 다음 이름에 유형보다 세그먼트가 하나 더 적어야 하므로 이 예에서는 세그먼트 하나만 사용할 수 있습니다.
"name": "MySite"
중첩된 리소스의 규칙은 다음과 같습니다.
유형과 이름의 세그먼트 수가 동일합니다.
그러나 이것은 "Microsoft" 유형을 만드는 것과 같이 중첩된 리소스 유형을 단축하는 것으로 가정합니다.Web/sites/config"는 "Microsoft" 유형의 상위 내에 중첩된 리소스입니다.웹/사이트" 및 중첩된 리소스에 대해 다음을 지정합니다.
"type": "config"
따라서 여기서는 단일 세그먼트 이름만 지정할 수 있습니다. 예:
"name": "MyConfig"
이 모든 것을 종합하면 다음과 같습니다.
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "config",
"name": "MyConfig"
"various other properties": ...
}
]
}
반면에 전체 유형 이름을 중첩된 리소스에 지정하는 경우(승인된 답변에 표시됨), 이름에 유형보다 세그먼트가 하나 적은 루트 명명 규칙에 의존해야 합니다!위의 내용을 변환하면 다음과 같은 이점이를 얻을 수 있습니다.
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "Microsoft.Web/sites/config",
"name": "MySite/MyConfig"
"various other properties": ...
}
]
}
영어 이외의 언어로는 '잘못된 세그먼트 길이' 오류 메시지를 이해하기 어렵기 때문에 일반 영어/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
],
...
}
p.s. 세 번째 리소스 수에 따라 동적으로 중첩된 리소스를 생성해야 하는 경우에도 이 질문에 관심이 있을 수 있습니다.ARM 템플릿에서 Traffic Manager 끝점을 동적으로 생성하려면 어떻게 해야 합니까?
Vnet 피어링과 관련하여 이런 일이 발생했습니다.Microsoft 설명서에서 이 템플릿을 사용했습니다.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
},
"variables": {
},
"resources": [
{
"apiVersion": "2016-06-01",
"type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
"name": "myVnetA/myVnetAToMyVnetB",
"location": "[resourceGroup().location]",
"properties": {
"allowVirtualNetworkAccess": true,
"allowForwardedTraffic": false,
"allowGatewayTransit": false,
"useRemoteGateways": false,
"remoteVirtualNetwork": {
"id": "/subscriptions/<subscription ID>/resourceGroups/PeeringTest/providers/Microsoft.Network/virtualNetworks/myVnetB"
}
}
}
]
}
하지만 그 후에 저는 수정했습니다.name
를 들면, 예를들면,,▁be▁to를들면,vneta-tovnetb
그리고 그것은 나에게 오류를 주었습니다.
를 하면,vneta/vnetb
▁the로서name
그것은 유효합니다.
여기서 답을 찾을 수 있습니다.하위 리소스의 경우 유형과 이름의 세그먼트 수가 동일합니다.자식의 전체 이름과 유형에는 부모 이름과 유형이 포함되므로 이 세그먼트 수는 의미가 있습니다.따라서 전체 이름에는 전체 유형보다 세그먼트가 하나 더 적습니다.
https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/error-invalid-template
언급URL : https://stackoverflow.com/questions/26766882/azure-website-resource-template-error
'programing' 카테고리의 다른 글
getopts를 사용하여 긴 명령줄 및 짧은 명령줄 옵션 처리 (0) | 2023.05.27 |
---|---|
UI 레이블에 빠르게 밑줄을 긋는 방법은 무엇입니까? (0) | 2023.05.27 |
명령이 0이 아닌 값을 반환하는 경우 셸 스크립트 중단 (0) | 2023.05.27 |
파이썬에서 다중 처리에서 "속성 오류: __exit_" 문제를 해결하는 방법은 무엇입니까? (0) | 2023.05.27 |
배열을 상수로 선언할 수 있습니까? (0) | 2023.05.27 |