以前、DynamoDBをIAMでアクセス制限の記事を紹介しました。
我々の業務では、実際のテーブル設計に比べ運用後のリソース管理が気になります。
DynamoDBの良いところはスループットが保障されるというところがありますが、設定した値が
保障されると言う意味であり、その値が適切でない場合は当然レスポンスが悪くなってしまいます。
また、それを恐れるあまり、値を大きくしてしまうと、後々請求額に驚くことになります。

スループットの値は変更が効きます。
そこで今回はDynamoDBの稼動統計を行うために情報取得をしてみます。

○情報取得方法

AWSでは稼動情報を見る事ができるCloudWatchという機能があります。
こちらはEC2やRDS等AWSで扱っているサービスの情報を全て取得できるので、
動きがおかしいと思った時は、ManagementConsoleからグラフ化されたものを見る事もできます。
しかし、稼動統計を行う場合は、定期的に情報を取得しておく必要があります。
そこでコマンドラインツールを使用し、データ取得をしてみます。

○準備

AWSのサイトより「Amazon CloudWatch Command Line Tool」をDownloadします。
今回、Linux(CentOS)を使用するため、DownloadしたzipファイルをEC2に格納します。
格納先は/usr/localとします。

/usr/local以下でzipファイルを解凍します。

# cd /usr/local
# unzip CloudWatch-2010-08-01.zip
# rm -f CloudWatch-2010-08-01.zip

使い易いようにバージョン情報が入っているディレクトリ名を変更します。

# mv CloudWatch-1.0.13.4 CloudWatch

AWSにアクセスするためのアクセスキー用ファイルをコピーします。

# cp -p CloudWatch/credential-file-path.template ~/credential.txt

コピー後にファイルを編集します。
アクセスキー及びシークレットアクセスキーは事前にManagementConsole等で確認しておきます。
尚、ファイルの中身は下記の通りです。

AWSAccessKeyId=
AWSSecretKey=

中身を他人に見られないようパーミッションを変更します。

# chmod 600 ~/credential.txt

環境変数の設定です。
(これらは.bashrcに記載しておくと良いと思います)

export AWS_CLOUDWATCH_HOME=/usr/local/CloudWatch
export PATH=$PATH:$AWS_CLOUDWATCH_HOME/bin
export AWS_CREDENTIAL_FILE=~/credential.txt
export AWS_CLOUDWATCH_URL=https://monitoring.ap-northeast-1.amazonaws.com

以上で準備は完了です。

○情報取得

今回用意したツールでは、情報取得以外にアラームの設定等も可能です。
ここで、統計情報を取得する事が今回の目的となるため、下記の二種類のコマンドを紹介します。

・mon-get-stats
実際に情報を取得するコマンドです。

・mon-list-metrics
どのようなMetricがあるのかを確認(一覧表示)するコマンドです。

それでは、、実際に情報を取得してみます。
まずはmon-list-metricsで一覧を取得します。

# mon-list-metrics

結果は長いため省略します。
DynamoDBのRequestLatencyを取得するため、一覧から下記のものを対象とする事とします。

SuccessfulRequestLatency AWS/DynamoDB {Operation=GetItem,TableName=test_table}
SuccessfulRequestLatency AWS/DynamoDB {Operation=PutItem,TableName=test_table}
SuccessfulRequestLatency AWS/DynamoDB {Operation=UpdateItem,TableName=test_table}

mon-get-statsを使用して情報を取得してみます。
取り込み易いようにカンマ区切りにします。

# mon-get-stats SuccessfulRequestLatency 
--statistics "Average,Sum,Minimum,Maximum"
--namespace "AWS/DynamoDB"
--dimensions "Operation=PutItem,TableName=test_table"
awk '{print $1 "," $2 "," $3 "," $4 "," $5 "," $6}'
>> ~/PutItem_test_table.cvs

ファイルの中身は下記のようになります。
(時間はUTCになりますのでご注意下さい)

2012-12-16,14:55:00,5.25654654646,196.23000000000002,3.265,6.013
2012-12-16,15:00:00,4.95656856565636,188.082,3.258,6.189
2012-12-16,15:05:00,3.565959565332,121.566,3.315,6.396
2012-12-16,15:10:00,4.4421333333333335,133.264,3.345,6.261
2012-12-16,15:15:00,4.2650526315795,165.88600000000002,3.279,6.124
2012-12-16,15:20:00,4.507655172413792,130.761999999998,3.392,6.659
2012-12-16,15:25:00,4.53334375,145.067,3.309,6.538
2012-12-16,15:30:00,4.254555555555555,123.87299999999,3.286,7.649
2012-12-16,15:35:00,4.309178571428572,120.65700000000001,3.251,6.151
2012-12-16,15:40:00,4.5852150000000001,93.043,3.343,5.876
2012-12-16,15:45:00,4.04362,101.138,3.284,5.2546

コマンドの最初の引数はMetricNameです。
後の引数は下記になります。

--statistics 集計方法の指定
--namespace サービス名(DynamoDB、EC2など)の指定
--dimensions 集計情報のうちのどの情報かの指定

※ここがポイントで、前述のmon-list-metricsの3カラム目の値となります。

上記のコマンドをcron等で自動的に取得すれば良いということになります。
しかし、少々分からないことがあります。
5分おきの直近1時間のデータが取得されるはずなのですが、11個(55分)しか取得できませんでした。
そのため、データを取得する間隔を調整して重複するデータはuniqなどで排除する必要がありそうです。

大事なのは情報を取得する事ではなく、ここからいかに適切なリソース状態を導き出すかだと考えています。

こちらの記事はなかの人(Macedonia Shooter)監修のもと掲載しています。
元記事は、こちら