Azure仮想マシンのスケールセットをApplicationGatewayで構築（PowerShell)

# 前書き
Azureの仮想マシンスケールセットをポータルから作成するとDefault、ロードバランサーがアサインされてしまいます。
**SSLオフロード**を利用したい場合、ApplicationGatewayしか対応していないため、PowerShellを利用して検証してみました。
ストレージアカウント名がすでに利用されていたりすると赤字でエラー表示されます。（すみません。チェックまでは現時点でスクリプト内で実施させてません）

# 準備
PowerShell実行時には、サブスクリプションへのログインは手動で行ってください。
ApplicationGatewayを利用するのでFront側は443を利用すると思いますが、ここでは一旦80番で設定を行い、後でサーバ証明書を適用することを前提とします。

頑張って変数定義してください。
20分ほどで出来上がります。

# 未完成部分
下記スクリプトを実行後、ApplicationGateway のBackPoolが設定されていないです。
IPアドレスで追加するとオートスケールで増えたり減ったりするので、ドメイン名で設定だよね。と思いながら、設定方法を確認中です。
とりあえず、ApplicationGatewayでScaleSet を作ることを優先にやってみました。


# PowerShellスクリプト
```
###########################################################################################################
# Set variables for existing resource group
$ResourceGroupName          = "リソースグループ名"
$Location                   = "リージョン名"
$StorageAccountName         = "ストレージ管理者名"     # Storage Account name must be between 3 and 24 characters in length and use numbers and lower-case letters only.
$VnetName                   = "仮想ネットワーク名"
$VnetPrefix                 = "仮想ネットワークアドレス/マスク値"
$SubNetName01               = "サブネット名"
$SubNetPrefix01             = "サブネットワークアドレス/マスク値"
$PublicIPName01             = "パブリックIPアドレス名"
$PublicIPMethod01           = "Dynamic"                        # Dynamic Only
$SecondaryNIC               = "OFF"                            # ON or OFF

$AppGWName01                = "ApplicationGateway名"
$AppGWIP01                  = "ApplicationGatewayIPアドレス名"
$AppGWSubNetName01          = "ApplicationGatewayサブネット名"
$AppGWSubNetPrefix01        = "ApplicationGatewayサブネットワークアドレス/マスク値"
$AppGWFrontPoolName01       = "ApplicationGatewayフロントサイドプール名"
$AppGWFrontSpoolConfig      = "ApplicationGatewayフロントサイドコンフィグ名"
$AppGWFrontPort             = "80"                              # 80 or 443
$AppGWBackPoolName01        = "ApplicationGatewayバックサイドプール名"
$AppGWBackSpoolConfig       = "ApplicationGatewayバックサイドコンフィグ名"
$AppGWBackPort              = "80"
$AppGWSKUType               = "ApplicationGatewayタイプ"        # Standard_Small
$AppGWSKUTier               = "Standard"
$AppGWSKUCap                = "2"

$ListnerName01              = "ApplicationGatewayリスナー名" 
$RuleName                   = "ApplicationGatewayルール名"
$RuleType                   = "Basic"
$ProbeName01                = "ApplicationGatewayプローブ名"
$ProbeInterval              = "30"
$ProbeTimeout               = "120"
$FQdns01                    = "登録FQDN名"
$HealthPath                 = "ヘルスチェックファイル"

$VmssName                   = "スケールセット名" 
$VmssConfig                 = "スケールセットコンフィグ名"
$VmssIPConfigName01         = "スケールセットIPコンフィグ名"
$StorageProfile             = "ストレージプロファイル名"

$VMNamePrefix               = "仮想マシンPrefix"
$AdminName                  = "サーバ管理者名"
$AdminPassword              = "サーバ管理者パスワード"
$VmssImage                  = "(イメージファイルパス) https://<ストレージ管理者名>.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/****-osDisk.***************************.vhd"
$VMSize                     = "サーバタイプ"
$UpgradePolicy              = "automatic"                       # automatic or manual
$SKUCapacity                = "2"                               # Initial Machine
$OSType                     = "Linux"                           # Linux or Windows

###########################################################################################################

# Step1 : ResourceGroup Create
	New-AzureRmResourceGroup -Name $ResourceGroupName -Location $Location
	Write-Host "** Resource Group Create : $ResourceGroupName"


# Step2 : StorageAccount Create
	New-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName -Type Premium_LRS -Location $Location
	Write-Host "** Storage Account Create : $StorageAccountName"


# Step3-1 : Virtual Network Create(Primary SubNet)
	$Subnet01 = New-AzureRmVirtualNetworkSubnetConfig -Name $SubNetName01 -AddressPrefix $SubNetPrefix01
	if($SecondaryNIC -like "ON"){
		# Step3-2 : Virtual Network Create(Secondary SubNet)
		$Subnet02 = New-AzureRmVirtualNetworkSubnetConfig -Name $SubNetName02 -AddressPrefix $SubNetPrefix02
	}
	Write-Host "** Virtual Network Create : $VnetName"


# Step4 : Public IPAddress Create(Primary IP)
	$PublicIP01 = New-AzureRmPublicIpAddress -ResourceGroupName $ResourceGroupName -Name $PublicIPName01 -Location $Location -AllocationMethod $PublicIPMethod01
	Write-Host "** Public IPAddress Create : $PublicIPName01"


# Step5 : Application Gateway Create
	$SubnetAppGW = New-AzureRmVirtualNetworkSubnetConfig -Name $AppGWSubNetName01 -AddressPrefix $AppGWSubNetPrefix01
	if($SecondaryNIC -like "ON"){
		$VnetConfig = New-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VnetName -Location $Location -AddressPrefix $VnetPrefix -Subnet $Subnet01,$Subnet02,$SubnetAppGW
		$GlobalIPconfig = New-AzureRmApplicationGatewayIPConfiguration -Name $AppGWIP01 -Subnet $VnetConfig.Subnets[2]
	}else{
		$VnetConfig = New-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VnetName -Location $Location -AddressPrefix $VnetPrefix -Subnet $Subnet01,$SubnetAppGW
		$GlobalIPconfig = New-AzureRmApplicationGatewayIPConfiguration -Name $AppGWIP01 -Subnet $VnetConfig.Subnets[1]
	}
	

	$BackPool = New-AzureRmApplicationGatewayBackendAddressPool -Name $AppGWBackPoolName01
	Switch($AppGWBackPort){
		"80" {$BackPoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name $AppGWBackSpoolConfig -Port $AppGWBackPort -Protocol Http -CookieBasedAffinity Disabled}
		"443" {$BackPoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name $AppGWBackSpoolConfig -Port $AppGWBackPort -Protocol Https -CookieBasedAffinity Disabled}
		"default" {$BackPoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name $AppGWBackSpoolConfig -Port $AppGWBackPort -Protocol Http -CookieBasedAffinity Disabled}
	}

	$FrontPort = New-AzureRmApplicationGatewayFrontendPort -Name $AppGWFrontPoolName01  -Port $AppGWFrontPort
	$FrontPoolSetting = New-AzureRmApplicationGatewayFrontendIPConfig -Name $AppGWFrontSpoolConfig -PublicIPAddress $PublicIP01
	Switch($AppGWFrontPort){
		"80" {$Listener = New-AzureRmApplicationGatewayHttpListener -Name $ListnerName01 -Protocol Http -FrontendIPConfiguration $FrontPoolSetting -FrontendPort $FrontPort}
		"443" {$Listener = New-AzureRmApplicationGatewayHttpListener -Name $ListnerName01 -Protocol Https -FrontendIPConfiguration $FrontPoolSetting -FrontendPort $FrontPort}
		"Default" {$Listener = New-AzureRmApplicationGatewayHttpListener -Name $ListnerName01 -Protocol Http -FrontendIPConfiguration $FrontPoolSetting -FrontendPort $FrontPort}
	}

	$Rule = New-AzureRmApplicationGatewayRequestRoutingRule -Name $RuleName -RuleType $RuleType -BackendHttpSettings $BackPoolSetting -HttpListener $Listener -BackendAddressPool $BackPool
	$Probe = New-AzureRmApplicationGatewayProbeConfig -Name $ProbeName01 -Protocol Http -HostName $FQdns01 -Path $HealthPath -Interval $ProbeInterval -Timeout $ProbeTimeout -UnhealthyThreshold 8
	$SKU = New-AzureRmApplicationGatewaySku -Name $AppGWSKUType -Tier $AppGWSKUTier -Capacity $AppGWSKUCap
	New-AzureRmApplicationGateway -Name $AppGWName01 -ResourceGroupName $ResourceGroupName -Location $Location -BackendAddressPools $BackPool -BackendHttpSettingsCollection $BackPoolSetting -FrontendIpConfigurations $FrontPoolSetting -GatewayIpConfigurations $GlobalIPconfig -FrontendPorts $FrontPort -HttpListeners $Listener -RequestRoutingRules $Rule -Probe $Probe -Sku $SKU
	Write-Host "** ApplicationGateway Create : $AppGWName01"


# Step6 : AutoScaleSet Create
	$ipConfig = New-AzureRmVmssIpConfig -Name $VmssIPConfigName01 -SubnetId $VnetConfig.Subnets[0].Id
	$vmss = New-AzureRmVmssConfig -Location $Location -SkuCapacity $SKUCapacity -SkuName $VMSize -UpgradePolicyMode $UpgradePolicy
	Add-AzureRmVmssNetworkInterfaceConfiguration -VirtualMachineScaleSet $vmss -Name $VmssConfig -Primary $true -IPConfiguration $ipConfig
	Set-AzureRmVmssOsProfile -VirtualMachineScaleSet $vmss -ComputerNamePrefix $VMNamePrefix -AdminUsername $AdminName -AdminPassword $AdminPassword
	Set-AzureRmVmssStorageProfile -VirtualMachineScaleSet $vmss -Name $StorageProfile -OsDiskCreateOption "FromImage" -Image $VmssImage -OsDiskCaching "None" -OsDiskOsType $OSType
	New-AzureRmVmss -ResourceGroupName $ResourceGroupName -Name $VmssName -VirtualMachineScaleSet $vmss -Verbose
	Write-Host "** Virtual Machine Scale Set Create : $VmssName"
```