빠른 시작: 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 리소스를 정의합니다.
- Microsoft.Sql/servers: 샘플 데이터베이스가 포함된 SQL Database의 인스턴스입니다.
- microsoft.Sql/servers/databases: 샘플 데이터베이스입니다.
- Microsoft.Network/virtualNetworks: 프라이빗 엔드포인트가 배포되는 가상 네트워크입니다.
- Microsoft.Network/privateEndpoints: SQL Database 인스턴스에 액세스하는 데 사용하는 프라이빗 엔드포인트입니다.
- Microsoft.Network/privateDnsZones: 프라이빗 엔드포인트 IP 주소를 확인하는 데 사용하는 영역입니다.
- Microsoft.Network/privateDnsZones/virtualNetworkLinks
- Microsoft.Network/privateEndpoints/privateDnsZoneGroups: 프라이빗 DNS 영역과 프라이빗 엔드포인트를 연결하는 데 사용하는 영역 그룹입니다.
- Microsoft.Network/publicIpAddresses: 가상 머신에 액세스하는 데 사용하는 공용 IP 주소입니다.
- Microsoft.Network/networkInterfaces: 가상 머신에 대한 네트워크 인터페이스입니다.
- Microsoft.Compute/virtualMachines: SQL Database 인스턴스에 대한 프라이빗 엔드포인트 연결을 테스트하는 데 사용하는 가상 머신입니다.
Bicep 파일 배포
Bicep 파일을 main.bicep으로 로컬 컴퓨터에 저장합니다.
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}에 연결합니다.
Azure Portal 검색 창에 myVm{uniqueid}를 입력합니다.
연결을 선택합니다. 가상 머신에 연결이 열립니다.
RDP 파일 다운로드를 선택합니다. Azure에서 RDP(원격 데스크톱 프로토콜) 파일을 만들고 컴퓨터에 다운로드합니다.
다운로드한 RDP 파일을 엽니다.
a. 메시지가 표시되면 연결을 선택합니다.
b. VM을 만들 때 지정한 사용자 이름과 암호를 입력합니다.참고 항목
추가 선택 사항>다른 계정 사용을 선택하여 VM을 만들 때 입력한 자격 증명을 지정해야 할 수도 있습니다.
확인을 선택합니다.
로그인 프로세스 중에 인증서 경고가 나타날 수 있습니다. 표시되는 경우 예 또는 계속을 선택합니다.
VM 데스크톱이 나타나면 최소화하여 로컬 데스크톱으로 돌아갑니다.
VM에서 비공개로 SQL Database 서버에 액세스
프라이빗 엔드포인트를 사용하여 VM에서 SQL Database 서버에 연결하려면 다음을 수행합니다.
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}에 대한 원격 데스크톱 연결을 닫습니다.
리소스 정리
프라이빗 링크 서비스로 만든 리소스가 더 이상 필요하지 않으면 리소스 그룹을 삭제합니다. 이렇게 하면 프라이빗 링크 서비스와 모든 관련 리소스가 제거됩니다.
az group delete --name exampleRG
다음 단계
프라이빗 엔드포인트를 지원하는 서비스에 대한 자세한 내용은 다음을 참조하세요.