programing

Azure 웹 사이트 리소스 템플릿 오류

bestprogram 2023. 5. 27. 12:01

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