你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:使用 ARM 模板创建专用终结点
在本快速入门中,将使用 Azure 资源管理器模板(ARM 模板)创建专用终结点。
Azure 资源管理器模板是定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。
你还可以使用 Azure 门户、Azure PowerShell 或 Azure CLI 创建专用终结点。
如果你的环境满足先决条件,而且你熟悉如何使用 ARM 模板,请选择此处的“部署到 Azure”按钮。 在 Azure 门户中打开 ARM 模板。
先决条件
需要一个具有活动订阅的 Azure 帐户。 如果还没有 Azure 帐户,可以免费创建帐户。
查看模板
该模板为 Azure SQL 数据库的实例创建专用终结点。
本快速入门中使用的模板来自 Azure 快速入门模板。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.5.6.12127",
"templateHash": "14846974543330599630"
}
},
"parameters": {
"sqlAdministratorLogin": {
"type": "string",
"metadata": {
"description": "The administrator username of the SQL logical server"
}
},
"sqlAdministratorLoginPassword": {
"type": "secureString",
"metadata": {
"description": "The administrator password of the SQL logical server."
}
},
"vmAdminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"vmAdminPassword": {
"type": "secureString",
"metadata": {
"description": "Password for the Virtual Machine. The password must be at least 12 characters long and have lower case, upper characters, digit and a special character (Regex match)"
}
},
"VmSize": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "The size of the VM"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for all resources."
}
}
},
"variables": {
"vnetName": "myVirtualNetwork",
"vnetAddressPrefix": "10.0.0.0/16",
"subnet1Prefix": "10.0.0.0/24",
"subnet1Name": "mySubnet",
"sqlServerName": "[format('sqlserver{0}', uniqueString(resourceGroup().id))]",
"databaseName": "[format('{0}/sample-db', variables('sqlServerName'))]",
"privateEndpointName": "myPrivateEndpoint",
"privateDnsZoneName": "[format('privatelink{0}', environment().suffixes.sqlServerHostname)]",
"pvtEndpointDnsGroupName": "[format('{0}/mydnsgroupname', variables('privateEndpointName'))]",
"vmName": "[take(format('myVm{0}', uniqueString(resourceGroup().id)), 15)]",
"publicIpAddressName": "[format('{0}PublicIP', variables('vmName'))]",
"networkInterfaceName": "[format('{0}NetInt', variables('vmName'))]",
"osDiskType": "StandardSSD_LRS"
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2021-11-01-preview",
"name": "[variables('sqlServerName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('sqlServerName')]"
},
"properties": {
"administratorLogin": "[parameters('sqlAdministratorLogin')]",
"administratorLoginPassword": "[parameters('sqlAdministratorLoginPassword')]",
"version": "12.0",
"publicNetworkAccess": "Disabled"
}
},
{
"type": "Microsoft.Sql/servers/databases",
"apiVersion": "2021-11-01-preview",
"name": "[variables('databaseName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Basic",
"tier": "Basic",
"capacity": 5
},
"tags": {
"displayName": "[variables('databaseName')]"
},
"properties": {
"collation": "SQL_Latin1_General_CP1_CI_AS",
"maxSizeBytes": 104857600,
"sampleName": "AdventureWorksLT"
},
"dependsOn": [
"[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
]
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-05-01",
"name": "[variables('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[variables('vnetAddressPrefix')]"
]
}
}
},
{
"type": "Microsoft.Network/virtualNetworks/subnets",
"apiVersion": "2021-05-01",
"name": "[format('{0}/{1}', variables('vnetName'), variables('subnet1Name'))]",
"properties": {
"addressPrefix": "[variables('subnet1Prefix')]",
"privateEndpointNetworkPolicies": "Disabled"
},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateEndpoints",
"apiVersion": "2021-05-01",
"name": "[variables('privateEndpointName')]",
"location": "[parameters('location')]",
"properties": {
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
},
"privateLinkServiceConnections": [
{
"name": "[variables('privateEndpointName')]",
"properties": {
"privateLinkServiceId": "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
"groupIds": [
"sqlServer"
]
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateDnsZones",
"apiVersion": "2020-06-01",
"name": "[variables('privateDnsZoneName')]",
"location": "global",
"properties": {},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
"apiVersion": "2020-06-01",
"name": "[format('{0}/{1}', variables('privateDnsZoneName'), format('{0}-link', variables('privateDnsZoneName')))]",
"location": "global",
"properties": {
"registrationEnabled": false,
"virtualNetwork": {
"id": "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
"apiVersion": "2021-05-01",
"name": "[variables('pvtEndpointDnsGroupName')]",
"properties": {
"privateDnsZoneConfigs": [
{
"name": "config1",
"properties": {
"privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]"
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
"[resourceId('Microsoft.Network/privateEndpoints', variables('privateEndpointName'))]"
]
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-05-01",
"name": "[variables('publicIpAddressName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('publicIpAddressName')]"
},
"properties": {
"publicIPAllocationMethod": "Dynamic"
}
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2021-05-01",
"name": "[variables('networkInterfaceName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('networkInterfaceName')]"
},
"properties": {
"ipConfigurations": [
{
"name": "ipConfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]"
},
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
}
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
"[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
]
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-11-01",
"name": "[variables('vmName')]",
"location": "[parameters('location')]",
"tags": {
"displayName": "[variables('vmName')]"
},
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('VmSize')]"
},
"osProfile": {
"computerName": "[variables('vmName')]",
"adminUsername": "[parameters('vmAdminUsername')]",
"adminPassword": "[parameters('vmAdminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
"osDisk": {
"name": "[format('{0}OsDisk', variables('vmName'))]",
"caching": "ReadWrite",
"createOption": "FromImage",
"managedDisk": {
"storageAccountType": "[variables('osDiskType')]"
},
"diskSizeGB": 128
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
}
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
]
}
]
}
该模板定义了多个 Azure 资源:
- Microsoft.Sql/servers:带有示例数据库的 SQL 数据库实例。
- Microsoft.Sql/servers/databases:示例数据库。
- Microsoft.Network/virtualNetworks:部署专用终结点的虚拟网络。
- Microsoft.Network/privateEndpoints:用于访问 SQL 数据库实例的专用终结点。
- Microsoft.Network/privateDnsZones:用于解析专用终结点 IP 地址的区域。
- Microsoft.Network/privateDnsZones/virtualNetworkLinks
- Microsoft.Network/privateEndpoints/privateDnsZoneGroups:用于将专用终结点与专用 DNS 区域相关联的区域组。
- Microsoft.Network/publicIpAddresses:用于访问虚拟机的公共 IP 地址。
- Microsoft.Network/networkInterfaces:虚拟机的网络接口。
- Microsoft.Compute/virtualMachines:用于测试专用终结点与 SQL 数据库实例之间的连接的虚拟机。
部署模板
通过执行以下操作,将 ARM 模板部署到 Azure:
选择此处的“部署到 Azure”按钮,登录到 Azure 并打开 ARM 模板。 该模板创建专用终结点、SQL 数据库实例、网络基础结构和要验证的虚拟机。
选择你的资源组,或新建一个资源组。
输入 SQL 管理员登录名和密码。
输入虚拟机管理员用户名和密码。
阅读条款和条件声明。 如果你同意,请选择“我同意上述条款和条件”,然后选择“购买”。 部署可能需要 20 分钟或更长时间才能完成。
验证部署
注意
ARM 模板为虚拟机 myVm{uniqueid} 资源和 SQL 数据库 sqlserver{uniqueid} 资源生成唯一名称。 用生成的值替换 {uniqueid}。
从 Internet 连接到 VM
通过执行以下操作,从 Internet 连接到 VM myVm{uniqueid}:
在门户的搜索栏中,输入 myVm{uniqueid}。
选择“连接”。 “连接到虚拟机”随即打开。
选择“下载 RDP 文件”。 Azure 会创建远程桌面协议 (RDP) 文件,并将其下载到计算机。
打开下载的 RDP 文件。
a. 出现提示时,选择“连接” 。
b. 输入创建 VM 时指定的用户名和密码。备注
你可能需要选择“更多选择”>“使用其他帐户”,以指定在创建 VM 时输入的凭据。
选择“确定”。
你可能会在登录过程中收到证书警告。 如果收到证书警告,选择“确定”或“继续” 。
VM 桌面出现后,将其最小化以返回到本地桌面。
以私密方式从 VM 访问 SQL 数据库服务器
要使用专用终结点从 VM 连接到 SQL 数据库服务器,请执行以下操作:
在 myVM{uniqueid} 的远程桌面中,打开 PowerShell。
运行以下命令:
nslookup sqlserver{uniqueid}.database.windows.net
你将收到如下所示的消息:
Server: UnKnown Address: 168.63.129.16 Non-authoritative answer: Name: sqlserver.privatelink.database.windows.net Address: 10.0.0.5 Aliases: sqlserver.database.windows.net
安装 SQL Server Management Studio。
在“连接到服务器”窗格中,执行以下操作:
- 选择服务器类型“数据库引擎”。
- 选择服务器名称“sqlserver{uniqueid}.database.windows.net”。
- 对于“用户名”,请输入先前提供的用户名。
- 对于“密码”,请输入之前提供的密码。
- 对于“记住密码”,选择“是”。
选择“连接”。
在左窗格中,选择“数据库”。 (可选)创建或查询 sample-db 中的信息。
关闭与 myVm{uniqueid} 的远程桌面连接。
清理资源
如果不再需要为专用终结点创建的资源,请删除资源组。 此操作会删除该专用终结点和所有相关资源。
要删除资源组,请运行 Remove-AzResourceGroup
cmdlet:
Remove-AzResourceGroup -Name <your resource group name>
后续步骤
要详细了解支持专用终结点的服务,请参阅: