PowerShellで最新のCloudWatchメトリックスを表示する
はじめに
こんにちは、あべいかです。 早速ですが、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を使った運用の参考になれば、幸いです。 くコ:彡