ラベル コマンドレット の投稿を表示しています。 すべての投稿を表示
ラベル コマンドレット の投稿を表示しています。 すべての投稿を表示

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と連携させる前に、手動でバッチファイルとスクリプトファイルを実行して、正しく動作することを確認してみましょう。


2015年5月27日水曜日

AzureVMの起動・停止自動化によるコストの最適化【準備編】

みなさんこんにちは。

社内のボウリング大会で米5キロがあたって歓喜している鷲尾です。


さて、みなさん「Azure」はご存知ですよね。
Azureとは、Microsoftが提供するクラウドサービスのことです。


先月のブログでAWSインスタンスの起動・停止自動化について書きましたが、今回はAzureVMの起動・停止自動化について書いていきます。

AWSではインスタンスを起動している間は料金がチャージされ、停止している間は料金はかからないというものでしたが、Azureも基本的には同じ要領で課金されます。

しかしAzureは、AWSとくらべて課金に関して少し癖があります。
それは、「VM(インスタンス)が停止していても、リソースの割り当てが解除されていない限り、課金は継続される」というものです。

例えば、AzureにもAWSのコンソール画面のように、「ポータル」と呼ばれるWebページがあります。このポータルから該当のインスタンスをシャットダウンした場合は、課金されません。
しかし、リモートデスクトップなどで実際にインスタンスにログインしている状態で、「OSの中から」シャットダウンした場合、実は課金の対象になってしまうんです。
これは気をつけなければいけませんね。

インスタンスを課金されないようにシャットダウンするには、ポータルから直接操作する他に、Microsoftで用意されている「コマンドレット」を使用し、WindowsPowerShellから該当のインスタンスをシャットダウンさせるという方法があります。

そこで今回は、このコマンドレットとWindowsPowerShellを使って、A-AUTO 50でAzureVMの起動・停止を自動化していきたいと思います。






ボリュームがあるので、2回に分けて書きたいと思います。

第1回:準備編
第2回:コマンドレット利用編(A-AUTO設定含む)


なお、本連載では、社内環境からAzure上に作成したWindows Server 2012R2のVMの起動・停止を行います。ローカル環境からだとファイアウォールの設定などが原因で外部へアクセスできないという場合は、常時稼働するAzureVMから操作する形をとっていただければと考えます。

・接続元(ローカル環境)
Windows Server 2008R2

・接続先(Azure)
Windows Server 2012R2
※ AzureのVMは、MicrosoftAzureの公式サイトからMicrosoftアカウントでポータルにログイン後、種類やサイズを自由に設定して作成することができます。


ということで、ここから第1回目の「準備編」の内容に入っていきます。

準備編
AzureVMの起動・停止を制御するためには、AzureVMをコマンドレットで制御するための「Windows Azure PowerShell」、実際に起動処理もしくは停止処理を行うスクリプトファイルMicrosoftアカウントによる認証が必要です。
また、A-AUTOからPowerShellを実行するためのバッチファイルを用意します。

準備編では、AzureVMの起動・停止を行うために必要となる事前準備と、動作確認を行います。AzureVMを操作するには別途Windows Azure PowerShellという別のソフトウェアが必要です。このソフトウェアをインストールすることで、Azure上のVMに自由にコマンドを実行することが出来ます。
※Windows Azure PowerShellインストール後は、Windows PowerShellからも、コマンドレットを実行できるようになります。


ということで、第1回目の目標は、「Windows Azure PowerShellからAzureVMにコマンドを実行できるようにするところまで」です。


それでは以下の順に説明していきます。

1.Windows Azure PowerShellとは
2.Windows Azure PowerShellのダウンロードとインストール
3.認証情報(クレデンシャル)の設定と、動作確認
4.Windows PowerShellの実行ポリシー設定
5.自動化するための前提


1.Windows Azure PowerShellとは

"Azure PowerShell は、Azure のワークロードの展開と管理の制御および自動化に使用できる強力なスクリプト環境です。Windows PowerShell を使用したことがあるかないかにかかわらず、仮想マシンのプロビジョニング、仮想ネットワークおよびクロスプレミス ネットワークの設定、Azure でのクラウド サービスの管理を始めるための手順が示されます。(公式サイトより)"

→  ・・・ちょっとわかりにくいですね。簡単に言うと、AzureVMを操作するためにいろいろなものが揃っている、Windows PowerShellの強化版 みたいな感じです。Windows Azure PowerShellをインストールすると、Windows Azure PowerShellもしくはWindows PowerShell上から、コマンドレットを使ってAzureVMを操作することが出来ます。操作範囲も、Azureのポータル画面から行えることは基本的に行うことが出来ます。


2.Windows Azure PowerShellのダウンロードとインストール
(1)ダウンロード
Windows Azure PowerShellを、公式ページからダウンロードします。
"インストール"をクリックするとダウンロードが始まるので、任意の場所にダウンロードします。




(2)インストール
ダウンロードしたファイルを実行すると、自動的にWeb Platform Installerが起動し、Windows Azure PowerShellがインストールされます。
※前提となるWindows PowerShellのバージョンについては、「5.自動化するための前提」を参照のこと。




【インストール】をクリック



【同意する】をクリック



インストール欄が【インストール済み】になっていることを確認




上図のように、Web Platform Installerで"Windows Azure PowerShell"のインストール欄が"インストール済み"になっていれば、Windows Azure PowerShellのインストールは完了です。

続いて、認証情報の設定を行います。


3.認証情報(クレデンシャル)の設定と、動作確認
Windows Azure PowerShellをインストールしただけでは、コマンドは実行できません。コマンドレットを使うためには、操作を行うマシン内のWindows Azure PowerShellからあらかじめ認証を行っておく必要があります。この時に使用する認証情報のことをクレデンシャル(credential)といいます。

認証方法には、大きく2パターンあります。