AWS Cloud Watchでディスク容量を監視する

こんにちは。虎の穴ラボのNSSです。

Webアプリケーションでサーバーのディスク使用率が高くなったとき、
メールやSlackで通知したいという要件はよくあると思います。

EC2を使っていればCloud Watchを利用して、ディスク使用率を監視して空き容量が減少したらメールで通知できることがわかったので、
その手順をまとめたいと思います。

1. モニタリングスクリプト

CloudWatchはデフォルトの状態ではディスク使用率の監視ができないので、
EC2インスタンス上にモニタリングスクリプトというものをインストールします。

まずインスタンスにSSHで接続し、パッケージをインストールします。

sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64

次に、モニタリングスクリプトをダウンロードするフォルダを作成します。 今回はmonitoring-scriptsというフォルダにダウンロードします。

mkdir monitoring-scripts
cd monitoring-scripts/
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O

ダウンロードしたzipを解凍します。 unzipがない場合はインストールします

# unzipがインストールされていない場合
sudo yum install unzip
# zipを解凍後削除
unzip CloudWatchMonitoringScripts-1.2.2.zip
rm CloudWatchMonitoringScripts-1.2.2.zip

これでモニタリングスクリプトがインストールできました。

2. 監視用ユーザーの設定

モニタリングスクリプトがインストールできたら、
設定ファイルにIAMユーザーのアクセスキーIDとシークレットキーを設定します。 最低限の権限さえあれば良いのでAWSコンソールにてCloudWatchのアクセス権限のみを持つ監視用IAMユーザーを追加します。
今回はアクセス権限の設定で「既存のポリシーを直接アタッチ」で「CloudWatchAgentServerPolicy」を選択しています。

IAMユーザーを作成したら、
インスタンスにて、解凍されたファイルの中にあるawscreds.templateawscreds.confという名前でコピーします。

cd aws-scripts-mon
cp awscreds.template awscreds.conf

awscreds.confを編集します。 追加したIAMユーザーのアクセスキーIDとシークレットキーを設定します。

AWSAccessKeyId=[アクセスキーID]
AWSSecretKey=[シークレットキー]

ここまでできたら動作確認を行います。
インスタンスにて、以下のコマンドを実行します。
--verifyオプションが設定されているとCloud Watchへはレポートされません。

./mon-put-instance-data.pl --mem-util --verify --verbose

成功していれば以下のような結果が表示されます。

Verification completed successfully. No actual metrics sent to CloudWatch.

5分ごとにディスク使用状況をCloud Watchにレポートするようにcronを設定します。

crontab -e
# 以下の行を追加
*/5 * * * * ~/monitoring-scripts/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron

3. Cloud Watchの設定

1~2までの手順が正常に設定されていればCloud Watchコンソール > メトリクス >すべてのメトリクスタブに Linuxシステムが追加されているはずです。 Linuxシステム > Filesystem, InstanceId, MountPath > 該当のインスタンスを選択すると、該当インスタンスのディスク使用率がグラフで表示されます。

このメトリクスを監視するCloud Watchのアラームを設定します。 Cloud Watchコンソール > アラーム > アラームの作成をクリックします。

メトリクス選択で先ほどのインスタンスを選択します。 メトリクスを選択したら条件の設定をします。
設定内容は以下のとおりです。

f:id:toranoana-lab:20190708182424p:plain f:id:toranoana-lab:20190708182242p:plain

次にアクションの設定をします。閾値を超えたら、任意のメールアドレスにメールがくるように設定します。 ここでメールを送信するトピックを作成する必要があります。 f:id:toranoana-lab:20190708181451p:plain

トピックの作成ボタンをクリックするとAmazon SNSにトピックが作成されます。 最後にアラーム名とアラームの説明を設定して完了です。

ここまで終了するとAWS Notification - Subscription Confirmationという確認メールが受信されるはずなので メール内のリンクをクリックします。 これでサブスクリプションの確認が行われます。

Amazon SNSのコンソールに行くと、トピックとサブスクリプションが作成されています。 サブスクリプションの確認が行われているとサブスクリプションのステータスが確認済みになっているはずです。

Amazon SNSコンソール > トピック > 作成したトピックを選択し、 メッセージの発行をクリックします。 件名とメッセージ本文を追加します。 件名には日本語は使えません。 f:id:toranoana-lab:20190708184319p:plain

最後に閾値を超えた時、設定したメールが来ることを確認したら完了です。

最後に

今回はCloud Watchでディスク使用率を監視する方法をご紹介しました。 サードパーティ製の監視サービスを利用するということも1つの手段ですが、 痒い所に手が届かない場合もあります。 今回紹介した方法で独自の監視ができるので、是非試してみてください。

P.S

虎の穴では一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp