Works blog仕事の取り組み・ビジョン
2015.08.31
AWS(Amazon Web Service) CloudWatch
はじめに
AWSのインスタンスをAPI及びSDKを使用して、サーバ状態を取得するための、Javaを利用した使い方の手順をまとめます。
サーバ状態を取得するには、「CloudWatch」の機能を利用します。
制限事項
CloudWatchには、制限事項があります。
API
インストール
●Windowsの場合
下記ページより、ダウンロードし、ウィザードに従ってインストールしてください。
Install the AWS CLI Using the MSI Installer (Windows)
→32bit版:Download the AWS CLI MSI installer for Windows (32-bit)
64bit版:Download the AWS CLI MSI installer for Windows (64-bit)
●Mac / Linuxの場合
1:ダウンロード
※ダウンロードは任意のフォルダで行ってください。
1 | $ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" |
2:解凍
1 | $ unzip awscli-bundle.zip |
3:インストール
1 | $ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws |
●インストール後の確認
インストール後、バージョン情報が表示されれば、インストールが成功しています。
1 2 | $ aws --version aws-cli/1.7.42 Python/2.7.6 Darwin/14.4.0 |
設定
AWSのAPIやSDKを使用する場合、認証情報をローカルに保存することができます。
1:AWSのページから、アクセスキーIDと秘密アクセスキーを取得します。
※取得方法は、下記を参考にしてください。
2:1で取得した、アクセスキーIDと秘密アクセスキーを元に認証情報を作成します。
1 2 3 4 5 | $ aws configure AWS Access Key ID [None]: {アクセスキーID} AWS Secret Access Key [None]: {秘密アクセスキー} Default region name [None]: ap-northeast-1 Default output format [None]: json |
※リージョンの「ap-northeast-1」は『東京』となります。
※出力書式は、「json」を指定しています。他にも、「table」「text」を指定できます。
※認証情報は、下記のフォルダに保存されます。
●Windowsの場合
%USERPROFILE%¥.aws
●Mac / Linuxの場合
~/.aws
SDK
インストール
下記ページより、SDKをダウンロードし、任意のフォルダに配置後、パスを通してください。
Java
CloudWatchのクライアント
AWSのCloudWatchにアクセスするため、クライアントのインスタンスを作成します。
■ローカルマシンの認証情報を使用する場合
1 2 | AmazonCloudWatch cw = new AmazonCloudWatchClient(new DefaultAWSCredentialsProviderChain()); |
参照:DefaultAWSCredentialsProviderChain
■任意の認証情報を使用する場合
1 2 3 | AmazonCloudWatch cw = new AmazonCloudWatchClient(new BasicAWSCredentials({アクセスキー}, {秘密アクセスキー})); |
リージョンの設定
使用しているサービスが動作しているリージョン(地域)を設定します。
1 2 | Region apNorthEast1 = Region.getRegion(Regions.AP_NORTHEAST_1); cw.setRegion(apNorthEast1); |
参照:Regions
リクエストデータの設定
統計情報を取得するリクエストを作成します。
■統計情報リクエストの作成
1 2 | GetMetricStatisticsRequest getMetricStatisticsRequest = new GetMetricStatisticsRequest(); |
■メトリック(統計情報)の設定
どのメトリックを取得するかを指定します。
1 2 | getMetricStatisticsRequest.setNamespace({名前空間}); getMetricStatisticsRequest.setMetricName({メトリック}); |
※{名前空間} -> 利用するサービスの名前空間を指定します。
{メトリック} -> 取得したいメトリックを指定します。
EC2:EC2のメトリック一覧
RDS:RDSのメトリック一覧
■ディメンション(次元)の設定
取得したメトリックのディメンションを設定することで、統計情報をフィルタリングし、必要な情報の精度をあげます。
★EC2の場合
EC2のインスタンスでフィルタリングする場合
1 2 3 4 5 6 | Collection<Dimension> dimensions = new ArrayList<Dimension>(); Dimension dimension = new Dimension(); dimension.setName("InstanceId"); dimension.setValue(instanceId); dimensions.add(dimension); getMetricStatisticsRequest.setDimensions(dimensions); |
★RDSの場合
RDSのインスタンスでフィルタリングする場合
1 2 3 4 5 6 | Collection<Dimension> dimensions = new ArrayList<Dimension>(); Dimension dimension = new Dimension(); dimension.setName("DBInstanceIdentifier"); dimension.setValue(instanceId); dimensions.add(dimension); getMetricStatisticsRequest.setDimensions(dimensions); |
■取得する統計結果の設定
統計結果のうちどの統計結果を取得するかを設定します。
1 2 3 4 5 6 7 | Collection<String> statistics = new ArrayList<String>(); statistics.add("SampleCount"); statistics.add("Average"); statistics.add("Sum"); statistics.add("Minimum"); statistics.add("Maximum"); getMetricStatisticsRequest.setStatistics(statistics); |
参照:取得可能な統計結果
■期間の設定
統計情報を取得する期間を設定します。
CloudWatchの制限事項及び、統計情報の取得頻度を検討し、期間を決定します。
設定できる期間は、最短1分から最長1日です。
1 2 3 4 | getMetricStatisticsRequest.setStartTime( new Date(date.getTime() - (3600 * 1 * 1000))); getMetricStatisticsRequest.setEndTime(new Date()); getMetricStatisticsRequest.setPeriod(3600); |
また、1時間をn分割した統計を取得する場合は、Periodを設定します。
参照:期間
統計結果データの取得
■統計結果の取得
リクエストデータを送信し、統計結果を取得します。
1 2 | GetMetricStatisticsResult getMetricStatisticsResult = cw.getMetricStatistics(getMetricStatisticsRequest); |
1 | List<Datapoint> dataPoints = getMetricStatisticsResult.getDatapoints(); |
参照:Datapoint
■統計結果の並び替え
取得した統計結果は、残念ながら日付順に並んでいません。
そのため、自前で日付順に並び替えたほうがその後のデータが扱いやすいかもしれません。
1 2 3 4 5 6 7 8 9 | Collections.sort(dataPoints, new DataPointComparator()); private class DataPointComparator implements Comparator<Datapoint> { @Override public int compare(Datapoint o1, Datapoint o2) { return (int) (o1.getTimestamp().getTime() - o2.getTimestamp().getTime()); } } |
まとめ
SDKを利用し、AWSのサーバ状態を監視することが可能となりました。
あとは、取得したデータを利用して、統計グラフを作成するも良し、閾値を設けて警告メールを自分宛てに送信するも良し、利用方法は色々有ると思います。
また、SDKで利用できる機能は、これ以外にもまだまだありますので、色々試してみてください。