Azure 资源管理器模板是一个 JavaScript 对象表示法(JSON)文件,用于定义项目的基础结构和配置。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。
如果你的环境满足先决条件,并且你熟悉如何使用 ARM 模板,请选择“部署到 Azure”按钮。 模板将在 Azure 门户中打开。
重要
应用程序网关 IPv6 前端现已正式发布。
先决条件
- 拥有有效订阅的 Azure 帐户。 创建账户。
查看模板
此模板创建了一项简单设置,其中包含一个双堆栈公共前端 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 资源:
- Microsoft.Network/applicationgateways
- Microsoft.Network/publicIPAddresses:一个用于应用程序网关,两个用于虚拟机。
- Microsoft.Network/networkSecurityGroups
- Microsoft.Network/virtualNetworks
- Microsoft.Compute/virtualMachines:两个虚拟机
- Microsoft.Network/networkInterfaces:两个用于虚拟机
- Microsoft.Compute/virtualMachine/extensions:用于配置 IIS 和网页
部署模板
将 ARM 模板部署到 Azure:
选择“部署到 Azure”,登录到 Azure 并打开模板。 该模板在运行 IIS 的后端池中创建应用程序网关、网络基础结构和两个虚拟机。
选择或创建资源组,键入虚拟机“管理员用户名”和“管理员密码”。
注释
选择与资源组相同的区域。 如果该区域不支持标准 DS1 v2 虚拟机 SKU,则不会显示此 SKU,并且必须选择其他大小。
选择“查看 + 创建”,然后选择“创建”。
部署可能需要 20 分钟或更长时间才能完成。
验证部署
虽然不需 IIS 即可创建应用程序网关,但使用它可以验证 Azure 是否已成功创建应用程序网关。
使用 IIS 测试应用程序网关:
在“概述”页面上找到应用程序网关的公共 IP 地址和 DNS 名称。 在以下示例中,DNS 名称 dualipv611061903310.chinanorth2.chinacloudapp.cn。
复制公共 IP 地址或 DNS 名称,然后将其粘贴到浏览器的地址栏中,以便浏览该 IP 地址。
检查响应。 有效响应验证应用程序网关是否已成功创建,以及是否能够成功连接后端。
多次刷新浏览器就会看到与 myVM1 和 myVM2 的连接。
清理资源
如果不再需要通过应用程序网关创建的资源,请删除资源组。 此过程会删除应用程序网关和所有相关的资源。
若要删除资源组,请调用 Remove-AzResourceGroup cmdlet:
Remove-AzResourceGroup -Name <your resource group name>