この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
t.hondaです。EC2のディスクの使用率をプログラムにて取得してみたので、その方法についてです。とはいっても、ディスクの使用率自体はCloudWatchのメトリクスで取得し、プログラムからはメトリクスを参照する形となります。今回はAWS SDK for Javaを使いましたが、その他の言語でも処理の概要は変わらないかと思います。
CloudWatchの設定
CloudWatchにメトリクスを追加する方法については、以下のサイトが詳しいので、そちらを参照してください。
Amazon ClouldWatchで始めるAWSのリソース監視、はじめの一歩
簡単に行うことを纏めると
- ディスク使用率などを取得するためのスクリプトをEC2にインストール
- cronで上記のスクリプトを定期的に実行するように設定
- Management Consoleでディスク使用率などが取得できるかを確認
となります。
ディスク使用率を取得するプログラム
では、プログラムです。このような感じとなります。
package cloudwatchsample;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
import com.amazonaws.services.cloudwatch.model.Datapoint;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsRequest;
import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsResult;
import com.amazonaws.services.cloudwatch.model.ListMetricsRequest;
import com.amazonaws.services.cloudwatch.model.ListMetricsResult;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
*
* @author
*/
public class CloudWatchSample {
private final static String ACCESS_KEY = "Your Access Key";
private final static String SECRET_ACCESS_KEY = "Your Secret Key";
private final static String MONITORING_END_POINT = "your monitoring end point";
private final static String NAME_SPACE = "System/Linux";
private final static String METRIC_NAME = "DiskSpaceUtilization";
private final static String INSTANCE_ID = "Your Instance Id";
private final static String FILE_SYSTEM = "/dev/xvda1";
private final static String MOUNT_PATH = "/";
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY);
AmazonCloudWatchClient client = new AmazonCloudWatchClient(awsCredentials);
client.setEndpoint(MONITORING_END_POINT);
getMetrics(client);
getMetricsStatistics(client);
}
private static void getMetricsStatistics(AmazonCloudWatchClient client){
GetMetricStatisticsRequest request = new GetMetricStatisticsRequest();
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.HOUR, -1);
request.setStartTime(c.getTime());
request.setEndTime(new Date());
request.setNamespace(NAME_SPACE);
request.setMetricName(METRIC_NAME);
request.setPeriod(60);
Collection<Dimension> dimensions = new ArrayList<>();
dimensions.add(new Dimension().withName("InstanceId").withValue(INSTANCE_ID));
dimensions.add(new Dimension().withName("Filesystem").withValue(FILE_SYSTEM));
dimensions.add(new Dimension().withName("MountPath").withValue(MOUNT_PATH));
request.setDimensions(dimensions);
Collection<String> statistics = new ArrayList<>();
statistics.add("Average");
request.setStatistics(statistics);
GetMetricStatisticsResult result = client.getMetricStatistics(request);
System.out.println(result.getLabel());
List<Datapoint> dataPoints = result.getDatapoints();
dataPoints.stream().forEach((p) -> {
Date timeStamp = p.getTimestamp();
Double avg = p.getAverage();
System.out.println(timeStamp.getTime()+" : "+avg);
});
}
private static void getMetrics(AmazonCloudWatchClient client){
ListMetricsRequest request = new ListMetricsRequest();
request.setNamespace(NAME_SPACE);
request.setMetricName(METRIC_NAME);
ListMetricsResult list = client.listMetrics(request);
list.getMetrics().stream().forEach((m) -> {
System.out.printf("metricsName=%s, namespace=%s, dimension=%s%n", m.getMetricName(), m.getNamespace(), m.getDimensions());
});
}
}
大きく分けて、今回使う定数の固まり、main処理、今回呼び出すメトリクスを取得するgetMetrics()、メトリクスよりディスクの使用率を取得するgetMetricsStatistics()に分かれます。
定数の「MONITORING_END_POINT」の値については、以下のリンクより該当するCloudWatchのendpointの値を探して記述してください。
「NAME_SPACE」「METRIC_NAME」に設定すべき値は、Management ConsoleのCloudWatchのグラフから確認できます。
main()では、Credentialsのインスタンス、およびCloudWatchのインスタンスを作成しています。今回はCredentialsのAccess Key、Secret Access Keyを定数で保持していますが、本来はアプリ内に持たないのが良いでしょう。
参考 [AWS SDKs]ローカル開発環境でのアクセスキー/シークレットキーの管理について
AWS Simple Icons 2.2 16
getMetrics()では、今回呼び出すメトリクスについての情報を取得しています。ディスクの使用率を取得するという目的からすれば、おまけの機能ですね。
最後に、getMetricsStatistics()でディスクの使用率を取得しています。今回は直近1時間の60秒ごとの値を取得しています。またdimensionsリストにメトリクスのDimensionを設定していますが、これは上記のgetMetrics()で取得出来ているので、実際には定数で持つ必要はないかもしれません。
このアプリを実行すると、実行結果が以下のように出力されます。
metricsName=DiskSpaceUtilization, namespace=System/Linux, dimension=[{Name: Filesystem,Value: /dev/xvda1}, {Name: InstanceId,Value: xxxxxx}, {Name: MountPath,Value: /}]
DiskSpaceUtilization
1417075800000 : 28.175787425903
1417074300000 : 28.1755412360601
1417074900000 : 28.1756397119973
1417077000000 : 28.1760336157459
1417074600000 : 28.1756397119973
1417076100000 : 28.175787425903
1417076700000 : 28.1758366638716
1417074000000 : 28.1755412360601
1417075500000 : 28.175787425903
1417077300000 : 28.1759351398088
1417076400000 : 28.1758366638716
1417075200000 : 28.1756397119973
getMetrics()で取得したメトリクスの情報、getMetricsStatistics()で取得したディスクの使用率が、無事表示されています。
まとめ
今回はCloudWatchよりディスクの使用率を取得しましたが、その他の監視したい値も取得できるはずです。その辺は要件に合わせて変えてみてください。
参考サイト
Amazon ClouldWatchで始めるAWSのリソース監視、はじめの一歩
Amazon CloudWatch Java API