你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Bicep 创建专用终结点

本快速入门中将使用 Bicep 创建专用终结点。

Bicep 是一种特定于域的语言 (DSL),使用声明性语法来部署 Azure 资源。 它提供简明的语法、可靠的类型安全性以及对代码重用的支持。 Bicep 会针对你的 Azure 基础结构即代码解决方案提供最佳创作体验。

也可以使用 Azure 门户Azure PowerShellAzure CLIAzure 资源管理器模板创建专用终结点。

在专用终结点快速入门中创建的资源的示意图。

先决条件

需要一个具有活动订阅的 Azure 帐户。 如果还没有 Azure 帐户,可以免费创建帐户

查阅 Bicep 文件

该 Bicep 文件为 Azure SQL 数据库的实例创建专用终结点。

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

@description('The administrator username of the SQL logical server')
param sqlAdministratorLogin string

@description('The administrator password of the SQL logical server.')
@secure()
param sqlAdministratorLoginPassword string

@description('Username for the Virtual Machine.')
param vmAdminUsername string

@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)')
@secure()
param vmAdminPassword string

@description('The size of the VM')
param VmSize string = 'Standard_D2_v3'

@description('Location for all resources.')
param location string = resourceGroup().location

var vnetName = 'myVirtualNetwork'
var vnetAddressPrefix = '10.0.0.0/16'
var subnet1Prefix = '10.0.0.0/24'
var subnet1Name = 'mySubnet'
var sqlServerName = 'sqlserver${uniqueString(resourceGroup().id)}'
var databaseName = '${sqlServerName}/sample-db'
var privateEndpointName = 'myPrivateEndpoint'
var privateDnsZoneName = 'privatelink${environment().suffixes.sqlServerHostname}'
var pvtEndpointDnsGroupName = '${privateEndpointName}/mydnsgroupname'
var vmName = take('myVm${uniqueString(resourceGroup().id)}', 15)
var publicIpAddressName = '${vmName}PublicIP'
var networkInterfaceName = '${vmName}NetInt'
var osDiskType = 'StandardSSD_LRS'

resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
  name: sqlServerName
  location: location
  tags: {
    displayName: sqlServerName
  }
  properties: {
    administratorLogin: sqlAdministratorLogin
    administratorLoginPassword: sqlAdministratorLoginPassword
    version: '12.0'
    publicNetworkAccess: 'Disabled'
  }
}

resource database 'Microsoft.Sql/servers/databases@2021-11-01-preview' = {
  name: databaseName
  location: location
  sku: {
    name: 'Basic'
    tier: 'Basic'
    capacity: 5
  }
  tags: {
    displayName: databaseName
  }
  properties: {
    collation: 'SQL_Latin1_General_CP1_CI_AS'
    maxSizeBytes: 104857600
    sampleName: 'AdventureWorksLT'
  }
  dependsOn: [
    sqlServer
  ]
}

resource vnet 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        vnetAddressPrefix
      ]
    }
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
  parent: vnet
  name: subnet1Name
  properties: {
    addressPrefix: subnet1Prefix
    privateEndpointNetworkPolicies: 'Disabled'
  }
}

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2021-05-01' = {
  name: privateEndpointName
  location: location
  properties: {
    subnet: {
      id: subnet.id
    }
    privateLinkServiceConnections: [
      {
        name: privateEndpointName
        properties: {
          privateLinkServiceId: sqlServer.id
          groupIds: [
            'sqlServer'
          ]
        }
      }
    ]
  }
  dependsOn: [
    vnet
  ]
}

resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
  name: privateDnsZoneName
  location: 'global'
  properties: {}
  dependsOn: [
    vnet
  ]
}

resource privateDnsZoneLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
  parent: privateDnsZone
  name: '${privateDnsZoneName}-link'
  location: 'global'
  properties: {
    registrationEnabled: false
    virtualNetwork: {
      id: vnet.id
    }
  }
}

resource pvtEndpointDnsGroup 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-05-01' = {
  name: pvtEndpointDnsGroupName
  properties: {
    privateDnsZoneConfigs: [
      {
        name: 'config1'
        properties: {
          privateDnsZoneId: privateDnsZone.id
        }
      }
    ]
  }
  dependsOn: [
    privateEndpoint
  ]
}

resource publicIpAddress 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
  name: publicIpAddressName
  location: location
  tags: {
    displayName: publicIpAddressName
  }
  properties: {
    publicIPAllocationMethod: 'Dynamic'
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
  name: networkInterfaceName
  location: location
  tags: {
    displayName: networkInterfaceName
  }
  properties: {
    ipConfigurations: [
      {
        name: 'ipConfig1'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIpAddress.id
          }
          subnet: {
            id: subnet.id
          }
        }
      }
    ]
  }
  dependsOn: [
    vnet
  ]
}

resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
  name: vmName
  location: location
  tags: {
    displayName: vmName
  }
  properties: {
    hardwareProfile: {
      vmSize: VmSize
    }
    osProfile: {
      computerName: vmName
      adminUsername: vmAdminUsername
      adminPassword: vmAdminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: 'MicrosoftWindowsServer'
        offer: 'WindowsServer'
        sku: '2019-Datacenter'
        version: 'latest'
      }
      osDisk: {
        name: '${vmName}OsDisk'
        caching: 'ReadWrite'
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: osDiskType
        }
        diskSizeGB: 128
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
  }
}

Bicep 文件定义了多个 Azure 资源:

部署 Bicep 文件

  1. 将该 Bicep 文件另存为本地计算机上的 main.bicep。

  2. 使用 Azure CLI 或 Azure PowerShell 来部署该 Bicep 文件。

    az group create --name exampleRG --location eastus
    az deployment group create --resource-group exampleRG --template-file main.bicep --parameters sqlAdministratorLogin=<admin-login> vmAdminUsername=<vm-login>
    

    注意

    <admin-user> 替换为 SQL 逻辑服务器的用户名。 将 <admin-user> 替换为虚拟机的用户名。 系统会提示输入 sqlAdministratorLoginPassword。 系统还会提示输入 vmAdminPassword,该字符串长度必须至少为 12 个字符,并且至少包含一个小写和大写字符和一个特殊字符。

    部署完成后,应会看到一条指出部署成功的消息。

验证部署

注意

Bicep 文件为虚拟机 myVm{uniqueid} 资源和 SQL 数据库 sqlserver{uniqueid} 资源生成唯一名称。 用生成的值替换 {uniqueid}。

从 Internet 连接到 VM

通过执行以下操作,从 Internet 连接到 VM myVm{uniqueid}:

  1. 在门户的搜索栏中,输入 myVm{uniqueid}。

  2. 选择“连接”。 “连接到虚拟机”随即打开。

  3. 选择“下载 RDP 文件”。 Azure 会创建远程桌面协议 (RDP) 文件,并将其下载到计算机。

  4. 打开下载的 RDP 文件。

    a. 出现提示时,选择“连接” 。
    b. 输入创建 VM 时指定的用户名和密码。

    备注

    你可能需要选择“更多选择”>“使用其他帐户”,以指定在创建 VM 时输入的凭据。

  5. 选择“确定”。

    你可能会在登录过程中收到证书警告。 如果收到证书警告,选择“确定”或“继续” 。

  6. VM 桌面出现后,将其最小化以返回到本地桌面。

以私密方式从 VM 访问 SQL 数据库服务器

要使用专用终结点从 VM 连接到 SQL 数据库服务器,请执行以下操作:

  1. 在 myVM{uniqueid} 的远程桌面中,打开 PowerShell。

  2. 运行以下命令:

    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
    
  3. 安装 SQL Server Management Studio。

  4. 在“连接到服务器”窗格中,执行以下操作:

    • 选择服务器类型“数据库引擎”。
    • 选择服务器名称“sqlserver{uniqueid}.database.windows.net”。
    • 对于“用户名”,请输入先前提供的用户名。
    • 对于“密码”,请输入之前提供的密码。
    • 对于“记住密码”,选择“是”。
  5. 选择“连接”。

  6. 在左窗格中,选择“数据库”。 (可选)创建或查询 sample-db 中的信息。

  7. 关闭与 myVm{uniqueid} 的远程桌面连接。

清理资源

如果不再需要使用专用链接服务创建的资源,请删除资源组。 这会删除专用链接服务和所有相关资源。

az group delete --name exampleRG

后续步骤

要详细了解支持专用终结点的服务,请参阅: