この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、あべいかです。 早速ですが、AWS Tools for Windows PowerShellを使って、最新のCloudWatchメトリックスを表示するスクリプトを作成しました。
前提条件
検証環境
Windows8での動作確認を行いました。
- Windows 8
- Powershell Version 4.0
- AWS Tools for Windows PowerShell Version 3.1.40.0
初期設定
必要に応じて、初期設定(AWS-CLIでいう「aws configure」コマンド相当)が必要です。
> Initialize-AWSDefaults -AccessKey ****** -SecretKey ****** -Region ap-northeast-1
スクリプト
実行方法
> .\get-cw-metrics.ps1 NameSpace MetricName Statistics StartRange Period DimensionName DimensionValue
実行例
EC2インスタンスのCPU使用率を取得します。 現在時刻〜9000秒前の300秒毎の平均値を取得し、最新の値とタイムスタンプを表示します。
> .\get-cw-metrics.ps1 AWS/EC2 CPUUtilization Average 9000 300 InstanceId i-abcdefgh
2016/02/01 10:34:00 0.132
>
コード
# 変数定義
$Namespace = $args[0]
$MetricName = $args[1]
$Statistics = $args[2]
$StartRange = $args[3] * -1
$Period = $args[4]
$dimension = New-Object Amazon.CloudWatch.Model.Dimension
$dimension.set_Name($args[5])
$dimension.set_Value($args[6])
# メトリックスを取得する
$result = Get-CWMetricStatistics -Namespace $Namespace -MetricName $MetricName -Statistics $Statistics -Period $Period -Dimensions @($dimension) -StartTime (Get-Date).AddSeconds($StartRange).ToUniversalTime() -EndTime (Get-Date).ToUniversalTime()
# データをタイムスタンプ順にソートする
$result = $result.Datapoints | Sort-Object timestamp
# 最新のデータとタイムスタンプを表示する
if( $null -ne $result ){
# resultに結果が格納された場合
$result[-1].Timestamp.ToString() + "`t`t" + $result[-1].$Statistics
}
else{
# resultが空の場合
Write-Host "指定期間にデータはありません。"
}
2016/2/2 修正 $resultの判定を修正しました。ご指摘ありがとうございました。 修正前 if( $result[-1].$Statistics -ne $null ){ 修正後 if( $result -is [array]){
2016/2/10 修正 $resultの判定を再度修正しました。 修正前の状態ではデータが1つの場合、判定がfalseになっておりました。 修正前 if( $result -is [array]){ 修正後 if( $null -ne $result ){
説明
Get-CWMetricStatisticsコマンドの結果を変数に代入すると(13行目)、データは以下のように格納されます。 データはタイムスタンプと関係なく、格納されるようです。 データをタイムスタンプ順にソートするため「Sort-Object timestamp」(16行目)を実行します。
> $result.Datapoints
Average : 0.134
Maximum : 0
Minimum : 0
SampleCount : 0
Sum : 0
Timestamp : 2016/02/01 12:07:00
Unit : Percent
Average : 0.166
Maximum : 0
Minimum : 0
SampleCount : 0
Sum : 0
Timestamp : 2016/02/01 11:57:00
Unit : Percent
(略)
単一のデータを表示したい場合、「$result.Datapoints[0].Timestamp」、「$result.Datapoints[0].Average」のように指定します。 また、ソート後のデータの[-1](最後の値)を指定する事で、最新データを表示出来ます。
> $result.Datapoints[0].Timestamp
2016年2月1日 12:07:00
> $result.Datapoints[0].Average
0.134
>
コマンドの結果が「指定期間にデータはありません。」の場合、CloudWatchにデータが無い場合が考えられます。 CloudWatchのマネージメントコンソールからグラフを確認し、メトリックスが送信されている事を確認の上、適切な「StartRange」を設定して下さい。 EC2の場合、以下のようにインスタンスを停止していた期間のデータは存在しないため、スクリプトでもデータを取得する事は出来ません。
参考
以下のページを参考にさせて頂きました。ありがとうございます。 Discussion Forums(Using CloudWatch cmdlets from PowerShell SDK) AWS Tools for Windows PowerShell Cmdlet Reference
おわりに
Windowsを使った運用の参考になれば、幸いです。 くコ:彡