PowerShellで最新のCloudWatchメトリックスを表示する

PowerShell

この記事は公開されてから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の場合、以下のようにインスタンスを停止していた期間のデータは存在しないため、スクリプトでもデータを取得する事は出来ません。

1

参考

以下のページを参考にさせて頂きました。ありがとうございます。
Discussion Forums(Using CloudWatch cmdlets from PowerShell SDK)
AWS Tools for Windows PowerShell Cmdlet Reference

おわりに

Windowsを使った運用の参考になれば、幸いです。 くコ:彡