2015年6月1日月曜日

AzureVMの起動・停止自動化によるコストの最適化【コマンドレット利用編】

みなさんこんにちは。
鷲尾です。

本日は第2回目【コマンドレット利用編】となります。

前回までのあらすじ
(第1回目はこちら → AzureVMの起動・停止自動化によるコストの最適化【準備編】
  • Windows Azure PowerShellをダウンロード、インストール
  • Azure PowerShellでコマンドレットが利用できるように認証
  • Get-AzureVMコマンドで、動作確認


今回は実際に起動・停止それぞれのスクリプトとそれを呼び出すバッチを書いて、実行していきます。

※ここでは検証用環境として、クラウドサービス名に「TestCS-001」、AzureVM名に「TestVM-001」を使用します。


5.使用するコマンド
今回使用するコマンドは、以下の3つです。

  • Get-AzureVM    -  指定したAzureVMの一覧や、ステータスを取得します。
  • Start-AzureVM   -  指定したAzureVMを起動します。
  • Stop-AzureVM  -  指定してAzureVMを停止します。コマンド末尾に"-force"オプションをつけることで、コンファームオプションを省略することが出来ます。


6.起動用バッチと起動用スクリプト
今回Windows PowerShellで作成するスクリプトは、スクリプト単体でも動作しますが、今回は自動化のためにA-AUTOとの連携を行うので、バッチファイルからPowerShellを呼び出す構成としています。

作成するファイルは、以下の4つです。

・起動用バッチファイル
・起動用スクリプトファイル
・停止用バッチファイル
・停止用スクリプトファイル

それでは順に説明していきます。
※ダウンロードする各種サンプルは、2015年6月現在のインターフェースを基に記載しています。提供元でインターフェースが変更されるとことがありますので、最新の情報は各提供元でご確認ください。


【起動用バッチ:STARTAZ.bat】
起動用バッチのサンプルはこちらからダウンロードできます。
起動用バッチの概要は、以下のとおりです。

◆処理概要
パラメータの数をチェックし、StartAz.ps1からのリターンコードを受け取ります。
また、起動用スクリプトからの戻り値をA-AUTO 50へ返却します。

◆パラメータ
クラウドサービス名と、AzureVM名の2つのパラメータを用意します。
第1パラメータ:クラウドサービス名(必須)
第2パラメータ:AzureVM名(必須)

◆リターンコード
0:正常に終了した(AzureVMが正常に起動した)
1:起動しようとしたAzureVMが既に起動していた
4:必須パラメータが入力されていない
8:AzureVMの起動に失敗した



STARTAZ.bat
@echo off
set date1=%date%
set time1=%time: =0%
set dt1=%date1% %time1%

echo %dt1:~0,19% ### AzureVM start batch started. ServiceName=%1,Name=%2
cd %~dp0
set PowerShellPath=C:\Windows\SysWOW64\WindowsPowerShell\v1.0\(※1)
set ScriptPath=C:\BSP\AUW\INSTALL\PRIMSCRIPT\(※2)

if "%1"=="" (
  goto PARAM_INVALID
)

if "%2"=="" (
  goto PARAM_INVALID
)

%PowerShellPath%powershell.exe -NoProfile -command "%ScriptPath%StartAz.ps1 %1 %2 ;exit $LASTEXITCODE"

set RC=%ERRORLEVEL%
goto END

:PARAM_INVALID
set date2=%date%
set time2=%time: =0%
set dt2=%date2% %time2%
echo %dt2:~0,19% ### parameter invalid.
set RC=4
goto END

:END
set date3=%date%
set time3=%time: =0%
set dt3=%date3% %time3%
echo %dt3:~0,19% ### AzureVM start batch ended (RC=%RC%). ServiceName=%1,Name=%2
exit %RC%


※1 PowerShellのパスを設定する際は、ご自身の環境に合わせて、以下のように設定します。

【32ビットOSの場合】
    C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe 
     
    【64ビットOSの場合】
    C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe 

    64ビットOSでの注意点
    A-AUTO モニタは32ビットアプリケーションのため、32ビット版のpowershell.exeのパスを指定してください。
なお、OSによってパス中のSysnativeの部分が、SysWOW64など異なることもありますので、パスの名前を確認してください。


※2 スクリプトファイルの保存先を指定してください。

サンプルはA-AUTO 50のバッチファイル格納ディレクトリと同一にしています。


【起動用スクリプトファイル:StartAz.ps1】
起動用スクリプトのサンプルはこちらからダウンロードできます。
起動用スクリプトの概要は、以下のとおりです。

◆処理概要
起動用バッチから受け取ったパラメータを使用して、指定したサービス名とAzureVM名が実在するかどうかをチェックし、AzureVMが停止していれば起動コマンドを発行します。
起動コマンド発行後、指定回数以内(サンプルでは30秒毎に10回ステータスを確認します)にAzureVMが起動できたかチェックし、起動結果を返却します。

◆パラメータ
クラウドサービス名と、AzureVM名の2つのパラメータを受け取ります。
第1パラメータ:クラウドサービス名
第2パラメータ:AzureVM名

◆リターンコード
0:正常に終了した(AzureVMが正常に起動した)
1:起動しようとしたAzureVMが既に起動していた
4:必須パラメータが入力されていない
8:AzureVMの起動に失敗した



StartAz.ps1
Param(
  $servicename,
  $vmname
 )

$cnt = 0
$checkloop = 10
$checkspan = 30
$VM_STARTED_RC = 0
$ALREADY_STARTING_VM_RC = 1
$PARAM_INVALID_RC = 4
$FAILD_VM_START_RC = 8

#サブルーチン定義

#インスタンス起動完了
function VM_STARTED($FinTime)
{
    echo "$FinTime ### VM start successful."
    RETURN_END $VM_STARTED_RC
}

#既にインスタンスが起動していた
function ALREADY_STARTING_VM($ReceiveVMname,$FinTime)
{
    echo "$FinTime ### Start-AzureVM not called because vm name $ReceiveVMname was allready running."
    RETURN_END $ALREADY_STARTING_VM_RC
}

#クラウドサービス名が不正
function NOT_FOUND_CLOUDSERVICE($ReceiveServicename,$FinTime)
{
    echo "$FinTime ### No deployment found in service: $ReceiveServicename"
    RETURN_END $PARAM_INVALID_RC
}

#インスタンス名が不正
function NOT_FOUND_VM($ReceiveVMname,$FinTime)
{
    echo "$FinTime ### $ReceiveVMname is not exist."
    RETURN_END $PARAM_INVALID_RC
}

#一定時間内にインスタンスの起動が確認できなかった
function FAILD_VM_START($FinTime)
{
    echo "$FinTime ### VM start failed."
    RETURN_END $FAILD_VM_START_RC
}

#バッチへリターンコードを返却
function RETURN_END($ReturnBatchRC)
{
    EXIT $ReturnBatchRC
}


#メイン処理

#クラウドサービスから情報取得
$azurevminfo = (Get-AzureVM -ServiceName $servicename)

#クラウドサービスの存在確認
if ($azurevminfo.length -eq 0)
{
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss:ss"
    NOT_FOUND_CLOUDSERVICE $servicename $time
}

#インスタンスの存在確認
$azurevminfo = (Get-AzureVM -ServiceName $servicename -Name $vmname)
if ($azurevminfo.length -eq 0)
{
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
    NOT_FOUND_VM $vmname $time
}
   
#クラウドサービス、インスタンス名がともに正しい
#インスタンスステータス確認
if ($azurevminfo.InstanceStatus -ne "StoppedDeallocated")
{
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
    ALREADY_STARTING_VM $vmname $time
}

#インスタンス起動
Start-AzureVM -ServiceName $servicename -Name $vmname
$time = get-date -Format "yyyy/MM/dd HH:mm:ss"
echo "$time ### VM starting..."

#起動確認(<)
while ($cnt -lt $checkloop)
{
    # 30秒スリープ
    Start-Sleep -s $checkspan
    
    # 結果を変数に格納
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
    echo "$time ### Checking vm status..."
    $azurevminfo = (Get-AzureVM -ServiceName $servicename -Name $vmname)
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
    $str1 = "$time ### VM status : "        
    $str2 = $str1 + $azurevminfo.InstanceStatus
    echo $str2
    if ($azurevminfo.InstanceStatus -eq "ReadyRole")
    {
       $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
       VM_STARTED $time
    }
    $cnt++
    $time = get-date -Format "yyyy/MM/dd HH:mm:ss"
    echo "$time ### VM status check count = $cnt"

#スタートに失敗  
$time = get-date -Format "yyyy/MM/dd HH:mm:ss"     
FAILD_VM_START $time 



【停止用バッチファイル:StartAz.ps1、停止用スクリプトファイル:StartAz.ps1】
停止用バッチ、停止用スクリプトは基本的に起動用ファイルと動作は変わらないので、説明は割愛します。なお、各ファイルの詳細はサンプルを参照してください。

停止用バッチのサンプルはこちらからダウンロードできます。
停止用スクリプトのサンプルはこちらからダウンロードできます。



※ バッチサンプル、スクリプトサンプルの拡張子は、".txt"となっています。
使用する際は、それぞれ以下のようにリネームしてご利用ください。

 ・起動
 STARTAZ.txt  → STARTAZ.bat
 StartAz.txt   → StartAz.ps1
 
 ・停止
 STOPAZ.txt  → STOPAZ.bat
 StopAz.txt    → StopAz.ps1



◆手作業による実行
それでは、A-AUTO 50と連携させる前に、手動でバッチファイルとスクリプトファイルを実行して、正しく動作することを確認してみましょう。





STARTAZ.bat内の青字の部分(パス)を"StartAz.ps1"が置かれているディレクトリに設定し、コマンドプロンプトから引数を渡して実行してみます。
※なお、A-AUTOからではなくコマンドプロンプトから動作確認する場合のみ、バッチファイルの末尾に"pause"を追記し、結果を確認できるようにしてください。


例:Cドライブに作成した"AZTESTフォルダ"に配置したStartAz.ps1を実行する場合

STARTAZ.bat(動作確認時)
@echo off
set date1=%date%
set time1=%time: =0%
set dt1=%date1% %time1%

echo %dt1:~0,19% ### AzureVM start batch started. ServiceName=%1,Name=%2

set PowerShellPath=C:\Windows\SysWOW64\WindowsPowerShell\v1.0\
set ScriptPath=C:\AZTEST\   


以下省略


pause

exit %RC%




正常に実行されたことを確認してください。


AzureVMをバッチとスクリプトから起動・停止するだけであればこれで終了ですが、今回は完全自動化を目指しますので、もうひと踏ん張りします。




7.A-AUTO 50と連携して完全自動化する
ここからはA-AUTO 50との連携による、お客様のカレンダーに沿った自動スケジュールの設定について説明していきます。
A-AUTO 50との連携を行うためには、以下の順にA-AUTO 50を操作し、実行するための情報を設定してください。

操作内容
1.カレンダーの作成
2.スケジュール情報の登録
3.ジョブ実行ユーザの作成
4.ジョブネットワーク情報の登録
5.ネットワークスケジュールの作成
6.バッチファイル、スクリプトファイルの配置
7.AzureVMの起動・停止の監視



7-1 カレンダーの作成
「カレンダーの作成」に関しては過去のブログの内容と重複していますので、"AWS EC2インスタンス起動・停止自動化によるコストの最適化【自動化編】"の「9.カレンダーの作成」を参考に設定してください。


7-2 スケジュール情報の作成
「スケジュール情報の作成」に関しても過去のAWSでの自動化記事の内容と重複していますので、"AWS EC2インスタンス起動・停止自動化によるコストの最適化【自動化編】"の「10.スケジュール情報の登録」を参考に設定してください。


7-3 ジョブ実行ユーザ切り替え機能
Azureのコマンドレットを使用する場合、認証を行ったWindowsユーザからコマンドを発行する必要があります。つまり、A-AUTO 50から起動するバッチジョブの実行アカウントが認証時のユーザIDである必要があります。
A-AUTO 50が実行するバッチジョブのアカウントを指定して実行させる機能として"ジョブ実行ユーザ切り替え機能"を用意しているので、こちらを利用します。
※A-AUTO 50では、ジョブを実行するユーザを指定していない場合、ローカルシステムアカウントでジョブが実行されます。

ジョブ実行ユーザ切り替え機能は、以下の順序どおりに参照して使用してください。

1.ジョブ実行ユーザ切り替え機能
2.ジョブ実行ユーザ切り替え機能を利用するためには
3.実行するジョブにユーザアカウント情報を設定する
4.実行したジョブのユーザアカウントの確認

今回は、認証時のユーザIDで実行するためのジョブ実行ユーザを"USER01"という名前で作成するものとして、以降の説明を記載します。


7-4 ジョブネットワーク情報の登録
ジョブネットワークの情報を登録します。
ここでは、AzureVMの起動・停止を行うバッチジョブをスケジュールされた日の何時に実行するか指定します。

ジョブネットワーク情報は、マスタメンテナンスメニュー[ネットワーク]を選んで表示される[ネットワーク定義一覧]から登録します。

[新規作成]ボタンをクリックして、AzureVMの起動・停止用のジョブに関する情報を作成します。




A-AUTOでは、インスタンスの起動・停止を行う”ジョブの情報”をネットワーク(※1)に登録します。
※1 A-AUTO の処理の単位をネットワークと呼びます

以降で登録内容を説明していきます。 ※ 細かな設定は省略します


先ずは、[新規登録]ボタンをクリックして表示されたダイアログの[ネットワーク属性1]タブの指定について説明します。


  • ネットワークID :
    任意のIDを入力してください(想像できるIDがよいかと思います)
  • ネットワーク略称 :
    登録するネットワークが何用であるかが後から分かるようなコメントを入力します
  • スタート時刻 :
    インスタンスを起動または停止する時刻を指定します
    なお、起動の場合は、インスタンスを利用する時刻が9:00であれば、8:50など少し前の時刻を指定するのがよいでしょう。
    上記サンプルでは、8:45としていますが、理由は[ネットワーク属性2]の設定と関連します
  • ジョブ並行処理 :
    1つのネットワークで複数のジョブを登録し、それらジョブを平行実行させたい場合にチェックします。
    今回は、1ジョブでもチェックをつけておいて下さい。
  • ジョブ実行ユーザID
  • ネットワークを実行するジョブ実行ユーザIDを指定します。   
    "7-1 ジョブ実行ユーザ機能"で作成した、ジョブ実行ユーザIDを指定します。


次に[ネットワーク属性2]タブの指定について説明します。
※ [ネットワーク属性2]タブの設定は必須ではありません



設定例


ここでは、以下の2つの項目を指定します

  • スタート遅延監視時刻 :
    指定の時刻を過ぎてもネットワークが起動されなたったときに、Webクライアントにアラート通知します。
  • エンド遅延監視時刻 :
    指定の時刻を過ぎてもネットワークが正常終了しなかったときに、Webクライアントにアラート通知します。

上記設定を行うことで、異常終了はしていないが、業務に影響を及ぼす可能性があるといった処理遅延に関する警告のアラートを上げさせることができます。



最後に[ジョブ]タブで、実行するバッチファイルの情報を登録します。
[ジョブ]タブを選択すると以下のような画面が表示されるので、ここで実際に実行するジョブ(バッチファイル)の情報を登録します。




[新規登録]ボタンをクリックすると1つのジョブ情報を登録する画面が表示されます。
ここでは、以下の情報を登録してください。


  • ジョブ番号 :
     001~999の任意の数字を指定します
    ※ 複数ジョブ登録する際は、ユニークかつ登録済みジョブのジョブ番号よりも大きい数字を指定する必要があります
  • ジョブコード :
    実際に実行するバッチファイルの拡張子を除いたファイル名を指定します
    この画面では8桁以下のファイル名のみ指定可能です
    作成したバッチファイルは
     STARTAZ.bat 、STOPAZ.bat ですので、
     ◆起動であれば、STARTAZ
     ◆停止であれば、STOPAZ
       を指定します
  • マックスリターンコード :
    実行するバッチジョブのリターンコードによってジョブを異常終了扱いとするリターンコードを指定します
    今回作成したバッチファイルのリターンコード仕様では、正常とみなしてよいリターンコードは0と1なので、2を指定します
    ※この指定例では、リターンコードが2以上であれば異常終了扱いとなります
  • ノーマル実行時のジョブ引渡しパラメータ :
    バッチファイルに渡すパラメータを指定します
    今回作成したバッチファイルの必須パラメータは、”クラウドサービス名”、”AzureVM名”ですので、これを順番に指定します。
  • リラン実行時のパラメータ :  バッチファイルに渡すパラメータを指定します
    基本的にノーマル実行時のジョブ引渡しパラメータと同じです。
    ジョブが異常終了した後に再実行(リラン)するときに渡すパラメータを指定します



これで、実行するジョブと、ジョブに引き渡すパラメータ、異常終了の判定の設定が完了しました。
[適用]ボタンをクリックして登録内容を保存します。

登録が完了すると下図のように[ジョブ]タブの一覧に追加されます。


※複数のAzureVMの起動や停止をまとめて行いたいときは、その分繰り返してジョブを登録します








最後に、[適用]ボタンをクリックしてネットワークの登録を完了させます。

これでインスタンスを起動するジョブネットワーク情報の登録が完了しました。
登録が完了すると作成したネットワーク情報が一覧に追加されます。



停止時のネットワークも同様に登録します。




7-5 ネットワークスケジュールの作成
最後に、登録したネットワークとスケジュールの情報を関連付けることで、ネットワークのスケジュールを自動生成させます。(これをネットワークスケジュールと呼びます)

ネットワークスケジュールは、マスタメンテナンスメニュー[ネットワークスケジュール]を選んで表示される[ネットワークスケジュール]から作成します。

ネットワークスケジュール一覧で初期表示するネットワークは、既にネットワークIDとスケジュールIDの関連付けが行われているネットワーク群が表示されます。

このため、関連付けが行われていないネットワーク一覧を表示するよう表示対象の切り替えを行います。
※ 関連付けが行われていないネットワークへの表示切り替えは、画面右上に並んだ5つのアイコンのうち、左から2つ目のアイコンをクリックします。





画面を切り替えると、先ほど登録した2つのネットワークIDが表示されます。(上図)



ネットワークIDとスケジュールIDの関連付けを行うために、一覧に表示されているネットワークIDのリンクをクリックします。
⇒ クリックすると下のような画面が表示されます。



















この画面で、手順7-2で作成したスケジュールIDを選択し、未選択スケジュールIDから選択済みスケジュールIDに移動してください。(ここでは、スケジュールID:AZURE@SCHEDULEを使用)


※ ネットワークのスケジュール・シミュレーション
スケジュールIDを選択すると、右側のカレンダーでネットワーク(ジョブ)がいつ実行予定となるかスケジュール・シミュレーション結果を表示します。
⇒ 緑色の背景色がスケジュールされる日付を意味しています

これでよろしければ、[適用]ボタンをクリックし、関連付けを保存し、ネットワークスケジュールを生成します。
関連付けを行ったネットワークが関連付け済みの一覧に表示され、1年間分のスケジュールが自動生成されています。





ここまでで、AzureVMの起動・停止の自動化に必要な情報の登録は完了です。
ここではAzureVMの起動を行うバッチの設定のみ行いましたが、停止を行うバッチも同じ要領で登録します。


7-6 バッチファイルの配置
予め作成したバッチファイル(STARTZA.bat ・STOPAZ.bat) とスクリプトファイル(StartAZ.ps1、StopAz.ps1) を以下の場所に配置します。

ファイル配置先  :  [インストールディレクトリ]\AUW\INSTALL\PRIMSCRIPT

※インストーラのデフォルトでインストールした場合は ”C:\BSP\AUW\INSTALL\PRIMSCRIPT”となります

※ 標準では、実行するバッチファイルは、このディレクトリに配置する必要があります


7-7  AzureVMの起動・停止の監視
A-AUTO 50をインストールした直後は、毎朝8:30にネットワークスケジュールでスケジュールされている当日分のネットワークを自動でキューイング(※3)する設定となっています。
また、業務監視ウィンドウで当日分のネットワークを監視できるようにする処理(ファイル転送)が8:45に実行されるようになっています。

従って、翌日の8:45を過ぎれば登録したネットワークの実行状況を監視していただくことが可能となります。


※3キューイングとは
スケジュールされているネットワーク群中から当日実行予定のネットワークに関する情報を実行制御を司るコンポーネントサービス(A-AUTO free)に引き渡す行為をキューイングと呼びます


先ずは、当日分のデータを表示するために、監視データの表示日付を当日に合わせます。
画面右上に並んだ6つのアイコンの一番左側のアイコンをクリックします。




ネットワーク監視メニューが表示されるので、表示日付を当日に合わせ[表示]ボタンをクリックします


そうすると、以下のように監視画面にキューイングされているネットワークが表示されます。
※以下の例では、既にAzureVMを起動するネットワークが実行しています。


ネットワーク詳細

ステータス列でネットワークの状況を表示します。
 キューイング済み : 実行待ちの状態
 実行中       : 実行中の状態
 正常終了      : 実行が正常に終了した状態
 異常終了      : 実行は終了したが、ジョブが正常に実行されていない


ジョブ(ここではSTARTAZ.bat)が実行されるとステータスが変わっていくので、正しく実行されたかどうか確認できます。




ネットワークが正常終了しなかったときに、『ジョブのリターンコードを確認する』、『ジョブログを確認する』といったオペレーションもWebクライアントから行えます。

監視画面からネットワークIDをクリックすると詳細画面が表示されるので、ジョブ詳細情報から、 終了コードを確認し、特定のジョブを選択したうえで、ジョブログを表示できます。



◆ジョブ詳細サンプル




◆ジョブログ表示サンプル



お疲れ様でした。
以上でA-AUTO 50との連携は完了です。
AzureVMの停止も同じ要領で設定することが出来ますので、これでスケジュールに合わせてお好きなタイミングでAzureVMの起動・停止を制御することができるようになりました。
起動・停止を制御できることによって、以下の様なメリットが考えられます。

  • 毎週月曜~金曜日といった曜日指定の自動化ではなく、お客様または部署ごとの営業日(カレンダー)に従った詳細な起動・停止スケジュールの自動化が行えます。
  • 起動・停止日といったスケジュールの調整や、当日の停止時刻の変更をマスタに手を加えずに画面から実施することができます。
  • 正常に実行できたか、異常や遅延があればA-AUTO 50が管理者の方に通知することができます。
  • ジョブログで異常終了時の問題点の確認が行えます。


Azureを使用するための認証等で若干の手間はかかるものの、A-AUTO 50と連携させてAzureVMの起動・停止が行えると、コストの削減に直結します。

また、今回は行っていませんが、あるデータが整ったときにAzureVMを起動してバッチ処理を実行する。また、バッチ処理が正常終了したらAzureVMを停止するといった、ファイルトリガーや業務間の先行関係を用いた自動化なども行っていただけます。


0 件のコメント:

コメントを投稿