KUSANAGI for Microsoft Azureを仮想マシンv2で作ってみた(Azure PowerShell)


プライム・ストラテジー社さんから公開されている、爆速WordPressのKUSANAGI for Microsoft Azureですが、現在公開されている構築手順に従うと、従来のAzure仮想マシン(v1)で作成されます。

しかしながら今後は、Azure仮想マシンはv2が主流になってくると考えられます。
現状はPreviewということでオフィシャルな構築手順が公開されていないものと思いますが、ここで、v2での構築をしてみましょう。

この手順はKUSANAGIに限らず、VMDepotで公開されていて、(新)ポータルのMarketPlaceに表示されないイメージからv2の仮想マシンを作成する手順となります。

なお、Azure PowerShellでの作成となりますが、今後、v2に関するPowerShellコマンドレットは変更が予定されていますのでご注意ください。(変更されたらこのコンテンツも修正する予定です。)
Resource Template(json)からの作成方法はこちら

また、v2では、ロードバランサなしでの構成も可能ですが、今回はなるべくオフィシャルでのv1と同じ構成になるようにしています。(v2では仮想ネットワークが必須なので、そこは異なります)

事前にAzure PowerShellでサブスクリプションに接続済みであることを前提とします。

まず、VMDepotのKUSANAGI for Microsoft Azureのサイトにアクセスします。

「DEPLOYMENT SCRIPT」をクリックするとダイアログが表示されるので「I Agree」をクリックします。
vmdepot-termofuse

デプロイ先のリージョンを選択するダイアログが表示されるので、「Select Regin」から選択します。
vmdepot-region

すると、このイメージをazure-cliでデプロイするコマンドが表示されます。
vmdepot-azurecli

azure vm create DNS_PREFIX -o vmdepot-56747-5-128 -l "Japan West" USER_NAME [PASSWORD] [--ssh] [other_options]
azure vm endpoint create-multiple DNS_PREFIX 22:22,80:80,443:443

ここで表示された、azure vm createコマンドの-oパラメータの値(この例では「vmdepot-56747-5-128」を控えます。)

以降、Azure PowerShellで仮想マシンを作成します。

重要な変数

  • $vmdepotUid: 先ほど控えた-oパラメータの値(例: vmdepot-56747-5-128)
  • $domainName: 外部に公開されるホスト名
    {$domainName}.japanwest.cloudapp.azure.com などとなります。
  • $storage: 仮想マシンが利用するストレージアカウント名

22行目までの変数は適宜設定してください。

# VMDepotのVMImage UID
$vmdepotUid = "vmdepot-56747-5-128"

$domainName = "kusanagi" # ホスト名
$storage = "stkusanagi" # ストレージアカウント名

$rg = "rg-kusanagi" # Resource Group名

$vnetName = "vn-kusanagi" # 仮想ネットワーク名
$pipName = "pip-kusanagi" # パブリックIPアドレス名
$sshPort = "22" # SSH外部ポート番号
$lbName = "lb-kusanagi" # ロードバランサ名
$fipName = "fip-kusanagi" # フロントエンドIP設定名
$nicName = "nic-kusanagi" # Network Interface Card名

$vmimageContainer = "vmimages" # VMImageを保存するコンテナ
$vmimageVhd = "kusanagiOSDisk.vhd" # 保存されるVMImage名

$vmName = "kusanagi" # 仮想マシン名
$vmSize = "Standard_A2" # 仮想マシンサイズ
$vmOSDiskName = "kusanagi01OSDisk" # 仮想マシンのOSディスク名
$vmOSDiskVhd = "kusanagi01OSDisk.vhd" # 仮想マシンOSディスクのBLOB名

$createdStorageSleepSec = 60

# VMDepotからイメージファイルのurlを取得する
$vmdepotXml = [xml](Invoke-WebRequest -Uri "https://vmdepot.msopentech.com/OData.svc/ResolveUid?uid=%27$vmdepotUid%27").Content
$vmdepotImage = $vmdepotXml.ResolveUid.element.BlobUrl
$loc = $vmdepotxml.ResolveUid.element.Location

# Azure PowerShellをResource Groupモードに変更
Switch-AzureMode -Name AzureResourceManager

# リソースグループ作成
New-AzureResourceGroup -Location $loc -Name $rg # Create Resource Group

# 仮想ネットワーク作成
$subnet1 = New-AzureVirtualNetworkSubnetConfig -Name "Subnet-1" -AddressPrefix "10.0.1.0/24" # サブネット作成
$vnet = New-AzureVirtualNetwork -ResourceGroupName $rg -Location $loc -Name $vnetName -AddressPrefix "10.0.0.0/8" -Subnet $subnet1
$subnet1 = Get-AzureVirtualNetworkSubnetConfig -Name "Subnet-1" -VirtualNetwork $vnet

# パブリックIP作成
$pip = New-AzurePublicIpAddress -ResourceGroupName $rg -Location $loc -Name $pipName -AllocationMethod Dynamic -DomainNameLabel $domainName

# ロードバランサ作成
$fip = New-AzureLoadBalancerFrontendIpConfig -Name $fipName -PublicIpAddress $pip
$inRule_ssh = New-AzureLoadBalancerInboundNatRuleConfig -Name "SSH" -FrontendIpConfiguration $fip -Protocol Tcp -FrontendPort $sshPort -BackendPort 22
$inRule_http = New-AzureLoadBalancerInboundNatRuleConfig -Name "HTTP" -FrontendIpConfiguration $fip -Protocol Tcp -FrontendPort 80 -BackendPort 80
$lb = New-AzureLoadBalancer -ResourceGroupName $rg -Name $lbName -Location $loc -FrontendIpConfiguration $fip -InboundNatRule $inRule_ssh,$inRule_http

# NIC作成
$nic = New-AzureNetworkInterface -ResourceGroupName $rg -Location $loc -Name $nicName -Subnet $subnet1 -LoadBalancerInboundNatRule $lb.InboundNatRules[0],$lb.InboundNatRules[1] -PrivateIpAddress "10.0.1.4"

# Storage Account作成
New-AzureStorageAccount -ResourceGroupName $rg -Location $loc -Name $storage -Type Standard_LRS
$storageKey = (Get-AzureStorageAccountKey -ResourceGroupName $rg -Name $storage).Key1 # ストレージKeyを取得
$env:AZURE_STORAGE_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=$storage;AccountKey=$storageKey"

# VMImageを配置するコンテナを作成
New-AzureStorageContainer -Name $vmimageContainer
Start-Sleep -s $createdStorageSleepSec

# VMDepotからStorageにVMImageをコピー
$method = "PUT"
$headers = @{}
$headers.Add("x-ms-copy-source", $vmdepotImage)
$signatureString = "x-ms-copy-source:$vmdepotImage`n"
$date = (Get-Date -Format "R").ToString()
$headers.Add("x-ms-date", $date)
$signatureString += "x-ms-date:$date`n"
$storageAPIVersion = "2014-02-14"
$headers.Add("x-ms-version", $storageAPIVersion)
$signatureString += "x-ms-version:$storageAPIVersion`n"
$vmimageVhdUrl = "https://$storage.blob.core.windows.net/$vmimageContainer/$vmimageVhd"
$stringToSign = "$method`n`n`n0`n`n`n`n`n`n`n`n`n" `
+ $signatureString `
+ "/$storage/$vmimageContainer/$vmimageVhd"
$stringToMac = [System.Text.Encoding]::UTF8.GetBytes($stringToSign)
$accountKeyBytes = [System.Convert]::FromBase64String($storageKey)
$hmac = New-Object System.Security.Cryptography.HMACSHA256((, $accountKeyBytes))
$signature = [System.Convert]::ToBase64String($hmac.ComputeHash($stringToMac))
$headers.Add("Authorization", "SharedKey ${storage}:$signature")
Invoke-RestMethod -Uri $vmimageVhdUrl -Method $method -Headers $headers

# VMs作成
$cred = Get-Credential # Linuxのユーザー名/パスワードを設定
$VMconfig = `
New-AzureVMConfig -VMName $vmName -VMSize $vmSize |
Set-AzureVMOperatingSystem -Linux -ComputerName $vmName -Credential $cred |
Set-AzureVMOSDisk -Name $vmOSDiskName -CreateOption fromImage -Caching ReadWrite -VhdUri "https://$storage.blob.core.windows.net/vhds/$vmOSDiskVhd" -SourceImageUri $vmimageVhdUrl -Linux |
Add-AzureVMNetworkInterface -Id $nic.Id -Primary
New-AzureVM -ResourceGroupName $rg -Location $loc -VM $VMconfig

# URLを表示
Write-Host -ForegroundColor Green "Finished.`n"
(Get-AzurePublicIpAddress -ResourceGroupName $rg -Name $pipName).DnsSettings.Fqdn

最後(Finished.の後)に表示されたurlがサーバーのアドレスです。

以降は、KUSANAGIのオフィシャルコンテンツ『3. KUSANAGIコマンドによるプロビジョニングの実行』に従って、KUSANAGIのセットアップをしてください。


タグ: , , , , ,


コメントをどうぞ