빠른 시작: Bicep을 사용하여 프라이빗 엔드포인트 만들기

이 빠른 시작에서는 Bicep을 사용하여 프라이빗 엔드포인트를 만듭니다.

Bicep은 선언적 구문을 사용하여 Azure 리소스를 배포하는 DSL(도메인 특정 언어)입니다. 간결한 구문, 신뢰할 수 있는 형식 안전성 및 코드 다시 사용에 대한 지원을 제공합니다. Bicep은 Azure에서 코드형 인프라 솔루션에 대한 최고의 제작 환경을 제공합니다.

Azure Portal, Azure PowerShell, Azure CLI 또는 Azure Resource Manager 템플릿을 사용하여 프라이빗 엔드포인트를 만들 수도 있습니다.

프라이빗 엔드포인트 빠른 시작에서 만들어진 리소스의 다이어그램.

필수 조건

활성 구독이 있는 Azure 계정이 필요합니다. Azure 계정이 아직 없는 경우 무료로 계정을 만듭니다.

Bicep 파일 검토

이 Bicep 파일은 Azure SQL Database 인스턴스에 대한 프라이빗 엔드포인트를 만듭니다.

이 빠른 시작에서 사용하는 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-login>을 SQL 논리 서버의 사용자 이름으로 바꿉니다. <vm-login>을 가상 머신의 사용자 이름으로 바꿉니다. sqlAdministratorLoginPassword를 입력하라는 메시지가 표시됩니다. 또한 vmAdminPassword를 입력하라는 메시지도 표시됩니다. 이 암호는 길이가 12자 이상이어야 하며 소문자와 대문자 및 특수 문자가 하나 이상 포함되어야 합니다.

    배포가 완료되면 배포에 성공했음을 나타내는 메시지가 표시됩니다.

배포 유효성 검사

참고 항목

Bicep 파일은 가상 머신 myVm{uniqueid} 리소스 및 SQL Database sqlserver{uniqueid} 리소스에 대한 고유한 이름을 생성합니다. {uniqueid}에 대해 생성된 값으로 대체합니다.

인터넷에서 VM에 연결

다음을 수행하여 인터넷에서 VM myVm{uniqueid}에 연결합니다.

  1. Azure Portal 검색 창에 myVm{uniqueid}를 입력합니다.

  2. 연결을 선택합니다. 가상 머신에 연결이 열립니다.

  3. RDP 파일 다운로드를 선택합니다. Azure에서 RDP(원격 데스크톱 프로토콜) 파일을 만들고 컴퓨터에 다운로드합니다.

  4. 다운로드한 RDP 파일을 엽니다.

    a. 메시지가 표시되면 연결을 선택합니다.
    b. VM을 만들 때 지정한 사용자 이름과 암호를 입력합니다.

    참고 항목

    추가 선택 사항>다른 계정 사용을 선택하여 VM을 만들 때 입력한 자격 증명을 지정해야 할 수도 있습니다.

  5. 확인을 선택합니다.

    로그인 프로세스 중에 인증서 경고가 나타날 수 있습니다. 표시되는 경우 또는 계속을 선택합니다.

  6. VM 데스크톱이 나타나면 최소화하여 로컬 데스크톱으로 돌아갑니다.

VM에서 비공개로 SQL Database 서버에 액세스

프라이빗 엔드포인트를 사용하여 VM에서 SQL Database 서버에 연결하려면 다음을 수행합니다.

  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

다음 단계

프라이빗 엔드포인트를 지원하는 서비스에 대한 자세한 내용은 다음을 참조하세요.