Azure PowerShell を使用して Azure VM 上に SQL Server を作成する

適用対象:Azure VM 上の SQL Server

このガイドでは、PowerShell を用いて Azure Virtual Machines (VM) 上に SQL Server を準備するためのオプションを取り上げます。 規定値に依存する、合理化された Azure PowerShell の例については、Azure VM 上の SQL Server の PowerShell クイック スタートを参照してください。

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

注意

この記事では、Azure と対話するために推奨される PowerShell モジュールである Azure Az PowerShell モジュールを使用します。 Az PowerShell モジュールの使用を開始するには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

サブスクリプションの構成

  1. PowerShell を開き、Connect-AzAccount コマンドを実行することで、Azure アカウントへのアクセスを確立します。

    Connect-AzAccount
    
  2. メッセージが表示されたら、資格情報を入力します。 Azure ポータルへのサインインに使用しているものと同じ電子メールとパスワードを使用します。

イメージの変数の定義

値を再利用してスクリプトの作成を簡略化するには、まず、変数の数を定義します。 パラメーターの値は適宜変更してください。ただし、指定した値に変更を加える際は、名前の長さや特殊文字に関連した制限に注意してください。

場所とリソース グループ

データのリージョンと、他の VM リソースの作成先となるリソース グループを定義します。

必要に応じて変更してから、以下のコマンドレットを実行し、これらの変数を初期化します。

$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

ストレージのプロパティ

ストレージ アカウントと、仮想マシンで使用するストレージの種類を定義します。

必要に応じて変更してから、以下のコマンドレットを実行し、これらの変数を初期化します。 運用環境のワークロードには Premium SSD を使用することをお勧めします。

$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

ネットワークのプロパティ

仮想マシンのネットワークで使用するプロパティを定義します。

  • ネットワーク インターフェイス
  • TCP/IP の割り当て方法
  • 仮想ネットワーク名
  • 仮想サブネット名
  • 仮想ネットワークの IP アドレスの範囲
  • サブネットの IP アドレスの範囲
  • パブリック ドメイン名のラベル

必要に応じて変更してから、このコマンドレットを実行し、これらの変数を初期化します。

$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$TCPIPAllocationMethod = "Dynamic"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$DomainName = $ResourceGroupName

仮想マシン プロパティ

次のプロパティを定義します。

  • 仮想マシン名
  • コンピューター名
  • 仮想マシンのサイズ
  • 仮想マシンに使用するオペレーティング システムのディスク名

必要に応じて変更してから、このコマンドレットを実行し、これらの変数を初期化します。

$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

SQL Server イメージを選択します。

仮想マシンに使用するイメージは、以下の変数を使用して定義します。

  1. まず、Get-AzVMImageOffer コマンドを使用して、提供されているすべての SQL Server イメージを一覧表示します。 このコマンドにより、Azure portal で提供されている現在のイメージが一覧表示されます。また、PowerShell でのみインストールできる古いイメージも一覧表示されます。

    Get-AzVMImageOffer -Location $Location -Publisher 'MicrosoftSQLServer'
    

    注意

    SQL Server 2008 および SQL Server 2008 R2 は延長サポート対象外となり、Azure Marketplace から利用できなくなります。

  2. このチュートリアルでは、次の変数を使用して、Windows Server 2022 上の SQL Server 2022 を指定します。

    $OfferName = "SQL2022-WS2022"
    $PublisherName = "MicrosoftSQLServer"
    $Version = "latest"
    
  3. 次に、お使いのサービスで使用可能なエディションを一覧表示します。

    Get-AzVMImageSku -Location $Location -Publisher 'MicrosoftSQLServer' -Offer $OfferName | Select Skus
    
  4. このチュートリアルでは、SQL Server 2022 Developer エディション (SQLDEV) を使用します。 Developer エディションはテストと開発のために無料でライセンスされます。VM を実行するコストのみを支払います。

    $Sku = "SQLDEV"
    

リソース グループを作成する

Resource Manager デプロイ モデルで最初に作成するオブジェクトはリソース グループです。 New-AzResourceGroup コマンドレットを使用して、Azure リソース グループとそのリソースを作成します。 前に初期化した、リソース グループの名前と場所の変数を指定します。

このコマンドレットを実行し、新しいリソース グループを作成します。

New-AzResourceGroup -Name $ResourceGroupName -Location $Location

ストレージ アカウントの作成

仮想マシンには、オペレーティング システム ディスク用と SQL Server (データおよびログ ファイル) 用のストレージ リソースが必要となります。 単純化するために、両方の用途を兼ねた単一のディスクを作成します。 後から Add-Azure Disk コマンドレットを使用して追加のディスクを接続すると、SQL Server のデータ ファイルとログ ファイルを専用のディスクに格納できます。 New-AzStorageAccount コマンドレットを使用して、新しいリソース グループ内に標準ストレージ アカウントを作成します。 前に初期化した、ストレージ アカウント名、ストレージ SKU 名、および場所の変数を指定します。

このコマンドレットを実行し、新しいストレージ アカウントを作成します。

$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName `
   -Name $StorageName -SkuName $StorageSku `
   -Kind "Storage" -Location $Location

ヒント

ストレージ アカウントを作成するには数分かかることがあります。

ネットワーク リソースを作成する

ネットワーク接続を確保するためには、仮想マシンにさまざまなネットワーク リソースが必要となります。

  • 個々の仮想マシンに仮想ネットワークが必要となります。
  • 仮想ネットワークには少なくとも 1 つのサブネットが定義されている必要があります。
  • パブリックまたはプライベートの IP アドレスを持つネットワーク インターフェイスが定義されている必要があります。

仮想ネットワークのサブネット構成の作成

まず、仮想ネットワークのサブネット構成を作成します。 このチュートリアルでは、New-AzVirtualNetworkSubnetConfig コマンドレットを使用して、既定のサブネットを作成します。 前に初期化した、サブネット名とアドレス プレフィックスの変数を指定します。

Note

サブネット名とアドレス プレフィックス以外のプロパティもこのコマンドレットで定義できますが、このチュートリアルの範囲を超えるため、ここでは取り上げません。

このコマンドレットを実行して、仮想サブネットの構成を作成します。

$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix

仮想ネットワークの作成

次に、New-AzVirtualNetwork コマンドレットを使用して、新しいリソース グループ内に仮想ネットワークを作成します。 前に初期化した、名前、場所、およびアドレス プレフィックスの変数を指定します。 前の手順で定義したサブネット構成を使用します。

このコマンドレットを実行して、仮想ネットワークを作成します。

$VNet = New-AzVirtualNetwork -Name $VNetName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig

パブリック IP アドレスの作成

これで仮想ネットワークが定義されたので、仮想マシンへの接続用の IP アドレスを構成する必要があります。 このチュートリアルでは、インターネット接続をサポートするために、動的 IP アドレス指定を使用してパブリック IP アドレスを作成します。 New-AzPublicIpAddress コマンドレットを使用して、新しいリソース グループ内にパブリック IP アドレスを作成します。 前に初期化した、名前、場所、割り当て方法、および DNS ドメイン名ラベルの変数を指定します。

Note

パブリック IP アドレスのプロパティもこのコマンドレットで定義できますが、このチュートリアルの範囲を超えるため、ここでは取り上げません。 またプライベート アドレスや静的アドレスを作成することもできますが、このチュートリアルの範囲を超えるため、同様に説明を省略します。

このコマンドレットを実行して、パブリック IP アドレスを作成します。

$PublicIp = New-AzPublicIpAddress -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName

ネットワーク セキュリティ グループの作成

VM と SQL Server トラフィックを保護するには、ネットワーク セキュリティ グループを作成します。

  1. まず、リモート デスクトップ (RDP) 接続を許可するための RDP 用ネットワーク セキュリティ グループ ルールを作成します。

    $NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp `
       -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
    
  2. TCP ポート 1433 でトラフィックを許可するネットワーク セキュリティ グループ ルールを構成します。 そうすることで、インターネット経由での SQL Server への接続が可能になります。

    $NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp `
       -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * `
       -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
    
  3. ネットワーク セキュリティ グループを作成します。

    $Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName `
       -Location $Location -Name $NsgName `
       -SecurityRules $NsgRuleRDP,$NsgRuleSQL
    

ネットワーク インターフェイスの作成

これで、仮想マシンのネットワーク インターフェイスを作成する準備が整いました。 New-AzNetworkInterface コマンドレットを使用して、新しいリソース グループ内にネットワーク インターフェイスを作成します。 前に定義した名前、場所、サブネット、およびパブリック IP アドレスを指定します。

このコマンドレットを実行して、ネットワーク インターフェイスを作成します。

$Interface = New-AzNetworkInterface -Name $InterfaceName `
   -ResourceGroupName $ResourceGroupName -Location $Location `
   -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id `
   -NetworkSecurityGroupId $Nsg.Id

VM オブジェクトの構成

これでストレージとネットワーク リソースが定義されたので、仮想マシンのコンピューティング リソースを定義する準備が整いました。

  • 仮想マシンのサイズと、さまざまなオペレーティング システムのプロパティを指定します。
  • 前に作成したネットワーク インターフェイスを指定します。
  • BLOB ストレージを定義します。
  • オペレーティング システム ディスクを指定します。

VM オブジェクトの作成

まず、仮想マシンのサイズを指定します。 このチュートリアルでは DS13 を指定します。 New-AzVMConfig コマンドレットを使用して、構成可能な仮想マシン オブジェクトを作成します。 前に初期化した、名前とサイズの変数を指定します。

このコマンドレットを実行して、仮想マシン オブジェクトを作成します。

$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize

ローカル管理者の資格情報の名前とパスワードを保持する資格情報オブジェクトを作成する

仮想マシンのオペレーティング システムのプロパティを設定する前に、ローカル管理者アカウントの資格情報を、セキュリティで保護された文字列で指定する必要があります。 ここでは、Get-Credential コマンドレットを使用します。

次のコマンドレットを実行します。 PowerShell の資格情報要求ウィンドウに、VM のローカル管理者名とパスワードを入力する必要があります。

$Credential = Get-Credential -Message "Type the name and password of the local administrator account."

仮想マシンに使用するオペレーティング システムのプロパティ設定

Set-AzVMOperatingSystem コマンドレットを使用して仮想マシンのオペレーティング システムのプロパティを設定する準備ができました。

  • オペレーティング システムの種類は Windows として設定します。
  • 仮想マシン エージェントがインストールされる必要があります。
  • このコマンドレットで自動更新を有効にすることを指定します。
  • 前に初期化した、仮想マシン名、コンピューター名、および資格情報の変数を指定します。

このコマンドレットを実行し、仮想マシンのオペレーティング システムのプロパティを設定します。

$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine `
   -Windows -ComputerName $ComputerName -Credential $Credential `
   -ProvisionVMAgent -EnableAutoUpdate

仮想マシンにネットワーク インターフェイスを追加する

次に、前に定義した変数を使用して Add-AzVMNetworkInterface コマンドレットを実行して、ネットワーク インターフェイスを追加します。

このコマンドレットを実行し、仮想マシンのネットワーク インターフェイスを設定します。

$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id

仮想マシンで使用するディスクの Blob Storage の場所を設定する

次に、前に定義した変数で、VM のディスク用の BLOB ストレージの場所を設定します。

このコマンドレットを実行し、BLOB ストレージの場所を設定します。

$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"

仮想マシンに使用するオペレーティング システムのディスクのプロパティ設定

次に、Set-AzVMOSDisk コマンドレットを使用して、仮想マシンのオペレーティング システム ディスクのプロパティを設定します。

  • 仮想マシンのオペレーティング システムはイメージから取得することを指定します。
  • キャッシュは読み取り専用に設定します (同じディスクに SQL Server がインストールされるため)。
  • 前に初期化した、VM の名前とオペレーティング システム ディスクの変数を指定します。

このコマンドレットを実行し、仮想マシンのオペレーティング システム ディスクのプロパティを設定します。

$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name `
   $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

仮想マシンのプラットフォーム イメージを指定する

最後の構成手順は、仮想マシン用のプラットフォーム イメージを指定することです。 このチュートリアルでは、最新の SQL Server 2016 CTP イメージを使用します。 前に定義した変数を使用して Set-AzVMSourceImage コマンドレットを実行して、このイメージを使用します。

このコマンドレットを実行し、仮想マシンのプラットフォーム イメージを指定します。

$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine `
   -PublisherName $PublisherName -Offer $OfferName `
   -Skus $Sku -Version $Version

SQL VM の作成

これで構成手順を終えたので、仮想マシンを作成する準備が整いました。 定義した変数を使用して New-AzVM コマンドレットを実行して、仮想マシンを作成します。

ヒント

VM の作成には数分かかることがあります。

このコマンドレットを実行して仮想マシンを作成します。

New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

これで仮想マシンが作成されました。

Note

ブート診断に関するエラーが表示される場合、そのエラーは無視できます。 仮想マシンのディスク用に指定したストレージ アカウントは Premium Storage アカウントであるため、ブート診断用に Standard Storage アカウントが作成されることに注意してください。

SQL IaaS エージェント拡張機能をインストールする

SQL Server 仮想マシンでは、SQL Server IaaS エージェントの拡張機能を使用して自動管理機能をサポートします。 拡張機能に SQL Server を登録するには、仮想マシンが作成された後に、New-AzSqlVM コマンドを実行します。 SQL Server VM のライセンスの種類を指定し、[Azure ハイブリッド特典] を使用して従量課金制またはライセンス持ち込みを選択します。 ライセンスの詳細については、「ライセンス モデル」を参照してください。

New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

拡張機能に登録する方法は 3 つあります。

VM の停止または削除

VM を継続的に実行する必要がない場合は、使用中でないときに停止することで、不要な料金の発生を回避できます。 次のコマンドでは、VM を停止しますが、後から使用できるように残しておきます。

Stop-AzVM -Name $VMName -ResourceGroupName $ResourceGroupName

Remove-AzResourceGroup コマンドを使用して、仮想マシンに関連付けられているすべてのリソースを完全に削除することもできます。 そのようにすると仮想マシンも完全に削除されるため、このコマンドは注意して使用してください。

サンプル スクリプト

このチュートリアルで使用した PowerShell スクリプト全体は、次のようになっています。 使用する Azure サブスクリプションは、Connect-AzAccount コマンドと Select-AzSubscription コマンドによって既に設定されていることを前提とします。

# Variables

## Global
$Location = "SouthCentralUS"
$ResourceGroupName = "sqlvm2"

## Storage
$StorageName = $ResourceGroupName + "storage"
$StorageSku = "Premium_LRS"

## Network
$InterfaceName = $ResourceGroupName + "ServerInterface"
$NsgName = $ResourceGroupName + "nsg"
$VNetName = $ResourceGroupName + "VNet"
$SubnetName = "Default"
$VNetAddressPrefix = "10.0.0.0/16"
$VNetSubnetAddressPrefix = "10.0.0.0/24"
$TCPIPAllocationMethod = "Dynamic"
$DomainName = $ResourceGroupName

##Compute
$VMName = $ResourceGroupName + "VM"
$ComputerName = $ResourceGroupName + "Server"
$VMSize = "Standard_DS13"
$OSDiskName = $VMName + "OSDisk"

##Image
$PublisherName = "MicrosoftSQLServer"
$OfferName = "SQL2017-WS2016"
$Sku = "SQLDEV"
$Version = "latest"

# Resource Group
New-AzResourceGroup -Name $ResourceGroupName -Location $Location

# Storage
$StorageAccount = New-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageName -SkuName $StorageSku -Kind "Storage" -Location $Location

# Network
$SubnetConfig = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $VNetSubnetAddressPrefix
$VNet = New-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName -Location $Location -AddressPrefix $VNetAddressPrefix -Subnet $SubnetConfig
$PublicIp = New-AzPublicIpAddress -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -AllocationMethod $TCPIPAllocationMethod -DomainNameLabel $DomainName
$NsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name "RDPRule" -Protocol Tcp -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow
$NsgRuleSQL = New-AzNetworkSecurityRuleConfig -Name "MSSQLRule"  -Protocol Tcp -Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 1433 -Access Allow
$Nsg = New-AzNetworkSecurityGroup -ResourceGroupName $ResourceGroupName -Location $Location -Name $NsgName -SecurityRules $NsgRuleRDP,$NsgRuleSQL
$Interface = New-AzNetworkInterface -Name $InterfaceName -ResourceGroupName $ResourceGroupName -Location $Location -SubnetId $VNet.Subnets[0].Id -PublicIpAddressId $PublicIp.Id -NetworkSecurityGroupId $Nsg.Id

# Compute
$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize
$Credential = Get-Credential -Message "Type the name and password of the local administrator account."
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $ComputerName -Credential $Credential -ProvisionVMAgent -EnableAutoUpdate #-TimeZone = $TimeZone
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $Interface.Id
$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $OSDiskName + ".vhd"
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $OSDiskName -VhdUri $OSDiskUri -Caching ReadOnly -CreateOption FromImage

# Image
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName $PublisherName -Offer $OfferName -Skus $Sku -Version $Version

# Create the VM in Azure
New-AzVM -ResourceGroupName $ResourceGroupName -Location $Location -VM $VirtualMachine

# Add the SQL IaaS Agent Extension, and choose the license type
New-AzSqlVM -ResourceGroupName $ResourceGroupName -Name $VMName -Location $Location -LicenseType <PAYG/AHUB> 

次のステップ

これで仮想マシンが作成され、以下のことを実行できます。