Краткое руководство. Создание частной конечной точки с использованием Bicep

Это краткое руководство описывает, как создать частную конечную точку на Bicep.

Bicep — это предметно-ориентированный язык (DSL), который использует декларативный синтаксис для развертывания ресурсов Azure. Он обеспечивает краткий синтаксис, надежную безопасность типов и поддержку повторного использования кода. Bicep предлагает лучшие возможности для разработки решений Azure типа "инфраструктура как код".

Вы также можете создать частную конечную точку на портале Azure, с помощью Azure PowerShell, Azure CLI или шаблона Azure Resource Manager

Diagram of resources created in private endpoint quickstart.

Необходимые компоненты

Вам потребуется учетная запись Azure с активной подпиской. Если у вас еще нет учетной записи Azure, создайте ее бесплатно.

Проверка BICEP-файла

Этот файл Bicep позволяет создать частную конечную точку для экземпляра базы данных SQL Azure.

Файл 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. Разверните файл Bicep с помощью Azure CLI или Azure PowerShell.

    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-login> именем пользователя логического сервера SQL. Замените <vm-login> именем пользователя виртуальной машины. Появится запрос на ввод sqlAdministratorLoginPassword. Вам также будет предложено ввести пароль vmAdminPassword, который быть не менее 12 символов в длину и содержать по крайней мере одну прописную, одну строчную букву и один специальный знак.

    После завершения развертывания должно отобразиться сообщение о том, что развертывание успешно выполнено.

Проверка развертывания

Примечание.

Файл Bicep позволяет создать уникальное имя для ресурса виртуальной машины myVm{uniqueid} и для ресурса Базы данных SQL sqlserver{uniqueid}. Подставьте созданное значение вместо {uniqueid}.

Подключение к виртуальной машине из Интернета

Подключитесь к виртуальной машине myVm{uniqueid} из Интернета, выполнив следующие действия:

  1. В строке поиска на портале Azure введите myVm{uniqueid}.

  2. Нажмите Подключиться. Откроется страница Подключение к виртуальной машине.

  3. Выберите Скачать RDP-файл. Azure создаст и скачает на ваш компьютер файл протокола удаленного рабочего стола (RDP).

  4. Откройте загруженный RDP-файл.

    a. При появлении запроса выберите Подключиться.
    b. Введите имя пользователя и пароль, которые вы указали при создании виртуальной машины.

    Примечание.

    Возможно, потребуется выбрать элементы Дополнительные варианты>Использовать другую учетную запись, чтобы указать учетные данные, введенные при создании виртуальной машины.

  5. Нажмите ОК.

    При входе в систему может появиться предупреждение о сертификате. В таком случае выберите Да или Продолжить.

  6. Когда откроется рабочий стол виртуальной машины, сверните его, чтобы вернуться на локальный рабочий стол.

Частный доступ к серверу Базы данных SQL с виртуальной машины

Чтобы подключиться к серверу Базы данных SQL с виртуальной машины с помощью частной конечной точки, выполните следующие действия.

  1. Откройте PowerShell на удаленном рабочем столе виртуальной машины myVm{uniqueid}.

  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

Следующие шаги

Дополнительные сведения о службах, поддерживающих частную конечную точку, см. в следующей статье: