另一个资源组中的嵌套ARM模板和DependsOn

时间:2020-10-09 10:50:45

标签: azure azure-resource-manager azure-function-app

我正在尝试在ARM中创建具有VNET集成的Function App。我已经在一个主模板中使所有工作正常进行。

现在我有了一个新的要求,即VNET必须位于另一个RG中,从而与Func App RG分开,但是Func App仍然需要将VNET集成到另一个RG中的VNET。

我正在努力定义ARM模板,以便在一个RG中部署Func App,在另一个RG中部署VNET。困难的部分是如何定义它,以便Func App使用嵌套模板在同一ARM模板的另一个RG中集成到VNET中。

这是我的ARM模板:

extension PageOneViewController: UICollectionViewDelegate {
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let centerPoint = CGPoint(x: UIScreen.main.bounds.midX, y: scrollView.frame.midY)
        print(centerPoint) // Successfully prints the same center point every time scrolling stops
        let indexPath = collectionView.indexPathForItem(at: centerPoint) // Ambiguous error
        let indexPath = dayPicker.indexPathForItem(at: centerPoint) // Fatal error
    }
}

在此上,当我尝试使用az cli中的az部署组命令进行部署时,出现以下错误:

"resources": [{
        "type": "Microsoft.Resources/deployments",
        "apiVersion": "2019-10-01",
        "name": "nestedTemplate",
        "resourceGroup": "[parameters('VNETPeered_RG_Name')]",
        "subscriptionId": "0a2009c0-e2ae-4991-aa0e-5c34c141e4cb",
        "properties": {
            "mode": "Incremental",
            "template": {
                "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "parameters": {},
                "variables": {},
                "resources": [{
                        "comments": "Virtual Network for VNET integration feature in the Premium Plan for the Function App",
                        "type": "Microsoft.Network/virtualNetworks",
                        "apiVersion": "2019-11-01",
                        "name": "[variables('virtual_network_name')]",
                        "location": "[resourceGroup().location]",
                        "properties": {
                            "addressSpace": {
                                "addressPrefixes": [
                                    "[parameters('vnetAddressPrefix')]"
                                ]
                            },
                            "subnets": [{
                                    "name": "[variables('subnet_name')]",
                                    "properties": {
                                        "addressPrefix": "[parameters('subnet1Prefix')]",
                                        "serviceEndpoints": [{
                                                "service": "Microsoft.Storage",
                                                "locations": [
                                                    "[resourceGroup().location]"
                                                ]
                                            }
                                        }
                                    }]
                            }
                        }]
                }
            }
        },
        {
            "comments": "Function App to host the functions themselves. Integrates into a VNET and makes use of Azure DNS Private Zones.",
            "type": "Microsoft.Web/sites",
            "apiVersion": "2019-08-01",
            "name": "[variables('function_app_name')]",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "nestedTemplate",
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storage_account_name'))]",
                "[resourceId('Microsoft.Web/serverfarms', variables('app_service_plan_name'))]"
            ],
            "kind": "functionapp",
            "identity": {
                "type": "SystemAssigned"
            },
            "properties": {
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('app_service_plan_name'))]",
                "siteConfig": {
                    "appSettings": [{
                        "name": "APPINSIGHTS_INSTRUMENTATIONKEY",
                        "value": "[reference(variables('application_insights_resourceId'), '2018-05-01-preview').InstrumentationKey]"
                    }]
                },
                "clientAffinityEnabled": true
            },
            "resources": [{
                "type": "networkConfig",
                "apiVersion": "2019-08-01",
                "name": "virtualNetwork",
                "dependsOn": [
                    "[resourceId('Microsoft.Web/sites', variables('function_app_name'))]"
                ],
                "properties": {
                    "subnetResourceId": "[reference(resourceId('RG-FunctionsGroup','Microsoft.Network/virtualNetworks/subnets', 'vn-MY-VNET', 'sn-MY-SUBNET'),'2020-05-01')]",
                    "isSwift": true
                }
            }]
        ]
    }

2 个答案:

答案 0 :(得分:1)

reference()将起作用,但是TLDR;有点重量级

https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource#resourceid

在这种情况下,您只需

。要“引用” ARM中的任何资源,您将使用resourceId-有一些功能可以帮助您,但是如果您了解resourceId的基础知识,那么它确实会有所帮助,在此处进行了总结:

https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource#return-value-6

如果您希望将resourceId分配给同一部署(与同一模板不同)中的资源,则可以使用简写版本

resourceId({namespace/resourceType}, {resourceName})

如果它在另一个RG中,则需要添加RG参数,如果它在另一个子目录中,则也需要添加它。我无法确定您的代码段,但看来您需要做的就是这个(假设vnet和fn应用程序位于同一订阅中)

"subnetResourceId": "[resourceId(parameters('VNETPeered_RG_Name'), 'Microsoft.Network/virtualNetworks/subnets', variables('virtual_network_name'), variables('subnet_name'))]"

有帮助吗?

答案 1 :(得分:1)

您的问题出在代码的这一部分:

 "properties": {
                "subnetResourceId": "[reference(resourceId('RG-FunctionsGroup','Microsoft.Network/virtualNetworks/subnets', 'vn-MY-VNET', 'sn-MY-SUBNET'),'2020-05-01')]",
                "isSwift": true
            }

您指向的子网具有错误的资源组。更改部署vnet和子网的资源组。

 "properties": {
                "subnetResourceId": "[reference(resourceId(parameters('VNETPeered_RG_Name'),'Microsoft.Network/virtualNetworks/subnets', variables('virtual_network_name'), variables('subnet_name')),'2020-05-01')]",
                "isSwift": true
            }