다음을 통해 공유


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

이 빠른 시작에서는 ARM 템플릿(Azure Resource Manager 템플릿)을 사용하여 프라이빗 엔드포인트를 만듭니다.

Azure Resource Manager 템플릿은 프로젝트에 대한 인프라 및 구성을 정의하는 JSON(JavaScript Object Notation) 파일입니다. 이 템플릿은 선언적 구문을 사용합니다. 배포를 만들기 위한 프로그래밍 명령의 시퀀스를 작성하지 않고 의도하는 배포를 설명합니다.

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

환경이 필수 조건을 충족하고 ARM 템플릿 사용에 익숙한 경우 여기서 Azure에 배포 단추를 선택합니다. Azure Portal에서 ARM 템플릿이 열립니다.

Resource Manager 템플릿을 Azure에 배포하는 단추

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

필수 조건

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

템플릿 검토

이 템플릿은 Azure SQL Database의 인스턴스에 대한 프라이빗 엔드포인트를 만듭니다.

이 빠른 시작에서 사용하는 템플릿은 Azure 빠른 시작 템플릿에서 가져온 것입니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.5.6.12127",
      "templateHash": "14846974543330599630"
    }
  },
  "parameters": {
    "sqlAdministratorLogin": {
      "type": "string",
      "metadata": {
        "description": "The administrator username of the SQL logical server"
      }
    },
    "sqlAdministratorLoginPassword": {
      "type": "secureString",
      "metadata": {
        "description": "The administrator password of the SQL logical server."
      }
    },
    "vmAdminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "vmAdminPassword": {
      "type": "secureString",
      "metadata": {
        "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)"
      }
    },
    "VmSize": {
      "type": "string",
      "defaultValue": "Standard_D2_v3",
      "metadata": {
        "description": "The size of the VM"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    }
  },
  "variables": {
    "vnetName": "myVirtualNetwork",
    "vnetAddressPrefix": "10.0.0.0/16",
    "subnet1Prefix": "10.0.0.0/24",
    "subnet1Name": "mySubnet",
    "sqlServerName": "[format('sqlserver{0}', uniqueString(resourceGroup().id))]",
    "databaseName": "[format('{0}/sample-db', variables('sqlServerName'))]",
    "privateEndpointName": "myPrivateEndpoint",
    "privateDnsZoneName": "[format('privatelink{0}', environment().suffixes.sqlServerHostname)]",
    "pvtEndpointDnsGroupName": "[format('{0}/mydnsgroupname', variables('privateEndpointName'))]",
    "vmName": "[take(format('myVm{0}', uniqueString(resourceGroup().id)), 15)]",
    "publicIpAddressName": "[format('{0}PublicIP', variables('vmName'))]",
    "networkInterfaceName": "[format('{0}NetInt', variables('vmName'))]",
    "osDiskType": "StandardSSD_LRS"
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2021-11-01-preview",
      "name": "[variables('sqlServerName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "[variables('sqlServerName')]"
      },
      "properties": {
        "administratorLogin": "[parameters('sqlAdministratorLogin')]",
        "administratorLoginPassword": "[parameters('sqlAdministratorLoginPassword')]",
        "version": "12.0",
        "publicNetworkAccess": "Disabled"
      }
    },
    {
      "type": "Microsoft.Sql/servers/databases",
      "apiVersion": "2021-11-01-preview",
      "name": "[variables('databaseName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Basic",
        "tier": "Basic",
        "capacity": 5
      },
      "tags": {
        "displayName": "[variables('databaseName')]"
      },
      "properties": {
        "collation": "SQL_Latin1_General_CP1_CI_AS",
        "maxSizeBytes": 104857600,
        "sampleName": "AdventureWorksLT"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2021-05-01",
      "name": "[variables('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('vnetAddressPrefix')]"
          ]
        }
      }
    },
    {
      "type": "Microsoft.Network/virtualNetworks/subnets",
      "apiVersion": "2021-05-01",
      "name": "[format('{0}/{1}', variables('vnetName'), variables('subnet1Name'))]",
      "properties": {
        "addressPrefix": "[variables('subnet1Prefix')]",
        "privateEndpointNetworkPolicies": "Disabled"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/privateEndpoints",
      "apiVersion": "2021-05-01",
      "name": "[variables('privateEndpointName')]",
      "location": "[parameters('location')]",
      "properties": {
        "subnet": {
          "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
        },
        "privateLinkServiceConnections": [
          {
            "name": "[variables('privateEndpointName')]",
            "properties": {
              "privateLinkServiceId": "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
              "groupIds": [
                "sqlServer"
              ]
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Sql/servers', variables('sqlServerName'))]",
        "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/privateDnsZones",
      "apiVersion": "2020-06-01",
      "name": "[variables('privateDnsZoneName')]",
      "location": "global",
      "properties": {},
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks",
      "apiVersion": "2020-06-01",
      "name": "[format('{0}/{1}', variables('privateDnsZoneName'), format('{0}-link', variables('privateDnsZoneName')))]",
      "location": "global",
      "properties": {
        "registrationEnabled": false,
        "virtualNetwork": {
          "id": "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
      "apiVersion": "2021-05-01",
      "name": "[variables('pvtEndpointDnsGroupName')]",
      "properties": {
        "privateDnsZoneConfigs": [
          {
            "name": "config1",
            "properties": {
              "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]"
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZoneName'))]",
        "[resourceId('Microsoft.Network/privateEndpoints', variables('privateEndpointName'))]"
      ]
    },
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2021-05-01",
      "name": "[variables('publicIpAddressName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "[variables('publicIpAddressName')]"
      },
      "properties": {
        "publicIPAllocationMethod": "Dynamic"
      }
    },
    {
      "type": "Microsoft.Network/networkInterfaces",
      "apiVersion": "2021-05-01",
      "name": "[variables('networkInterfaceName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "[variables('networkInterfaceName')]"
      },
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipConfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]"
              },
              "subnet": {
                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]"
              }
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpAddressName'))]",
        "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), variables('subnet1Name'))]",
        "[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2021-11-01",
      "name": "[variables('vmName')]",
      "location": "[parameters('location')]",
      "tags": {
        "displayName": "[variables('vmName')]"
      },
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('VmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('vmAdminUsername')]",
          "adminPassword": "[parameters('vmAdminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "MicrosoftWindowsServer",
            "offer": "WindowsServer",
            "sku": "2019-Datacenter",
            "version": "latest"
          },
          "osDisk": {
            "name": "[format('{0}OsDisk', variables('vmName'))]",
            "caching": "ReadWrite",
            "createOption": "FromImage",
            "managedDisk": {
              "storageAccountType": "[variables('osDiskType')]"
            },
            "diskSizeGB": 128
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
      ]
    }
  ]
}

템플릿은 다음과 같은 여러 Azure 리소스를 정의합니다.

템플릿 배포

다음을 수행하여 Azure에 ARM 템플릿을 배포합니다.

  1. 여기서 Azure에 배포 단추를 선택하여 Azure에 로그인하고 ARM 템플릿을 엽니다. 템플릿은 프라이빗 엔드포인트, SQL Database 인스턴스, 네트워크 인프라, 유효성을 검사할 가상 머신을 만듭니다.

    Resource Manager 템플릿을 Azure에 배포하는 단추

  2. 리소스 그룹을 선택하거나 새로 만듭니다.

  3. SQL 관리자 로그인 이름과 암호를 입력합니다.

  4. 가상 머신 관리자 사용자 이름과 암호를 입력합니다.

  5. 사용 약관 문을 읽습니다. 동의하는 경우 위에 명시된 사용 약관에 동의함을 선택한 다음, 구매를 선택합니다. 배포를 완료하는 데 20분 이상 걸릴 수 있습니다.

배포 유효성 검사

참고 항목

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

인터넷에서 VM에 연결

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

  1. 포털의 검색 창에 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}에 대한 원격 데스크톱 연결을 닫습니다.

리소스 정리

프라이빗 엔드포인트로 만든 리소스가 더 이상 필요하지 않으면 리소스 그룹을 삭제합니다. 이렇게 하면 프라이빗 엔드포인트와 모든 관련 리소스가 제거됩니다.

리소스 그룹을 삭제하려면 Remove-AzResourceGroup cmdlet을 실행합니다.

Remove-AzResourceGroup -Name <your resource group name>

다음 단계

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