2015年6月2日火曜日

AWSのリソース使用状況レポートを自動生成しインスタンスタイプの最適化を図る【メトリクスデータ収集・整形編】

こんにちは、井下です。

スマフォのカバーをつけてから2ヵ月ほど、既に傷だらけになっているので、そろそろ買い換えようかなと思っているところです。
スマフォ自体も劣化してる部分があるのですが、デザインは気に入っているので、中身だけ取り換えたいと思っています。あまりスペックのこだわりはないのですが、そういうところ考えもあってAraには期待しています。(Araで気に入るデザインが出てからの話になりますが)

はじめに

さて、前回はカスタムメトリクスのデータを送信するバッチ・シェルについて説明しました。
今回は標準メトリクス・カスタムメトリクスからデータを収集するバッチ(バッチ2)と、データを整形するバッチ(バッチ3)について説明します。

おさらいになりますが、用意する全バッチは下表の通りです。

バッチ名 処理内容 実行周期
バッチ1インスタンス内でデータを取得し、カスタムメトリクスとしてCloudWatchへ送信します。1分ごと
シェル1バッチ1のシェル版です。Linuxのカスタムメトリクスを取得・送信したい場合は、こちらを利用します。1分ごと
バッチ2 前日分の標準メトリクス・カスタムメトリクスのデータを取得します。 日次
バッチ3 バッチ2で取得したデータをまとめ、OSSのEmbulkを利用して整形します。 月次
バッチ4 バッチ3で整形されたデータから、レポートとしてExcelのグラフを作成します。 月次


バッチ2(メトリクスデータ収集)


処理概要

バッチ実行日の前日分のメトリクスデータを収集します。
なお、収集するメトリクスのデータは下記の7つです。
  • CPU使用率(%)
  • 空メモリー容量(MByte)
  • メモリー使用率(%)
  • ロードアベレージ(個)
  • 仮想メモリー使用率(%)
  • ネットワーク受信バイト数(Byte)
  • ネットワーク送信バイト数(Byte)

パラメータ

第1パラメータ (必須):リージョンコード
第2パラメータ (必須):インスタンスID
第3パラメータ (任意):ave:平均値(省略時デフォルト)
               max:最大値

※CloudWatchでは、収集するメトリクスデータは平均値、最大値、最小値などから選択することができます。本バッチでは、maxかaveを指定します。

リターンコード

0 : 正常終了しました
1 : データが0件のメトリクスがありました
4 : パラメータの指定が不正
8 : メトリクスデータ収集に失敗しました
12: 収集したデータ出力に失敗しました

サンプルバッチ


@echo off

rem input parameters
rem %1 region code
rem %2 instance id
rem %3 get metrics value (optional)

echo ### %date% %time% get metrics batch started. region=%1,instace id=%2,metrics value code=%3.

set REGION=%1
set INSTANCEID=%2
set METRICS_VALUE_CODE=%3
set RC=0
set PADDING_TIME=%time: =0%
set TMP_FILE=%~dp0sendMet_%INSTANCEID%_%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2%%PADDING_TIME:~0,2%%PADDING_TIME:~3,2%%PADDING_TIME:~6,2%%PADDING_TIME:~9,2%.txt

if "%REGION%"=="" goto PARAM_INVALID
if "%INSTANCEID%"=="" goto PARAM_INVALID

if "%METRICS_VALUE_CODE%"=="" (
  set METRICSVALUE=Average
) else if "%METRICS_VALUE_CODE%"=="ave" (
  set METRICSVALUE=Average
) else if "%METRICS_VALUE_CODE%"=="max" (
  set METRICSVALUE=Maximum
) else (
  goto PARAM_INVALID
)

rem CloudWatchAPI need environment variables
set AWS_CLOUDWATCH_HOME="C:\CloudWatch-1.0.20.0"
set PATH=%PATH%;%AWS_CLOUDWATCH_HOME%\bin
set JAVA_HOME="C:\Program Files\Java\jre1.8.0_25"
set AWS_CREDENTIAL_FILE="XXXXXXX\credentials"

rem from A-AUTO 50 variables 
set vbsdir=C:\BSP\AUW\BIN
for /F "usebackq" %%d in (`"cscript //nologo %vbsdir%\GetDate.vbs %date% d -1"`) do set TARGET_DATE=%%d
rem 64bit version
rem for /F "usebackq" %%d in (`"C:\Windows\SysWOW64\cscript //nologo %vbsdir%\GetDate.vbs %date% d -1"`) do set TARGET_DATE=%%d

rem constants
set AWS_CLOUDWATCH_URL=http://monitoring.%REGION%.amazonaws.com

set IGNORE_STR="指定されたファイルが見つかりません。"

rem unit second(60 * 5)
set METRICS_PRIOD=300

set METRICS_START_TIME=%TARGET_DATE:~0,4%-%TARGET_DATE:~4,2%-%TARGET_DATE:~6,2%T00:00:00+09:00

for /F "usebackq" %%d in (`"cscript //nologo %vbsdir%\GetDate.vbs %date% d 0"`) do set TMP_END_TIME=%%d
rem 64bit version
rem for /F "usebackq" %%d in (`"C:\Windows\SysWOW64\cscript //nologo %vbsdir%\GetDate.vbs %date% d 0"`) do set TMP_END_TIME=%%d

set METRICS_END_TIME=%TMP_END_TIME:~0,4%-%TMP_END_TIME:~4,2%-%TMP_END_TIME:~6,2%T00:00:00+09:00

rem prefixs
set CPU_PREFIX=cpu
set NET_TRF_IN_PREFIX=network_in
set NET_TRF_OUT_PREFIX=network_out
set AVA_MEM_PREFIX=availablemem
set MEM_USAGE_PREFIX=memusage
set LOADAVE_PREFIX=loadave
set SWAPMEM_PREFIX=swap

rem export paths
set EXPORT_FOLDER=%AWS_CLOUDWATCH_HOME%\log\%TARGET_DATE:~0,6%
if not exist %EXPORT_FOLDER% mkdir %EXPORT_FOLDER%

set CPU_FILE=%EXPORT_FOLDER%\%CPU_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set NET_TRF_IN_FILE=%EXPORT_FOLDER%\%NET_TRF_IN_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set NET_TRF_OUT_FILE=%EXPORT_FOLDER%\%NET_TRF_OUT_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set AVA_MEM_FILE=%EXPORT_FOLDER%\%AVA_MEM_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set MEM_USAGE_FILE=%EXPORT_FOLDER%\%MEM_USAGE_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set LOADAVE_FILE=%EXPORT_FOLDER%\%LOADAVE_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv
set SWAPMEM_FILE=%EXPORT_FOLDER%\%SWAPMEM_PREFIX%_%INSTANCEID%_%TARGET_DATE%.csv


rem main

rem get ec2 metrics
call :getMetrics AWS/EC2 CPUUtilization Percent %CPU_FILE%
call :getMetrics AWS/EC2 NetworkIn Bytes %NET_TRF_IN_FILE%
call :getMetrics AWS/EC2 NetworkOut Bytes %NET_TRF_OUT_FILE%

rem get a-auto metrics
call :getMetrics "A-AUTO Metrics" AvailableMemory Megabytes %AVA_MEM_FILE%
call :getMetrics "A-AUTO Metrics" MemoryUsage Percent %MEM_USAGE_FILE%
call :getMetrics "A-AUTO Metrics" SwapMemory Percent %SWAPMEM_FILE%
call :getMetrics "A-AUTO Metrics" LoadAverage Count %LOADAVE_FILE%

echo ### %date% %time% get metrics datas successful.
goto END

:getMetrics
rem %1 namespace
rem %2 metrics name
rem %3 unit
rem %4 export file name

call mon-get-stats %2 --start-time %METRICS_START_TIME% --end-time %METRICS_END_TIME% --period %METRICS_PRIOD% --namespace %1 --dimensions "InstanceId=%INSTANCEID%" --statistics %METRICSVALUE% --unit %3 --delimiter "," 1> %4 2> %TMP_FILE%

if exist %4 if exist %TMP_FILE% set EXPORT_SUCCESSFUL=TRUE

rem file io error
if not "%EXPORT_SUCCESSFUL%"=="TRUE" goto EXPORT_FAILED

rem mon-get-stats failed
for /F "usebackq" %%m in (`"findstr /X /V %IGNORE_STR% %TMP_FILE%"`) do (
  type %TMP_FILE%
  goto GET_METRICS_FAILED
)

rem export successful but data noting (not error)
for %%s in (%4) do if %%~zs==0 call :EXPORT_NO_DATA %2

goto :EOF

:EXPORT_NO_DATA
echo ### %date% %time% %1 metrics no data.
set RC=1
goto :EOF

:PARAM_INVALID
echo ### %date% %time% required param empty or param3 invalid.
set RC=4
goto END

:GET_METRICS_FAILED
echo ### %date% %time% get metrics datas failed.
set RC=8
goto END

:EXPORT_FAILED
echo ### %date% %time% export file failed.
set RC=12 
goto END

:END
if exist %TMP_FILE% del %TMP_FILE%
echo ### %date% %time% get metrics batch ended(RC=%RC%).
exit %RC%

バッチ2補足


1.環境変数

CloudWatch Command Line Toolsを利用するために、バッチ1と同様環境変数の設定が必要です。
実行する環境に合わせて、サンプルバッチ内の下記の環境変数の書き換えを行ってください。
 •AWS_CLOUDWATCH_HOME :CloudWatch Command Line Toolsの配置先パス
 •JAVA_HOME               :Javaの配置先パス
 •AWS_CREDENTIAL_FILE    :CloudWatchの利用権限を持ったユーザのクレデンシャルファイル

※クレデンシャルファイルの作成方法については、前回のブログをご参照ください。

2.メトリクスデータの収集方法

バッチ2では下記の要素で絞り込んだ結果を、メトリクスデータとして収集しています。
  • 名前空間
  • メトリクス名
  • リージョンコード
  • インスタンスID
  • メトリクスデータを収集する対象時間(開始)
  • メトリクスデータを収集する対象時間(終了)
  • メトリクスデータを収集する時間間隔
  • 収集するメトリクスデータの値
  • データの単位

名前空間・メトリクス名
名前空間とメトリクス名はCloudWatchで保存されているデータの区分けです。
例えばインスタンスのCPU使用率であれば、名前空間は「AWS/EC2」、メトリクス名は「CPUUtilization」となっています。インスタンスのCPU使用率は標準メトリクスなので、名前空間とメトリクス名はあらかじめ決められており、変更することはできません。
カスタムメトリクスは、データの送信(記録)時に名前空間とメトリクス名も併せて送っているため、ユーザの任意の名称にすることができます。
なお、バッチ1(シェル1)では下記のような名前空間とメトリクス名で送信しているので、バッチ2ではそれらのカスタムメトリクスがあるものとして、固定値を利用しています。

送信したカスタムメトリクス 名前空間 メトリクス名
空メモリー容量A-AUTO MetricsAvailableMemory
メモリー使用率A-AUTO MetricsMemoryUsage
ロードアベレージ A-AUTO Metrics LoadAverage
仮想メモリー使用率 A-AUTO Metrics SwapMemory

リージョンコード・インスタンスID
メトリクスデータの収集対象となるインスタンスのリージョンコードおよびインスタンスIDです。
バッチ2ではパラメータで取得した値を利用しています。

メトリクスデータを収集する対象時間(開始)・メトリクスデータを収集する対象時間(終了)
メトリクスデータを収集する対象時間の範囲を決定します。
バッチ2では開始を実行日の前日0:00:00、終了を実行日の0:00:00としています。

なお、「実行日の前日」は別途提供するGetDate.vbsを利用して取得します。

メトリクスデータを収集する時間間隔
前述のメトリクスデータを収集する対象時間(開始)からメトリクスデータを収集する対象時間(終了)までで、メトリクスデータを収集する時間間隔を決定します。
バッチ2では5分間隔としています。

収集するメトリクスデータの値
パラメータにて説明していますが、最大値、最小値、平均値など、どんな値を収集するかを決定します。
バッチ2ではパラメータによって平均値もしくは最大値を収集するようにしています。

データの単位
メトリクスデータが複数の単位で送信されている場合、どの単位で収集するのかを決定します。
バッチ2では各メトリクスごとに固定の単位にしています。

3.出力ファイル

出力先:"環境変数「AWS_CLOUDWATCH_HOME」の指定先パス"\実行日の前日の年月

出力ファイル(リターンコードが0もしくは1の場合のみ出力します)
ファイル名ファイル内容
cpu_インスタンスID_実行日の前日(年月日).csvCPU使用率のメトリクスデータ
availablemem_インスタンスID_実行日の前日(年月日).csv空メモリー容量のメトリクスのデータ
memusage_インスタンスID_実行日の前日(年月日).csvメモリー使用率のメトリクスのデータ
loadave_インスタンスID_実行日の前日(年月日).csvロードアベレージのメトリクスのデータ
swap_インスタンスID_実行日の前日(年月日).csv仮想メモリー使用率のメトリクスのデータ
network_in_インスタンスID_実行日の前日(年月日).csvネットワーク送信バイト数のメトリクスのデータ
network_out_インスタンスID_実行日の前日(年月日).csvネットワーク受信バイト数のメトリクスのデータ


4.実行方法とタイミング

A-AUTO 50でバッチ2を日次で実行するため、下記の手順を踏んでください。

1.ジョブネットワーク情報の登録
登録方法に関しては、過去のブログをご参照ください。
バッチ2は下記の設定を行えば、日次で自動実行されます。

  • ネットワーク属性1
    • ネットワークID:任意の入力が可能ですが、バッチ2を実行することが分かるような名前にすることをお勧めします。
    • スタート時刻:バッチ2を実行する時刻を指定します。24:00~47:59の間で時刻を指定すると良いでしょう。

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


2.ネットワークスケジュールの作成
登録方法に関しては、過去のブログをご参照ください。
ネットワークネットワークIDとスケジュールIDを関連づけたスケジュールを作成します。前述の手順で登録したネットワークIDに、インストール時に用意されているスケジュールID「OPSDAILY」を関連づけてください。


Embulk利用における準備

バッチ3ではデータを整形するために、OSSのEmbulkを利用しているので、そのために必要な準備をします。

準備①:Embulkのダウンロード・exampleの実行

Git HubにてEmbulkのダウンロード方法や、exampleの実行方法が記載されているので、そちらをご参照ください。
Quick StartのTrying the exampleまで終わり、下記のような結果になっていれば、Embulkのダウンロードは正しく終えられています。

C:\embulk>embulk run config.yml
2015-05-29 18:03:03.766 +0900: Embulk v0.6.9
2015-05-29 18:03:08.891 +0900 [INFO] (transaction): Listing local files at directory 'C:\embulk\try1\csv' filtering filename by prefix 'sample_'
2015-05-29 18:03:08.899 +0900 [INFO] (transaction): Loading files [C:\embulk\try1\csv\sample_01.csv.gz]
2015-05-29 18:03:09.074 +0900 [INFO] (transaction): {done:  0 / 1, running: 0}
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,Embulk "csv" parser plugin
4,11270,2015-01-29 11:54:36,20150129,NULL
2015-05-29 18:03:09.464 +0900 [INFO] (transaction): {done:  1 / 1, running: 0}
2015-05-29 18:03:09.497 +0900 [INFO] (main): Committed.
2015-05-29 18:03:09.511 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"C:\\embulk\\try1\\csv\\sample_01.csv.gz"},"out":{}}

※Embulkのバージョンによって、表示が変わっている可能性があります。
※上記はEmbulk(V0.6.9)を「C:\Embulk」フォルダにダウンロードした表示例です。

準備②:embulk-filter-evalのインストール

データ整形を行うためのEmbulkのプラグインをインストールします。
下記のコマンドを実行します。

C:\embulk>embulk gem install embulk-filter-eval

その後、次のような結果になっていれば、embulk-filter-evalのインストールは完了しています。

2015-05-29 18:11:25.931 +0900: Embulk v0.6.9
Fetching: embulk-filter-eval-0.1.0.gem (100%)
Successfully installed embulk-filter-eval-0.1.0
1 gem installed

※Embulkおよびプラグインのバージョンによって、表示が変わっている可能性があります。

準備③:バッチ3用のymlファイルの配置

Embulkの実行には、インプットとなるファイルパスや、データの変換方法、出力先のパスを定義しているymlファイルが必要になります。
バッチ3では専用のymlファイルを利用してデータの整形を行うため、Embulkの配置先パスに「auto」フォルダを作成した後、下記のymlファイル2つを作成してください。

cloudwatch_config.ymlファイル
in:
  type: file
  path_prefix: XXX
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 0
    columns:
    - {name: date, type: string}
    - {name: value, type: double}
    - {name: unit, type: string}
filters:
  - type: eval
    eval_columns:
      - date: str = value; day = Time.gm(str[0,4], str[5,2], str[8,2], str[11,2], str[14,2], str[17,2]).getlocal; day.strftime("%Y-%m-%d %H:%M:%S");
      - value: value.round(2)
      - unit: value
    out_columns:
      - date
      - value
exec: {}
out:
  type: file
  path_prefix: YYY
  sequence_format: ""
  file_ext: .csv
  formatter:
    type: csv
    header_line: false
    charset: UTF-8
    newline: CRLF
    delimiter: ","

cloudwatch_m_config.ymlファイル
in:
  type: file
  path_prefix: XXX
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    skip_header_lines: 0
    columns:
    - {name: date, type: string}
    - {name: value, type: double}
    - {name: unit, type: string}
filters:
  - type: eval
    eval_columns:
      - date: str = value; day = Time.gm(str[0,4], str[5,2], str[8,2], str[11,2], str[14,2], str[17,2]).getlocal; day.strftime("%Y-%m-%d %H:%M:%S");
      - value: value.quo(1024).quo(1024).round(2)
      - unit: value
    out_columns:
      - date
      - value
exec: {}
out:
  type: file
  path_prefix: YYY
  sequence_format: ""
  file_ext: .csv
  formatter:
    type: csv
    header_line: false
    charset: UTF-8
    newline: CRLF
    delimiter: ","

バッチ3(データ整形)


処理概要

バッチ2で出力したファイル群をメトリクスごとにまとめ、整形されたデータを出力します。

パラメータ

第1パラメータ(必須) :インスタンスID
第2パラメータ(必須) :ファイルの出力先パス(※)

※ブランクパスを指定する場合、パスの前後を「"」で括ってください。
  また、ファイルの出力先パスとして、下記のパスは指定できません。
  • マルチバイトの含まれたパス
  • 相対パス

リターンコード

0 : 正常終了しました
4 : パラメータの指定が不正
8 : 整形する元データが不足しています
12: バッチ3用のymlファイルが見つかりません
16: Embulkによるデータの整形および出力に失敗しました

サンプルバッチ

@echo off

rem input parameters
rem %1 instance id
rem %2 export folder

echo ### %date% %time% format metrics batch started. instace id=%1,export folder=%2.

set INSTANCEID=%1
set EXPORT_FOLDER=%2
set RC=0
set PADDING_TIME=%time: =0%
set EXECUTE_TIME=%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2%%PADDING_TIME:~0,2%%PADDING_TIME:~3,2%%PADDING_TIME:~6,2%%PADDING_TIME:~9,2%

set TMP_CPU_FILE=""
set TMP_NET_TRF_IN_FILE=""
set TMP_NET_TRF_OUT_FILE=""
set TMP_AVA_MEM_FILE=""
set TMP_MEM_USAGE_FILE=""
set TMP_LOADAVE_READ_FILE=""
set TMP_SWAPMEM_FILE=""
set TMP_YML_FILE=""


if "%INSTANCEID%"=="" goto PARAM_INVALID
if "%~2"=="" goto PARAM_INVALID

rem target date
set vbsdir=C:\BSP\AUW\BIN
for /F "usebackq" %%d in (`"cscript //nologo %vbsdir%\GetDate.vbs %date% m -1"`) do set TAGRGET_MONTH=%%d
rem 64bit version
rem for /F "usebackq" %%d in (`"C:\Windows\SysWOW64\cscript //nologo %vbsdir%\GetDate.vbs %date% m -1"`) do set TAGRGET_MONTH=%%d

set TAGRGET_MONTH=%TAGRGET_MONTH:~0,6%

rem input foloder
set AWS_CLOUDWATCH_HOME="C:\CloudWatch-2010-08-01"
set INPUT_FOLDER=%AWS_CLOUDWATCH_HOME%\log\%TAGRGET_MONTH%

rem embulk path
set EMBULK_HOME=C:\embulk
set NOMAL_BASE_YML=%EMBULK_HOME%\auto\cloudwatch_config.yml
set CONVERT_MEGABYTE_BASE_YML=%EMBULK_HOME%\auto\cloudwatch_m_config.yml
set TMP_YML_FILE=%EMBULK_HOME%\auto\cloudwatch_config_%EXECUTE_TIME%.yml
set PATH=%PATH%;%EMBULK_HOME%

rem prefixs
set CPU_PREFIX=cpu
set NET_TRF_IN_PREFIX=network_in
set NET_TRF_OUT_PREFIX=network_out
set AVA_MEM_PREFIX=availablemem
set MEM_USAGE_PREFIX=memusage
set LOADAVE_PREFIX=loadave
set SWAPMEM_PREFIX=swap

rem input file name pattern
set CPU_FILES=%INPUT_FOLDER%\%CPU_PREFIX%_%INSTANCEID%_*.csv
set NET_TRF_IN_FILES=%INPUT_FOLDER%\%NET_TRF_IN_PREFIX%_%INSTANCEID%_*.csv
set NET_TRF_OUT_FILES=%INPUT_FOLDER%\%NET_TRF_OUT_PREFIX%_%INSTANCEID%_*.csv
set AVA_MEM_FILES=%INPUT_FOLDER%\%AVA_MEM_PREFIX%_%INSTANCEID%_*.csv
set MEM_USAGE_FILES=%INPUT_FOLDER%\%MEM_USAGE_PREFIX%_%INSTANCEID%_*.csv
set LOADAVE_FILES=%INPUT_FOLDER%\%LOADAVE_PREFIX%_%INSTANCEID%_*.csv
set SWAPMEM_FILES=%INPUT_FOLDER%\%SWAPMEM_PREFIX%_%INSTANCEID%_*.csv

rem export file name
set EXPORT_CPU_FILE=%EXPORT_FOLDER%\%CPU_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_NET_TRF_IN_FILE=%EXPORT_FOLDER%\%NET_TRF_IN_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_NET_TRF_OUT_FILE=%EXPORT_FOLDER%\%NET_TRF_OUT_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_AVA_MEM_FILE=%EXPORT_FOLDER%\%AVA_MEM_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_MEM_USAGE_FILE=%EXPORT_FOLDER%\%MEM_USAGE_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_LOADAVE_FILE=%EXPORT_FOLDER%\%LOADAVE_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%
set EXPORT_SWAPMEM_FILE=%EXPORT_FOLDER%\%SWAPMEM_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%

rem tmp export file name
set TMP_CPU_FILE=%EXPORT_FOLDER%\%CPU_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_NET_TRF_IN_FILE=%EXPORT_FOLDER%\%NET_TRF_IN_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_NET_TRF_OUT_FILE=%EXPORT_FOLDER%\%NET_TRF_OUT_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_AVA_MEM_FILE=%EXPORT_FOLDER%\%AVA_MEM_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_MEM_USAGE_FILE=%EXPORT_FOLDER%\%MEM_USAGE_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_LOADAVE_READ_FILE=%EXPORT_FOLDER%\%LOADAVE_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv
set TMP_SWAPMEM_FILE=%EXPORT_FOLDER%\%SWAPMEM_PREFIX%_%INSTANCEID%_%TAGRGET_MONTH%_%EXECUTE_TIME%.csv

rem main

rem gererate tmp export file
copy /b %CPU_FILES% %TMP_CPU_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %NET_TRF_IN_FILES% %TMP_NET_TRF_IN_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %NET_TRF_OUT_FILES% %TMP_NET_TRF_OUT_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %AVA_MEM_FILES% %TMP_AVA_MEM_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %MEM_USAGE_FILES% %TMP_MEM_USAGE_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %LOADAVE_FILES% %TMP_LOADAVE_READ_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

copy /b %SWAPMEM_FILES% %TMP_SWAPMEM_FILE%
if errorlevel 1 goto TMP_FILES_GENERATE_FAILED

rem export file
call :format %TMP_CPU_FILE% %EXPORT_CPU_FILE% %NOMAL_BASE_YML%
call :format %TMP_NET_TRF_IN_FILE% %EXPORT_NET_TRF_IN_FILE% %CONVERT_MEGABYTE_BASE_YML%
call :format %TMP_NET_TRF_OUT_FILE% %EXPORT_NET_TRF_OUT_FILE% %CONVERT_MEGABYTE_BASE_YML%
call :format %TMP_AVA_MEM_FILE% %EXPORT_AVA_MEM_FILE% %NOMAL_BASE_YML%
call :format %TMP_MEM_USAGE_FILE% %EXPORT_MEM_USAGE_FILE% %NOMAL_BASE_YML%
call :format %TMP_LOADAVE_READ_FILE% %EXPORT_LOADAVE_FILE% %NOMAL_BASE_YML%
call :format %TMP_SWAPMEM_FILE% %EXPORT_SWAPMEM_FILE% %NOMAL_BASE_YML%

echo ### %date% %time% format metrics successful.
goto END

:format
rem %1 input tmp file
rem %2 export file
rem %3 base yml

set INPUT_FILE=%1
set EXPORT_FILE=%2
set BASE_YML=%3

rem base yml not found
if not exist %BASE_YML% call :YML_NOT_FOUND %BASE_YML%

if exist %TMP_YML_FILE% del %TMP_YML_FILE%

setlocal ENABLEDELAYEDEXPANSION

rem tmp yml generate
for /f "usebackq delims=" %%f in (%BASE_YML%) do (
  set line=%%f
  set line=!line:XXX=%INPUT_FILE:"=%!
  set line=!line:YYY=%EXPORT_FILE:"=%!
  echo !line! >> %TMP_YML_FILE%
)

endlocal

rem export file
if exist %EXPORT_FILE% del %EXPORT_FILE%
call embulk run %TMP_YML_FILE%
if errorlevel 1 (
  call :EXPORT_FAILD %EXPORT_FILE%
)

goto :EOF

:PARAM_INVALID
echo ### %date% %time% parameter invalid.
set RC=4
goto END

:TMP_FILES_GENERATE_FAILED
echo ### %date% %time% input file read or input folder write faild.
set RC=8
goto END

:YML_NOT_FOUND
echo ### %date% %time% %1 not found.
set RC=12
goto END

:EXPORT_FAILD
echo ### %date% %time% %1 export faild.
set RC=16
goto END

:END
rem delete tmp export files
if exist %TMP_CPU_FILE% del %TMP_CPU_FILE%
if exist %TMP_NET_TRF_IN_FILE% del %TMP_NET_TRF_IN_FILE%
if exist %TMP_NET_TRF_OUT_FILE% del %TMP_NET_TRF_OUT_FILE%
if exist %TMP_AVA_MEM_FILE% del %TMP_AVA_MEM_FILE%
if exist %TMP_MEM_USAGE_FILE% del %TMP_MEM_USAGE_FILE%
if exist %TMP_LOADAVE_READ_FILE% del %TMP_LOADAVE_READ_FILE%
if exist %TMP_SWAPMEM_FILE% del %TMP_SWAPMEM_FILE%
if exist %TMP_YML_FILE% del %TMP_YML_FILE%

echo ### %date% %time% format metrics batch ended(RC=%RC%).
exit %RC%

バッチ3補足


1.環境変数

バッチ3ではEmbulkを利用することと、整形する元データとして、バッチ2で作成したパスを取得するため、2つの環境変数を設定します。
実行する環境に合わせて、サンプルバッチ内の下記の環境変数の書き換えを行ってください。
 •AWS_CLOUDWATCH_HOME :CloudWatch Command Line Toolsの配置先パス
 •EMBULK_HOME            :Embulkの配置先パス


2.Embulkによるデータ整形内容

Embulkによって、下記のデータ整形を行います。

  • 元データのメトリクスデータから小数点第2位以降のカット
  • 元データの時間をGMT時間から現地時間へ変換
  • 元データの単位がByteのメトリクスデータを、ByteからMByteに変換
  • 元データの単位の情報を削除

3.出力ファイル

出力先:第二パラメータの指定先

出力ファイル(リターンコードが0の場合のみ出力します)
ファイル名ファイル内容
cpu_インスタンスID_実行日の前月(年月).csvCPU使用率のメトリクスデータ(整形済・1ヵ月分)
availablemem_インスタンスID_実行日の前月(年月).csv空メモリー容量のメトリクスのデータ(整形済・1ヵ月分)
memusage_インスタンスID_実行日の前月(年月).csvメモリー使用率のメトリクスのデータ(整形済・1ヵ月分)
loadave_インスタンスID_実行日の前月(年月).csvロードアベレージのメトリクスのデータ(整形済・1ヵ月分)
swap_インスタンスID_実行日の前月(年月).csv仮想メモリー使用率のメトリクスのデータ(整形済・1ヵ月分)
network_in_インスタンスID_実行日の前月(年月).csvネットワーク送信バイト数のメトリクスのデータ(整形済・1ヵ月分)
network_out_インスタンスID_実行日の前月(年月).csvネットワーク受信バイト数のメトリクスのデータ(整形済・1ヵ月分)


4.実行方法とタイミング

A-AUTO 50によって、月次で実行するようにスケジューリングしてください。
注意点として、バッチ3は元データを"「CloudWatch Command Line Toolsの配置先パス」\実行日の前月の年月"から取得します。
例えば、2015年5月に実行した場合、"「CloudWatch Command Line Toolsの配置先パス」\201504"内のファイルを元データとして見なします。
実行イメージとして、1ヵ月分のメトリクスデータが"「CloudWatch Command Line Toolsの配置先パス」\201504"に保存されていて、2015年5月1日などに実行することで、2015年4月のメトリクスデータをまとめ・整形されたファイルが7ファイル(メトリクスの数)作成されます。


A-AUTO 50でバッチ3を月次で実行するためには、下記の手順を踏んでください。

1.スケジュール情報を作成する
登録方法に関しては、過去のブログをご参照ください。

「ホリデーID」にはインストール時に用意しているカレンダー「OPSHOLT1」を指定します。
月次で動かすため、「処理サイクル」は「月次」とし、「標準処理日」には毎月月末に実行するのであれば、「最終日」を指定してください。




2.ジョブ実行ユーザ切り替え機能の準備
バッチ3の実行は「embulk-filter-eval」をインストールしたユーザでのみ正常に動作します。
バッチ3を適切なユーザで実行するため、ジョブ実行ユーザ切り替え機能を利用する必要があります。
※A-AUTO 50では、ジョブを実行するユーザを指定していない場合、ローカルシステムアカウントでジョブが実行されます。

ジョブ実行ユーザ切り替え機能を利用するために、下記の手順で準備を行ってください。

  1. ジョブ実行ユーザ切り替え機能
  2. ジョブ実行ユーザ切り替え機能を利用するためには
  3. 実行するジョブにユーザアカウント情報を設定する
  4. 実行したジョブのユーザアカウントの確認
※以降の説明では、ジョブ実行ユーザIDに「USER1」を用います

3.ジョブネットワーク情報の登録
登録方法に関しては、過去のブログをご参照ください。
バッチ3は下記の設定を行えば、月次で自動実行されます。

  • ネットワーク属性1
    • ネットワークID:任意の入力が可能ですが、バッチ3を実行することが分かるような名前にすることをお勧めします。
    • ジョブ実行ユーザID:ジョブ実行ユーザ切り替え機能の準備で作成した、ジョブ実行ユーザIDを指定します。
  • 先行ネットワーク
    • バッチ2の手順で作成したジョブネットワークIDを選択します。
  • ジョブ
    • ジョブ番号:001~999の任意の入力が可能ですが、バッチ3のみを実行する場合は特に数字を気にする必要はありません。(複数のジョブ実行する場合の実行順序の設定です)
    • ジョブコード:バッチ3のジョブ名を指定します。なお、8桁まで入力が可能です。例として、バッチ3を「forMet.bat」とした場合、「FORMET」と入力します。
    • マックスリターンコード:「1」を指定します。ここで指定した数値未満の値であれば、正常終了と見なします。
    • ノーマル実行時のジョブ引渡しパラメータ:バッチ3の実行時のパラメータを指定します。必要なパラメータは前述の「パラメータ」をご参照ください。
    • リラン実行時のパラメータ :ノーマル実行時の引渡しパラメータと同様の入力をしてください。こちらは異常終了時からの再実行時の入力パラメータとなります。


4.ネットワークスケジュールの作成
登録方法に関しては、過去のブログをご参照ください。
前述の手順で作成した「スケジュールID」と「ジョブネットワークID」を関連付けます。


次回はバッチ3で出力したメトリクスデータを元に、Excelレポートを作成します。

最後に付録として、バッチ2・バッチ3で利用している「GetDate.vbs」の内容を記載します。

「GetDate.vbs」は作成後、「A-AUTO 50のダウンロード先」\AUW\BINに配置してください。
※デフォルト設定でインストールした場合、「C:\BSP\AUW\BIN」になります。

GetDate.vbs
Set inputParams = Wscript.Arguments
baseDate = inputParams(0)
kind = inputParams(1)
value = inputParams(2)

res = Replace(DateAdd(kind, value, baseDate), "/", "")

WScript.Echo res


0 件のコメント:

コメントを投稿