使用 IPv6 前端部署 Azure 应用程序网关 - ARM 模板

Azure 资源管理器模板是一个 JavaScript 对象表示法(JSON)文件,用于定义项目的基础结构和配置。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。

如果你的环境满足先决条件,并且你熟悉如何使用 ARM 模板,请选择“部署到 Azure”按钮。 模板将在 Azure 门户中打开。

用于将资源管理器模板部署到 Azure 的按钮。

重要

应用程序网关 IPv6 前端现已正式发布。

先决条件

查看模板

此模板创建了一项简单设置,其中包含一个双堆栈公共前端 IP、一个在应用程序网关上托管单个站点的基本侦听器、一项基本的请求传递规则,以及两个位于后端池的虚拟机。

注释

应用程序网关的双堆栈前端最多支持四个前端 IP 地址:两个 IPv4 地址(公共和专用)和两个 IPv6 地址(公共和专用)。

本快速入门中使用的模板来自 Azure 快速入门模板

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
		"adminUsername": {
            "type": "String",
            "metadata": {
                "description": "Admin username for the backend servers"
            }
        },
        "adminPassword": {
            "type": "SecureString",
            "metadata": {
                "description": "Password for the admin account on the backend servers"
            }
        },
		"utcTime": {
            "defaultValue": "[utcNow('MMddHHmmss')]",
            "type": "String"
        },
        "location": {
            "defaultValue": "[resourceGroup().location]",
            "type": "String",
            "metadata": {
                "description": "Location for all resources."
            }
        },
        "vmSize": {
            "defaultValue": "Standard_DS1_v2",
            "type": "String",
            "metadata": {
                "description": "Size of the virtual machine."
            }
        },
        "publicIPAddresses_appgwipv4_name": {
            "defaultValue": "[format('{0}{1}', 'dualipv4', parameters('utcTime'))]",
            "type": "String"
        },
        "publicIPAddresses_appgwipv6_name": {
            "defaultValue": "[format('{0}{1}', 'dualipv6', parameters('utcTime'))]",
            "type": "String"
        }
    },
    "variables": {
        "virtualMachineName": "myVM",
        "virtualNetworkName": "[format('{0}{1}', 'myVNet', parameters('utcTime'))]",
        "networkInterfaceName": "net-int",
        "ipconfigName": "ipconfig",
        "ipconfigNameV6": "ipconfigV6",
        "publicIPAddressName": "[format('{0}{1}', 'public_ip', parameters('utcTime'))]",
        "publicIPAddressNamev6": "[format('{0}{1}', 'public_ipv6', parameters('utcTime'))]",
        "nsgName": "vm-nsg",
        "applicationGateWayName": "[format('{0}{1}', 'myAppGatewayipv6', parameters('utcTime'))]",
        "virtualNetworkPrefix": [
            "10.0.0.0/16",
            "ace:cab:deca::/48"
        ],
        "subnetPrefix": [
            "10.0.0.0/24",
            "ace:cab:deca::/64"
        ],
        "backendSubnetPrefix": [
            "10.0.1.0/24",
            "ace:cab:deca:10::/64"
        ]
    },
    "resources": [
        {
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2022-07-01",
            "name": "[format('{0}{1}', variables('nsgName'), add(range(0, 2)[copyIndex()], 1))]",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "RDP",
                        "properties": {
                            "protocol": "Tcp",
                            "sourcePortRange": "*",
                            "destinationPortRange": "3389",
                            "sourceAddressPrefix": "*",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 300,
                            "direction": "Inbound"
                        }
                    }
                ]
            },
            "copy": {
                "name": "nsg",
                "count": "[length(range(0, 2))]"
            }
        },
        {
            "type": "Microsoft.Network/publicIPAddresses",
            "apiVersion": "2022-07-01",
            "name": "[format('{0}{1}', variables('publicIPAddressName'), range(0, 3)[copyIndex()])]",
            "location": "[parameters('location')]",
            "sku": {
                "name": "Standard"
            },
            "properties": {
                "publicIPAddressVersion": "IPv4",
                "publicIPAllocationMethod": "Static",
                "idleTimeoutInMinutes": 4,
                "dnsSettings": {
                    "domainNameLabel": "[format('{0}{1}', parameters('publicIPAddresses_appgwipv4_name'), range(0, 3)[copyIndex()])]",
                    "fqdn": "[concat(format('{0}{1}', parameters('publicIPAddresses_appgwipv4_name'), range(0, 3)[copyIndex()]), '.chinanorth2.chinacloudapp.cn')]"
                }
            },
            "copy": {
                "name": "publicIPAddress",
                "count": "[length(range(0, 3))]"
            }
        },
        {
            "type": "Microsoft.Network/publicIPAddresses",
            "apiVersion": "2022-07-01",
            "name": "[format('{0}{1}', variables('publicIPAddressNamev6'), range(0, 3)[copyIndex()])]",
            "location": "[parameters('location')]",
            "sku": {
                "name": "Standard"
            },
            "properties": {
                "publicIPAddressVersion": "IPv6",
                "publicIPAllocationMethod": "Static",
                "idleTimeoutInMinutes": 4,
                "dnsSettings": {
                    "domainNameLabel": "[format('{0}{1}', parameters('publicIPAddresses_appgwipv6_name'), range(0, 3)[copyIndex()])]",
                    "fqdn": "[concat(format('{0}{1}', parameters('publicIPAddresses_appgwipv6_name'), range(0, 3)[copyIndex()]), '.chinanorth2.chinacloudapp.cn')]"
                }
            },
            "copy": {
                "name": "publicIPAddress",
                "count": "[length(range(0, 3))]"
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2022-07-01",
            "name": "[variables('virtualNetworkName')]",
            "location": "[parameters('location')]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": "[variables('virtualNetworkPrefix')]"
                },
                "subnets": [
                    {
                        "name": "myAGSubnet",
                        "properties": {
                            "addressPrefixes": "[variables('subnetPrefix')]",
                            "privateEndpointNetworkPolicies": "Enabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        }
                    },
                    {
                        "name": "myBackendSubnet",
                        "properties": {
                            "addressPrefixes": "[variables('backendSubnetPrefix')]",
                            "privateEndpointNetworkPolicies": "Enabled",
                            "privateLinkServiceNetworkPolicies": "Enabled"
                        }
                    }
                ],
                "enableDdosProtection": false,
                "enableVmProtection": false
            }
        },
        {
            "type": "Microsoft.Compute/virtualMachines",
            "apiVersion": "2022-11-01",
            "name": "[format('{0}{1}', variables('virtualMachineName'), add(range(0, 2)[copyIndex()], 1))]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "networkInterface"
            ],
            "properties": {
                "hardwareProfile": {
                    "vmSize": "[parameters('vmSize')]"
                },
                "storageProfile": {
                    "imageReference": {
                        "publisher": "MicrosoftWindowsServer",
                        "offer": "WindowsServer",
                        "sku": "2016-Datacenter",
                        "version": "latest"
                    },
                    "osDisk": {
                        "osType": "Windows",
                        "createOption": "FromImage",
                        "caching": "ReadWrite",
                        "managedDisk": {
                            "storageAccountType": "StandardSSD_LRS"
                        },
                        "diskSizeGB": 127
                    }
                },
                "osProfile": {
                    "computerName": "[format('{0}{1}', variables('virtualMachineName'), add(range(0, 2)[copyIndex()], 1))]",
                    "adminUsername": "[parameters('adminUsername')]",
                    "adminPassword": "[parameters('adminPassword')]",
                    "windowsConfiguration": {
                        "provisionVMAgent": true,
                        "enableAutomaticUpdates": true
                    },
                    "allowExtensionOperations": true
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', format('{0}{1}', variables('networkInterfaceName'), add(range(0, 2)[copyIndex()], 1)))]"
                        }
                    ]
                }
            },
            "copy": {
                "name": "virtualMachine",
                "count": "[length(range(0, 2))]"
            }
        },
        {
            "type": "Microsoft.Compute/virtualMachines/extensions",
            "apiVersion": "2022-11-01",
            "name": "[format('{0}{1}/IIS', variables('virtualMachineName'), add(range(0, 2)[copyIndex()], 1))]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "virtualMachine"
            ],
            "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Compute",
                "type": "CustomScriptExtension",
                "typeHandlerVersion": "1.4",
                "settings": {
                    "commandToExecute": "powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"
                }
            },
            "copy": {
                "name": "virtualMachine_IIS",
                "count": "[length(range(0, 2))]"
            }
        },
        {
            "type": "Microsoft.Network/applicationGateways",
            "apiVersion": "2022-07-01",
            "name": "[variables('applicationGateWayName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}{1}', variables('publicIPAddressName'), range(0, 3)[0]))]",
                "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}{1}', variables('publicIPAddressNamev6'), range(0, 3)[0]))]",
                "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]"
            ],
            "properties": {
                "sku": {
                    "name": "Standard_v2",
                    "tier": "Standard_v2"
                },
                "gatewayIPConfigurations": [
                    {
                        "name": "appGatewayIpConfig",
                        "properties": {
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), 'myAGSubnet')]"
                            }
                        }
                    }
                ],
                "frontendIPConfigurations": [
                    {
                        "name": "appGwPublicFrontendIp",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}0', variables('publicIPAddressName')))]"
                            }
                        }
                    },
                    {
                        "name": "appGwIPv6PublicFrontendIp",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}0', variables('publicIPAddressNamev6')))]"
                            }
                        }
                    }
                ],
                "frontendPorts": [
                    {
                        "name": "port_80",
                        "properties": {
                            "port": 80
                        }
                    },
                    {
                        "name": "port_81",
                        "properties": {
                            "port": 81
                        }
                    }
                ],
                "backendAddressPools": [
                    {
                        "name": "myBackendPool1",
                        "properties": {}
                    },
                    {
                        "name": "myBackendPool2",
                        "properties": {}
                    }
                ],
                "backendHttpSettingsCollection": [
                    {
                        "name": "myHTTPSetting1",
                        "properties": {
                            "port": 80,
                            "protocol": "Http",
                            "cookieBasedAffinity": "Disabled",
                            "pickHostNameFromBackendAddress": false,
                            "requestTimeout": 20
                        }
                    },
                    {
                        "name": "myHTTPSetting2",
                        "properties": {
                            "port": 80,
                            "protocol": "Http",
                            "cookieBasedAffinity": "Disabled",
                            "pickHostNameFromBackendAddress": false,
                            "requestTimeout": 20
                        }
                    }
                ],
                "httpListeners": [
                    {
                        "name": "myListener",
                        "properties": {
                            "frontendIPConfiguration": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/frontendIPConfigurations', variables('applicationGateWayName'), 'appGwPublicFrontendIp')]"
                            },
                            "frontendPort": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/frontendPorts', variables('applicationGateWayName'), 'port_80')]"
                            },
                            "protocol": "Http",
                            "requireServerNameIndication": false
                        }
                    },
                    {
                        "name": "myListenerIpv6",
                        "properties": {
                            "frontendIPConfiguration": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/frontendIPConfigurations', variables('applicationGateWayName'), 'appGwIPv6PublicFrontendIp')]"
                            },
                            "frontendPort": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/frontendPorts', variables('applicationGateWayName'), 'port_80')]"
                            },
                            "protocol": "Http",
                            "requireServerNameIndication": false
                        }
                    }
                ],
                "requestRoutingRules": [
                    {
                        "name": "myRoutingRule1",
                        "properties": {
                            "ruleType": "Basic",
                            "httpListener": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/httpListeners', variables('applicationGateWayName'), 'myListener')]"
                            },
							"priority": 10,
                            "backendAddressPool": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/backendAddressPools', variables('applicationGateWayName'), 'myBackendPool1')]"
                            },
                            "backendHttpSettings": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/backendHttpSettingsCollection', variables('applicationGateWayName'), 'myHTTPSetting1')]"
                            }
                        }
                    },
                    {
                        "name": "myRoutingRule2",
                        "properties": {
                            "ruleType": "Basic",
                            "httpListener": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/httpListeners', variables('applicationGateWayName'), 'myListenerIpv6')]"
                            },
							"priority": 20,
                            "backendAddressPool": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/backendAddressPools', variables('applicationGateWayName'), 'myBackendPool2')]"
                            },
                            "backendHttpSettings": {
                                "id": "[resourceId('Microsoft.Network/applicationGateways/backendHttpSettingsCollection', variables('applicationGateWayName'), 'myHTTPSetting2')]"
                            }
                        }
                    }
                ],
                "enableHttp2": false,
                "autoscaleConfiguration": {
                    "minCapacity": 0,
                    "maxCapacity": 10
                }
            }
        },
        {
            "type": "Microsoft.Network/networkInterfaces",
            "apiVersion": "2022-07-01",
            "name": "[format('{0}{1}', variables('networkInterfaceName'), add(range(0, 2)[copyIndex()], 1))]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/applicationGateways', variables('applicationGateWayName'))]",
                "nsg",
                "publicIPAddress"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "[format('{0}{1}', variables('ipconfigName'), add(range(0, 2)[copyIndex()], 1))]",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}{1}', variables('publicIPAddressName'), add(range(0, 2)[copyIndex()], 1)))]"
                            },
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), 'myBackendSubnet')]"
                            },
                            "primary": true,
                            "privateIPAddressVersion": "IPv4",
                            "applicationGatewayBackendAddressPools": [
                                {
                                    "id": "[resourceId('Microsoft.Network/applicationGateways/backendAddressPools', variables('applicationGateWayName'), 'myBackendPool1')]"
                                },
                                {
                                    "id": "[resourceId('Microsoft.Network/applicationGateways/backendAddressPools', variables('applicationGateWayName'), 'myBackendPool2')]"
                                }
                            ]
                        }
                    },
                    {
                        "name": "[format('{0}{1}', variables('ipconfigNameV6'), add(range(0, 2)[copyIndex()], 1))]",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', format('{0}{1}', variables('publicIPAddressNamev6'), add(range(0, 2)[copyIndex()], 1)))]"
                            },
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), 'myBackendSubnet')]"
                            },
                            "privateIPAddressVersion": "IPv6"
                        }
                    }
                ],
                "enableAcceleratedNetworking": false,
                "enableIPForwarding": false,
                "networkSecurityGroup": {
                    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', format('{0}{1}', variables('nsgName'), add(range(0, 2)[copyIndex()], 1)))]"
                }
            },
            "copy": {
                "name": "networkInterface",
                "count": "[length(range(0, 2))]"
            }
        }
    ]
}

模板中定义了多个 Azure 资源:

部署模板

将 ARM 模板部署到 Azure:

  1. 选择“部署到 Azure”,登录到 Azure 并打开模板。 该模板在运行 IIS 的后端池中创建应用程序网关、网络基础结构和两个虚拟机。

    用于将资源管理器模板部署到 Azure 的按钮。

  2. 选择或创建资源组,键入虚拟机“管理员用户名”和“管理员密码”。

    屏幕截图为创建新的应用程序网关:基本信息。

    注释

    选择与资源组相同的区域。 如果该区域不支持标准 DS1 v2 虚拟机 SKU,则不会显示此 SKU,并且必须选择其他大小。

  3. 选择“查看 + 创建”,然后选择“创建”。

    部署可能需要 20 分钟或更长时间才能完成。

验证部署

虽然不需 IIS 即可创建应用程序网关,但使用它可以验证 Azure 是否已成功创建应用程序网关。

使用 IIS 测试应用程序网关:

  1. 在“概述”页面上找到应用程序网关的公共 IP 地址和 DNS 名称。 在以下示例中,DNS 名称 dualipv611061903310.chinanorth2.chinacloudapp.cn

    显示应用程序网关的公共 IP 地址和 DNS 名称的屏幕截图。

  2. 复制公共 IP 地址或 DNS 名称,然后将其粘贴到浏览器的地址栏中,以便浏览该 IP 地址。

  3. 检查响应。 有效响应验证应用程序网关是否已成功创建,以及是否能够成功连接后端。

    显示应用程序网关成功测试的屏幕截图。

    多次刷新浏览器就会看到与 myVM1 和 myVM2 的连接。

清理资源

如果不再需要通过应用程序网关创建的资源,请删除资源组。 此过程会删除应用程序网关和所有相关的资源。

若要删除资源组,请调用 Remove-AzResourceGroup cmdlet:

Remove-AzResourceGroup -Name <your resource group name>

后续步骤