2015年6月23日火曜日

Azureのインスタンスサイズの変更をスケジューリングしインスタンスサイズを最適化する

こんにちは。

また鷲尾です。


私は車が好きなんですが、最近の新型デミオ、非常にかっこいいです。
マツダの鼓動デザイン、いいですねぇ。クリーンディーゼルの伸びるような加速に、同じBセグメントの中では群を抜く欧州車に勝るとも劣らないエクステリアの良さ。ガゾリン車にはガソリン車の良さがありますが、このデミオの真価は ・・・ 

すみません、ここらへんでやめておきましょう。


さて、本題に戻ります。

以前、Azureのインスタンスを自動で起動・停止をして、コストを最適化しましょうという内容のブログでもご紹介したように、Azureでは、インスタンスを使用していた時間で課金がされます。
しかし、実は使用するインスタンスの"サイズ"によっても課金額が変わり、またこのインスタンスサイズは自由に変更することができるのです。

通常の運用では、提供するサービスを安定的に提供するために、日々の監視実績データを基にサービスへの負荷状況の分析を行い、システムリソースの調整を行われると思います。

しかし、「この時間帯だけアクセスが集中して負荷がかかる」、「スペックを上げて処理をしたい」という時期にその都度手動でインスタンスサイズを変更していたとしたら、それは効率がいいとはいえませんよね。

一般的に、クラウド環境で処理能力を向上させる手段としては、「スケールアウト」と「スケールアップ」がありますが、今回は、負荷が高まるサイク ルと、どれくらいのスペックが必要であるかを分析結果から導き出した際に、「スケールアップ」で対応するといった際の自動化について説明していき ます。

サイクルとしては、例えば「毎週金曜日の特定の時間帯(数時間)」、「毎月特定の期間(数日間)」「毎年特定の期間(1、2カ月のみ)」といったように、様々なサイクルが考えられます。

特に、決まったシーズンだけ、手動でインスタンスのスケールアップをしているという方は、有効にご活用いただけます。


構成は、インスタンスサイズを変更するスクリプトとそれを呼び出すバッチファイルを用意し、その実行をA-AUTO 50で制御する下記のようにシンプルな構成です。





ここからはインスタンスサイズの変更スクリプトとバッチのサンプル、そしてA-AUTO 50への登録方法について記載します。今回Windows PowerShellで作成するスクリプトは、スクリプト単体でも動作しますが、今回は自動化のためにA-AUTOとの連携を行うので、バッチファイルからPowerShellを呼び出す構成としています。

作成するファイルは、以下の2つです。
・インスタンスサイズ変更バッチ(インスタンスサイズ変更スクリプトの呼び出しを行います)
CHANGEAZ.bat

・インスタンスサイズ変更スクリプト
ChangeInstanceSize.ps1


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


なお、インスタンスサイズ変更スクリプトを実行するためには、事前にAzureの認証(クレデンシャル)が済んでいる必要があります。
クレデンシャルの認証については、以前のブログ(3.認証情報(クレデンシャル)の設定と、動作確認)をご参照ください。

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






インスタンスサイズ変更バッチ(CHANGEAZ.bat)

インスタンスサイズ変更バッチのサンプルはこちらからダウンロードできます。

◆処理概要
必須パラメータ(クラウドサービス名、インスタンス名、インスタンスサイズ名)の数のチェック後、インスタンスサイズ変更スクリプト(ChangeInstanceSize.ps1)を呼び出し、処理結果を返却します。

◆パラメータ
第1パラメータ(必須):クラウドサービス名
第2パラメータ(必須):インスタンス名
第3パラメータ(必須):インスタンスサイズ名

◆リターンコード
必須パラメータが入力されているかどうかはバッチで判断しますが、他の判断はすべてスクリプトでおこなっているため、リターンコード4以外はChangeInstanceSize.ps1からの戻り値を返却します。

0
正常終了(ChangeInstanceSize.ps1からの戻り値を返却)
1
現在のインスタンスサイズと、パラメータで指定したインスタンスサイズが同じなので、インスタンスサイズを変更せずに終了した(ChangeInstanceSize.ps1からの戻り値を返却)
4
必須パラメータが指定されていない
8
パラメータのクラウドサービス名、もしくはインスタンス名が不正(ChangeInstanceSize.ps1からの戻り値を返却)
12
パラメータのインスタンスサイズが不正(ChangeInstanceSize.ps1からの戻り値を返却)
14
インスタンスサイズの変更に失敗(ChangeInstanceSize.ps1からの戻り値を返却)
16
インスタンスの再開に失敗(ChangeInstanceSize.ps1からの戻り値を返却)

◆サンプルバッチ
CHANGEAZ.bat
@echo off
set date1=%date%
set time1=%time: =0%
set dt1=%date1% %time1%

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

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

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

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


%PowerShellPath%powershell.exe -NoProfile -command "%ScriptPath%ChangeInstanceSize.ps1 %1 %2 %3 ;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 IinstanceSize change batch ended (RC=%RC%). ServiceName=%1,Name=%2,InstanceSize=%3
exit %RC%


※1 3番目に指定する引数であるインスタンスサイズは、以下の一覧の中から選択してください。(2015年6月現在)

ExtraSmall, Small, Medium, Large, ExtraLarge, A5, A6, A7, A8, A9, A10, A11
Basic_A0, Basic_A1, Basic_A2, Basic_A3, Basic_A4
Standard_D1, Standard_D2, Standard_D3, Standard_D4
Standard_D11, Standard_D12, Standard_D13, Standard_D14Standard_DS1, Standard_DS2, Standard_DS3, Standard_DS4, Standard_DS11, Standard_DS12, Standard_DS13, Standard_D14
Standard_G1, Standard_G2, Standard_G3, Standard_G4, Standard_G5,


最新の指定出来るインスタンス一覧は、Microsoftのポータルから確認してください。


※2 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など異なることもありますので、パスの名前を確認してください。
また、PowerShellの実行ポリシーの設定方法や、PowerShellのバージョンについては、以前のブログ(3章、4章、5章 自動化するための前提 "Windows PowerShellのバージョンについて")をご参照ください。

※3 スクリプトファイルの保存先を指定してください。
サンプルはA-AUTO 50のバッチファイル格納ディレクトリと同一にしています。
なお、スクリプトファイルのパスの指定は、絶対パスで指定してください。


【インスタンスサイズ変更スクリプト(ChangeInstanceSize.ps1)】

インスタンスサイズ変更スクリプトのサンプルはこちらからダウンロードできます。

◆処理概要
下記の順序でインスタンスサイズの変更及びその前後処理を行います。
なお、下線の引かれた処理は、インスタンスサイズを変更する直前のインスタンスの稼動状態が”ReadyRole”だった場合にのみ行います。

1. パラメータで指定されたクラウドサービスの存在を確認する
2. パラメータで指定されたインスタンスの存在を確認する
3. 現在のインスタンスサイズを確認する
4. 現在のインスタンスの実行状態を確認する
5. インスタンスのサイズを変更する
6. インスタンスが起動状態だった場合、サイズ変更後に再度インスタンスの実行状態を確認する

パラメータ
第1パラメータ(必須):クラウドサービス名
第2パラメータ(必須):インスタンス名
第1パラメータ(必須):インスタンスサイズ名

リターンコード
0
正常終了
1
現在のインスタンスサイズと、パラメータで指定したインスタンスサイズが同じなので、インスタンスサイズを変更せずに終了した
8
パラメータのクラウドサービス名、もしくはインスタンス名が不正
12
パラメータのインスタンスサイズが不正
14
インスタンスサイズの変更に失敗
16
インスタンスの起動再開に失敗

サンプルスクリプト
ChangeInstanceSize.ps1
Param(
  $SERVICENAME,
  $NAME,
  $SIZE
 )

 #各変数と定数の定義
$SIZE_CHECK_COUNT = 0
$STATUS_CHECK_COUNT = 0
$CHECK_STATUS_FLG = 0
set-variable -Name SIZE_CHECK_LOOP -Value 10 -Option Constant
set-variable -Name STATUS_CHECK_LOOP -Value 10 -Option Constant
set-variable -Name SIZE_CHECK_SPAN -Value 30 -Option Constant
set-variable -Name STATUS_CHECK_SPAN -Value 30 -Option Constant

#リターンコードの定義
set-variable -Name ALREADY_CHANGED_INSTANCE_SIZE_RC -Value 1 -Option Constant
#パラメータの空白チェックはバッチで行っている RC = 4
set-variable -Name PARAM_INVALID_RC -Value 8 -Option Constant
set-variable -Name INSTANCE_SIZE_INVALID_RC -Value 12 -Option Constant
set-variable -Name CHANGE_INSTANCE_SIZE_FAILD_RC  -Value 14 -Option Constant
set-variable -Name INSTANCE_START_ERROR_RC -Value 16 -Option Constant


#サブルーチン定義

#タイムスタンプを付与してメッセージを出力
function ECHO_TIME_MESSAGE ($MESSAGE)
{
    $TIME = get-date -Format "yyyy/MM/dd HH:mm:ss"
    echo "$TIME $MESSAGE"
}

#インスタンスサイズ変更後インスタンス起動確認
function CHANGED_SIZE_AFTER_CHECK()
{
    ECHO_TIME_MESSAGE "### InstanceSize changes are complete, and InstanceStatus check again."
    while ($STATUS_CHECK_COUNT -lt $STATUS_CHECK_LOOP)
    {
        # 30秒スリープ
        Start-Sleep -s $STATUS_CHECK_SPAN
               
        #タイムスタンプとともにメッセージを出力
        ECHO_TIME_MESSAGE "### Checking InstanceStatus..."

        # 結果を変数に格納
        $AZUREVMINFO = (Get-AzureVM -ServiceName $SERVICENAME -Name $NAME)
        $MESSAGE = "### InstanceSize = " + $AZUREVMINFO.InstanceSize + "  :  InstanceStatus = " + $AZUREVMINFO.InstanceStatus
    
        ECHO_TIME_MESSAGE $MESSAGE       
                
        if($AZUREVMINFO.InstanceStatus -eq "ReadyRole")
        {
            CHANGE_INSTANCE_SIZE_SUCCESSFUL
        }

        $STATUS_CHECK_COUNT++
           
        ECHO_TIME_MESSAGE "### InstanceStatus check count = $STATUS_CHECK_COUNT"

    }



    ~ 省略 ~



#インスタンスサイズ変更
$ERROR.Clear()
Get-AzureVM -ServiceName $SERVICENAME -Name $NAME| Set-AzureVMSize –InstanceSize $SIZE | Update-AzureVM

#不正なインスタンスサイズを指定していないかの確認
if ($ERROR.count -ne 0)
{
    INSTANCE_SIZE_INVALID $SIZE
}

ECHO_TIME_MESSAGE "### InstanceSize changing..."

#インスタンスサイズの変更確認
while ($SIZE_CHECK_COUNT -lt $SIZE_CHECK_LOOP)
{
    # 30秒スリープ
    Start-Sleep -s $SIZE_CHECK_SPAN
    
    #コマンドを実行した時間を取得
    ECHO_TIME_MESSAGE "### Checking InstanceSize..."
   
    # 結果を変数に格納
    $AZUREVMINFO = (Get-AzureVM -ServiceName $SERVICENAME -Name $NAME)
    $MESSAGE = "### InstanceSize = " + $AZUREVMINFO.InstanceSize + "  :  InstanceStatus = " + $AZUREVMINFO.InstanceStatus
    ECHO_TIME_MESSAGE $MESSAGE
   
    if ($AZUREVMINFO.InstanceSize -eq $SIZE)
    {
        #インスタンスサイズ変更前が起動状態であった場合
        if ($CHECK_STATUS_FLG -eq 1)
        {
            CHANGED_SIZE_AFTER_CHECK $STATUS_CHECK_COUNT $STATUS_CHECK_LOOP $STATUS_CHECK_SPAN
        }
        CHANGE_INSTANCE_SIZE_SUCCESSFUL
    }

    $SIZE_CHECK_COUNT++
   
    ECHO_TIME_MESSAGE "### InstanceSize check count = $SIZE_CHECK_COUNT"

#インスタンスサイズの変更に失敗  
CHANGE_INSTANCE_SIZE_FAILD 



A-AUTO 50への登録方法

A-AUTO 50でインスタンスタイプ変更バッチの実行をスケジューリングする手順について説明します。
なお、以下のような利用想定ケースで登録を行うものとします。

  • 平時のインスタンスサイズは"Basic_A0"で十分
  • 11月1日からはインスタンスサイズを"Standard_D1"にしたい
  • 1月の最終日にはインスタンスサイズを"Basic_A0"に戻したい
※毎月決まった日(期間)にインスタンスサイズを変更する等他のスケジューリングも可能です

この場合、"11月1日にインスタンスサイズをStandard_D1にするネットワークスケジュール"(いつ・何をやるかの組合せ)と、"1月の最終日にインスタンスサイズをBasic_A0にするネットワークスケジュール"を作成します。
ネットワークスケジュールを作成するために、スケジュール情報とジョブネットワーク情報を作成し、それらを関連付けます。

1.スケジュール情報の登録

A-AUTO 50により、いつ実行するかを定義します。
"11月1日"に実行するスケジュールは、下記のように登録してください。
  • スケジュール
    • スケジュールID:任意の入力が可能ですが、インスタンス変更バッチの実行スケジュールだと分かるような名前にすることをお勧めします。
    • ホリデーID:定義済みのホリデーID「OPSHOLT2」を選択します。なお、いつが休日にあたるかは指定したホリデーIDによって定義されています。会社固有の休日や、祝日などを考慮したい場合、こちらの9章を参考にしてカレンダーを作成してください。(OPSHOLT2は土曜日と日曜日を休日としています)
    • 処理パターン:「カレンダー」を選択します
    • 処理サイクル:「毎年」を選択します
    • シフトパターン:「当日」を選択します。これでジョブの実行がと休日であろうと、ジョブを実行します。

  • 標準処理日
    • 標準処理日:「2015年11月1日」を指定します




    "1月の最終日"に実行するスケジュールは、下記のように登録してください。
    • スケジュール
      • スケジュールID:任意の入力が可能ですが、インスタンスタイプ変更バッチの実行スケジュールだと分かるような名前にすることをお勧めします。
      • ホリデーID:定義済みのホリデーID「OPSHOLT2」を選択します。なお、いつが休日にあたるかは指定したホリデーIDによって定義されています。会社固有の休日や、祝日などを考慮したい場合、こちらの9章を参考にしてカレンダーを作成してください。(OPSHOLT2は土曜日と日曜日を休日としています)
      • 処理パターン:「カレンダー」を選択します
      • 処理サイクル:「毎年」を選択します
      • シフトパターン:「当日」を選択します。これでジョブの実行日が休日であろうと、ジョブを実行します。

    • 標準処理日
      • 標準処理日:「2016年1月最終日」を指定します




    2.ジョブネットワーク情報の登録

    A-AUTO 50により、何のジョブを実行するのかを定義します。
    インスタンスタイプ変更バッチでインスタンスタイプを"Standard_D1"にするジョブネットワークは、下記のように登録してください。
    • ネットワーク属性1
      • ネットワークID:任意の入力が可能ですが、インスタンスタイプ変更バッチを実行することが分かるような名前にすることをお勧めします。
      • スタート時刻:インスタンスタイプ変更バッチを実行する時刻を指定します。


    • ジョブ
      • ジョブ番号:001~999の任意の入力が可能ですが、インスタンスタイプ変更バッチのみを実行する場合は特に数字を気にする必要はありません。(複数のジョブ実行する場合の実行順序の設定です)
      • ジョブコード:インスタンスタイプ変更バッチのジョブ名を指定します。なお、8桁まで入力が可能です。例として、インスタンスタイプ変更バッチを「CHANGEAZ.bat」とした場合、「CHANGEAZ」と入力します。
      • マックスリターンコード:「2」を指定します。ここで指定した数値未満の値であれば、正常終了と見なします。
      • ノーマル実行時のジョブ引渡しパラメータ:インスタンスタイプ変更バッチの実行時のパラメータを指定します。1つ目のパラメータにはクラウドサービス名、2つ目のパラメータにはインスタンス名を入力し、3つ目のパラメータにはセットしたいインスタンスサイズ名"Standard_D1"を入力します。
      • リラン実行時のパラメータ :ノーマル実行時の引渡しパラメータと同様の入力をしてください。こちらは異常終了時からの再実行時の入力パラメータとなります。

    なお、インスタンスサイズ変更バッチでインスタンスサイズを"Basic_A0"にするジョブネットワークは、"ジョブ"の"ノーマル実行時のジョブ引渡しパラメータ"および"リラン実行時のパラメータ"の3つ目のパラメータを"Basic_A0"にすることで登録できます。

    3.ネットワークスケジュール情報の登録

    前述の手順で作成したスケジュールとジョブネットワークを関連付けます。
    ネットワークスケジュール画面から、ネットワークに関連付けたいスケジュールをそれぞれ選択します。





    以上で、A-AUTO 50を利用してAzureのインスタンスサイズの変更を自動化することができました。




    0 件のコメント:

    コメントを投稿