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

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

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

也可以使用 Azure 门户、Azure PowerShell、Azure CLI 或 Azure 资源管理器模板创建专用终结点。

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

先决条件

需要一个具有活动订阅的 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 chinaeast2
    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.chinacloudapi.cn 

    你将收到如下所示的消息:

      Server:  UnKnown
      Address:  168.63.129.16
      Non-authoritative answer:
      Name:    sqlserver.privatelink.database.chinacloudapi.cn
      Address:  10.0.0.5
      Aliases:  sqlserver.database.chinacloudapi.cn
    
  3. 安装 SQL Server Management Studio。

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

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

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

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

清理资源

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

az group delete --name exampleRG

后续步骤

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