クイックスタート: Bicep を使用してプライベート エンドポイントを作成する

このクイックスタートでは、Bicep を使用してプライベート エンドポイントを作成します。

Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。 簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Bicep により、Azure のコード ソリューションとしてのインフラストラクチャに最適な作成エクスペリエンスが実現します。

Azure portalAzure PowerShellAzure 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 文字以上で、少なくとも 1 つの小文字と大文字および 1 つの特殊文字が含まれている必要があります。

    デプロイが完了すると、デプロイが成功したことを示すメッセージが表示されます。

デプロイの検証

Note

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. [OK] を選択します。

    サインイン処理中に証明書の警告が表示される場合があります。 この場合は、 [はい] または [続行] を選択します。

  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

次の手順

プライベート エンドポイントをサポートするサービスの詳細については、以下を参照してください。