Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

仮想マシンV2にロードバランサーを追加する

仮想マシンV1では、仮想マシンのコンテナとしてクラウドサービス(≠PaaS)を利用していたため、暗黙的なロードバランサーが常に存在していました。仮想マシンV2では、前記事のとおりロードバランサーは必須ではなく必要に応じて、追加する必要があります。

今回も、ARM PowerShellでロードバランサーを構成してみたいと思います。

コマンドレット

ロードバランサーを作るには、New-AzureLoadBalancer コマンドレットで行いますが、作成する前に他のコマンドで構成情報を設定しておく必要があります。

  1. New-AzureLoadBalancer
  2. New-AzureLoadBalancerBackendAddressPoolConfig
  3. New-AzureLoadBalancerFrontendIpConfig
  4. New-AzureLoadBalancerInboundNatRuleConfig
  5. New-AzureLoadBalancerProbeConfig
  6. New-AzureLoadBalancerRuleConfig

ここでは仮想マシンが2台あって、SSHでは各々のサーバー、HTTPはロードバランスするという、よくある場面を定義し、これを例に説明したいと思います。

f:id:StateMachine:20150718115731p:plain

パブリックIP

ロードバランサーとパブリックIP(グローバル)を関連づける必要があります。これは、New-AzureLoadBalancerFrontendIpConfig コマンドレットで行います。パブリックIPのリソースは予め作成しておく必要があります。

$fip = New-AzureLoadBalancerFrontendIpConfig -name "FrontEndIP"  -PublicIpAddress $ip

ポートフォワード(NAT)

SSHの定義は、New-AzureLoadBalancerInboundNatRuleConfig で行います。プロトコルと入力ポートと出力ポートを定義します。この値は、最終的には仮想マシンが持つネットワークインタフェースと関連づきます。

$inrule1 = New-AzureLoadBalancerInboundNatRuleConfig -Name "SSH1" -FrontendIpConfiguration $fip `
    -Protocol Tcp -FrontendPort 60022 -BackendPort 22

$inrule2 = New-AzureLoadBalancerInboundNatRuleConfig -Name "SSH2" -FrontendIpConfiguration $fip `
    -Protocol Tcp -FrontendPort 60023 -BackendPort 22

ロードバランス

ロードバランスの定義は、そのほかの /AzureLoadBalancerBackendAddressPoolConfig/AzureLoadBalancerProbeConfig/AzureLoadBalancerRuleConfig を組み合わせ行います。

始めにバックエンドプールを定義して、プローブと、ロードバランスのルールを定義します。以下の例では、HTTPプロトコル ポート80番にたいして、5秒間隔で h.html を確認します。3回失敗したら、失敗した仮想マシンがロードバランサーから切り離されるでしょう。間隔は、以前と同様5秒未満には設定できません。

$bepool = New-AzureLoadBalancerBackendAddressPoolConfig -Name "BackEndPool"

$probe = New-AzureLoadBalancerProbeConfig -Name "HttpProbe" -RequestPath "h.html" `
    -Protocol Http -IntervalInSeconds 5 -ProbeCount 3 -Port 80 

$lbrule = New-AzureLoadBalancerRuleConfig -Name "Http" -FrontendIpConfiguration $fip `
    -BackendAddressPool $bepool -Probe $probe -Protocol Tcp -FrontendPort 80 -BackendPort 80

ロードバランサー作成とNICヘの関連づけ

ロードバランサーの作成は、New-AzureLoadBalancer コマンドレットで行います。作成した関連オブジェクトを指定して作成します。

$lb = New-AzureLoadBalancer -ResourceGroupName $rg -Name "myLoadBalancer" -Location $loc `
    -FrontendIpConfiguration $fip -InboundNatRule $inrule1,$inrule2 -LoadBalancingRule $lbrule `
    -BackendAddressPool $bepool -Probe $probe

作成したロードバランサーオブジェクトの内容をNICに指定して完了です。あとは、仮想マシンを作成します。ちなみにロードバランスする場合は、アベイラビリティーセットが必須でした。V1の時は必須ではなかったと思いますが。

$nic1    = New-AzureNetworkInterface -ResourceGroupName $rg -Location $loc `
    -Name $nic1Name -PrivateIpAddress $privateIpAddress1 -Subnet $subnet1 `
    -LoadBalancerInboundNatRule $lb.InboundNatRules[0] `
    -LoadBalancerBackendAddressPool $lb.BackendAddressPools[0]

$nic2    = New-AzureNetworkInterface -ResourceGroupName $rg -Location $loc `
    -Name $nic2Name -PrivateIpAddress $privateIpAddress2 -Subnet $subnet1  `
    -LoadBalancerInboundNatRule $lb.InboundNatRules[1] `
    -LoadBalancerBackendAddressPool $lb.BackendAddressPools[0]

すこし複雑で面倒くさいのですが、ロードバランサーってそういうものですからしょうが無いですね。