Month: November 2015

Azureが提供するDNSによるトラフィックルーティングサービスであるTraffic Managerについて、既にAzure利用ユーザに使い尽くされて新鮮味に欠けるサービスではあるものの、そのエンドポイント監視はTraffic Managerを扱う上でとても重要なことなので今一度そのルールについて整理したい。

Traffic managerの実態はエンドポイントの監視+ルーティングを行うDNSサービスである。以下digの結果を見ていただいてわかる通りyoichika-demo1.trafficmanager.netという外向きの名前に対してこの時点ではwebappdemo3.cloudapp.netがCNAMEされている。Traffic Managerは利用ユーザが設定したエンドポイントを監視し、その結果に応じて適切なルーティングを行う。ルーティング方法にはフェールオーバー、ラウンドロビン、パフォーマンスの3通りがある。これについて詳しくは「Traffic Managerのルーティング方法」を参照いただきたい。

; <<>> DiG 9.9.5-4.3ubuntu0.1-Ubuntu <<>> yoichika-demo1.trafficmanager.net +noall +answer
;; global options: +cmd
yoichika-demo1.trafficmanager.net. 30 IN CNAME  webappdemo3.cloudapp.net.
webappdemo3.cloudapp.net. 60    IN      A       70.37.93.167

  

次に肝心のエンドポイントの監視について「Traffic Manager の監視について」の監視シーケンスを使って要点を整理する。


AzureTrafficManagerMonitoring

 

つまり、エンドポイントがダウンした場合、Probeにより使用不可とみなすのに最大120秒(30秒 x 4)、さらにDNSのTTLの期間(既定値は300秒)を加えると、完全に問題のあったエンドポイントへのトラフィックが停止するまでに標準的に420秒、約7分は見ておく必要があるということになる。当然ながらこの7分間トラフィックがロスする可能性があるため、俊敏なフェールオーバーを期待する場合は別の仕掛けを用意する必要がある。ご注意ください。

Azure仮想マシンV1の一括起動・停止する方法についてのナレッジをここに整理しておく。基本的にはPowerShellやAzure CLIのVM起動・停止コマンドを並列で実行する方法でいけます。ただし同一クラウドサービス内に複数のVMがある場合は単純なコマンドの並列処理実行ではうまくいかない。その場合はAzureで用意されている複数ロールの一括起動・停止用REST APIを使いましょうというお話し。尚、ここでの一括処理はyoichikavm[001-100]の100VMを対象とする。

VM起動・停止コマンドの並列実行

yoichikavm[001-100]がそれぞれ別のクラウドサービスを持っている場合は、VM起動・停止コマンドを単純に並列実行するという手法で問題なく一括起動・停止ができる。例えばWindowsマシンの場合はPowershellの(Start|Stop)-AzureVMコマンドをStart-Jobを使用してバックグラウンドジョブとして実行させてやる、MacやLinuxであればvm (start|stop)コマンドをforkさせて複数故プロセスを走らせてやるなど。ここではStart-Jobでの並列実行例を紹介する。

複数VMの一括起動: parallel-start.ps1

foreach($node in $( Get-AzureVM | Where-Object{$_.Name -match "yoichikavm*"}) ) {
    Write-Host $node.Name
    Start-Job -ScriptBlock{
        param($node)
        Start-AzureVM -ServiceName $node.ServiceName -Name $node.Name
    } -Arg $node
}

複数VMの一括停止: parallel-stop.ps1

foreach($node in $( Get-AzureVM | Where-Object{$_.Name -match "yoichikavm*"}) ) {
    Write-Host $node.Name
    Start-Job -ScriptBlock{
        param($node)
        Stop-AzureVM -ServiceName $node.ServiceName -Name $node.Name -Force
    } -Arg $node
}

Start/Stop Roles APIの利用(同一クラウドサービス内に複数VMがある場合)

これは実際に私が躓いた際に@ksasakimsさんに教えてもらった方法。冒頭で簡単に説明したとおり同一クラウドサービス内に複数のVMがある場合は上記のような単純なコマンドの並列処理実行ではうまくいかない。この場合、Start RolesShutdown RolesのREST APIを使うことで同一クラウドサービス内の複数VMの同時起動。停止を実現することができる。
以下、APIについて簡単にご説明する。両APIともPOST先は下記同一のエントリーポイントとなっており、またBodyにそれぞれ下記のように起動VM,停止VMを記述する。

POST用エントリーポイント

https://management.core.windows.net/サブスクリプションID/services/hostedservices/クラウドサービス/deployments/デプロイ名/roles/Operations

BODY例: 一括起動 yoichikavm[001-100]

<StartRolesOperation xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <OperationType>StartRolesOperation</OperationType>
  <Roles>
    <Name>yoichikavm001</Name>
    <Name>yoichikavm002</Name>
    ... skip ...
    <Name>yoichikavm100</Name>
  </Roles>
</StartRolesOperation>

BODY例) 一括停止 yoichikavm[001-100]

<ShutdownRolesOperation xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <OperationType>ShutdownRolesOperation</OperationType>
  <Roles>
    <Name>yoichikavm001</Name>
    <Name>yoichikavm002</Name>
    ... skip ...
    <Name>yoichikavm100</Name>
  </Roles>
  <PostShutdownAction>StoppedDeallocated</PostShutdownAction>
</ShutdownRolesOperation>

そして、共通ヘッダとして下記の2つが必要になる。

Content-Type: application/xml
x-ms-version: 2015-04-01    << サービス管理バージョン、これは最新の2015-04-01でOK

認証については他のサービス管理APIと同様にAzure ADの使用もしくは証明書を利用した認証を行う必要がある。詳細についてはを「サービス管理要求の認証」参照いただければと思う。

LINKS