お疲れ様です。宮﨑です。
今回、CentOS6.0でAmazonCloudWatchを使用せずメモリ、ディスク監視の実施を行うシステムを構築・検証しました。
目的
モニタリングスクリプトを使用して、メモリ、ディスクの利用率が90%以上の場合、Amazon SNSよりメール通知を行うシステムを構築する。
背景
現在、メモリやディスクの監視にはAmazonCloudWatchを使用するのが一般的ですが、今回使用するOSがすでにサポートが終了しているCentOS6のため、対応不可となっています。
そのため今回は代替案としてスクリプトを使用しています。
要件
構築する要件は以下の通りです。
- Amazon SNSトピックの作成
- モニタリング用のスクリプト、定期実行のためのcron作成 ※
- 意図的にメモリ、ディスクの使用率を上げてメールの通知を確認
※スクリプトですが後に編集しやすいようにメモリ用、ディスク用を別々に作成しています。
検証環境構築
1.Amazon SNSトピックの作成
AWSコンソールにログインし、SNSのダッシュボードに移動、トピックを作成します。
トピックの作成
- トピック
- トピックの作成
- タイプ選択(今回はスタンダード)と名前入力
- トピックの作成
サブスクリプションの作成
- トピックから作成したSNSを選択
- サブスクリプションの作成
- プロトコル選択(今回はEメール)
- サブスクリプションの作成
※赤丸で囲んだARNは後に使用するので控えておいてください。
2.IAMロール、EC2の作成
EC2にSNSのアクセスポリシーを持ったIAMロールを作成します。
ロールの作成
- ロールを作成
- ユースケースよりEC2を選択AmazonSNSFullAccessを選択
- ロール名を記入しロールを作成
EC2の作成
インスタンスを以下のように作成
OS:CentOS6(サポート終了のため自己作成)
インスタンスタイプ:t2.micro
セキュリティグループ:すべてのトラフィック
IAMロール:先ほど作成のロール
その他の設定:デフォルト
3.スクリプトの作成
冒頭でもお伝えした通り、メモリ用とディスク用のスクリプトを別々に作成しています。
メモリ用スクリプトの作成
スクリプト作成前にルートユーザーのホームディレクトリ(/root)に移動をします。
sudo su -
pwd
新規ファイル memory_monitor.shを作成
vi memory_monitor.sh
下記スクリプトを貼り付け
※コマンドモードから入力モードに移行して貼り付けしてください。
#!/bin/bash
# AWS SNSトピックARN
sns_topic_arn="先ほど作成したSNSトピックのARN貼り付け"
# メモリ使用率を取得(%で表示)
mem_usage=$(free | awk '/Mem/{printf "%.2f", $3/$2 * 100}')
# メモリ使用率が90%以上の場合に通知
if (( $(echo "$mem_usage >= 90" | bc -l) )); then
message="メモリ使用率が90%以上になりました。現在のメモリ使用率は $mem_usage% です。"
subject="メモリ使用率警告"
# SNS通知を送信
aws sns publish --topic-arn "$sns_topic_arn" --message "$message" --subject "$subject"
fi
スクリプトの実行権限を付与
chmod +x memory_monitor.sh
ディスク用スクリプトの作成
メモリ用のスクリプト作成と手順は一緒なので、変更した箇所のみ説明します。
新規ファイルを別名(disk_monitor.sh)で作成
貼り付けするスクリプトは下記のものを使用
#!/bin/bash
# AWS SNSトピックARN
sns_topic_arn="先ほど作成したSNSトピックのARN貼り付け"
# ディレクトリパス(デフォルトはルートディレクトリ)
directory_path="/"
# ディスク使用率を取得(%で表示)
disk_usage=$(df "$directory_path" | awk '$NF == "/" {print $(NF-1)}' | sed 's/%//')
# ディスク使用率が90%以上の場合に通知
if [ "$disk_usage" -ge 90 ]; then
message="ディスク使用率が90%以上になりました。現在のディスク使用率は $disk_usage% です。"
subject="ディスク使用率警告"
# SNS通知を送信
aws sns publish --topic-arn "$sns_topic_arn" --message "$message" --subject "$subject"
fi
4.定期実行のためのcron作成
設定したメトリクスを定期的に実行するためにcronを設定します。今回は5分ごとに実行するスクリプトを設定します。
crontab -e
下記スクリプトを貼り付けします。
MAILTO=通知をしたいアドレス
PATH=/usr/local/bin:/usr/bin:/bin
*/5 * * * * /bin/bash /root/memory_monitor.sh
*/5 * * * * /bin/bash /root/disk_monitor.sh
MAILTO=
→CentOSでcronを使用する際に実行結果の出力のメール送信先を変更したい場合に使用する。
PATH=
→cronを経由すると実行できないコマンドのために設定する環境変数。
5.メモリ、ディスクの使用率を上げてメールの通知を確認
メモリの使用率を高めるコマンドを使用します、以下はその例です。
stress -m 1 --vm-bytes 512M --vm-hang 0 -v
stressコマンドが反応しない場合は以下のコマンドを先に使用し、パッケージを取得してください。
yum -y install epel-release
yum -y install stress
ディスクの使用率を一時的に高めるために以下のコマンドを使用します。
dd if=/dev/zero of=6G.dummy bs=1MD count=6000
/dev/zero デバイスから読み取りを行い、それを 6G.dummy という名前のファイルに1MBのブロックサイズで合計6000回書き込みます。
6.アラーム通知の受け取り
作成したスクリプトが定期的に実行され、システムの使用業況を監視し、条件が満たされた際にAmazon SNSを介してメールを通知します。
最後に
この手順を実行することで、AmazonCloudWatchを使えないCentOS6でスクリプトを使用し、システムの監視を行い、AWS SNSを介して通知を受け取ることができます。
今後はAmazonCloudWatchを用いた監視方法も構築し、違いを比べます。