[AWS] CloudWatchでカスタムメトリクス取得・アラーム通知 -モニタリングスクリプト
AWS CloudWatch にデフォルトではディスク使用率の項目がないので、 EC2 のディスク使用率のデータをモニタリングスクリプトを使って AWS CloudWatch に送信し、決められたディスク使用率を超えたら AWS CloudWatch からメール通知するよう設定する。
CloudWatch では、モニタリングする項目のことをメトリクスと呼び、デフォルトで用意されていない自分で設定した項目のことをカスタムメトリクスと呼ぶ。
やりたいこと
EC2 上の サーバー(今回は Ubuntu )のディスク使用率が 85 % を超えたらメールで通知を受け取りたい。
なので、 AWS CloudWatch にディスク使用率(カスタムメトリクス)を送信し、アラームを設定してメール通知を受け取る。
EC2 インスタンスのカスタムメトリクス取得方法
- AWS CloudWatch エージェントを使用
- AWS CloudWatch モニタリングスクリプトを使用
- AWS SDK でスクリプト作成
- AWS CLI でスクリプト作成 ( aws-mon-linux とか)
CloudWatch エージェントを使用してメトリクスおよびログを収集することをお勧めします。
Amazon EC2 Linux インスタンスのメモリとディスクのメトリクスのモニタリング
AWS の推奨方法ではないが、今回は、「 2. CloudWatch モニタリングスクリプトを使用」の方法を使う。
* これから設定するのであれば、「 1. AWS CloudWatch エージェントを使用」を使ったがいい。
手順
- IAM ロールの作成・割り当て
- モニタリングスクリプトの導入・設定
- AWS CloudWatch でアラームを設定
IAM ロールの作成・割り当て
IAM ポリシーを作成
モニタリングスクリプト用のポリシーは AWS のデフォルトで作成されていないため、 IAM ロールにつけるポリシーを作成する。
下記を含むポリシーを作成する。
- cloudwatch:PutMetricData
- cloudwatch:GetMetricStatistics
- cloudwatch:ListMetrics
- ec2:DescribeTags
- Identity and Access Management (IAM) コンソール → 「ポリシーの作成」をクリック
- サービス「 CloudWatch 」を選択し、アクセスレベルから必要な項目にチェックを入れる
- 「さらにアクセス許可を追加する」をクリックし、サービス「 EC2 」から、アクセスレベル「 DescribeTags 」にチェックを入れる
- 「ポリシーの確認」をクリック
IAM ロールの作成
空の IAM ロールを作成し、作成したポリシーをアタッチする。
- IAM コンソール → 「ロールの作成」をクリック
- [AWS のサービス] を選択 → EC2 を選択 → 「次のステップ:アクセス権限」
- 何も選択せず「次のステップ:タグ」
- タグの追加(必要であれば)
- 「次のステップ:確認」
- ロール名を入力 → 「ロールの作成」をクリック
- ロール一覧画面から作成したロール名をクリック
- 「ポリシーをアタッチします」をクリック
- 作成したポリシーにチェックを入れ、「ポリシーのアタッチ」
EC2 に割り当て
作成した IAM ロールを、対象の EC2 インスタンスに割り当てる。
- 対象の EC2 インスタンスを選択し、「インスタンスの設定」 → 「 IAM ロールの割り当て/置換」」
- 対象の IAM ロールを選択し、「適用」クリック
モニタリングスクリプトの導入・設定
パッケージのインストール
必要なパッケージをインストールする。
< Ubuntu の場合>
$ sudo apt-get update
$ sudo apt-get install unzip
$ sudo apt-get install libwww-perl libdatetime-perl
< Amazon Linux 2 および Amazon Linux AMI の場合>
$ sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64
モニタリングスクリプトをインストール
スクリプトを置く場所に移動。
$ cd /home/bitnami
$ mkdir bin
$ cd bin
モニタリングスクリプトのダウンロード。
$ curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
※ VPC エンドポイントを設定していて、エンドポイントポリシーで aws-cloudwatch バケットへの接続を許可していないとアクセスできない。
エンドポイントポリシーを編集しない場合は、ローカル PC で CloudWatchMonitoringScripts-1.2.2.zip をダウンロードして、 FTP で ZIP のままサーバーにアップロードし、サーバー上で解凍すると使える。
(ローカルで解凍したファイルをアップロードすると、実行権限が付与されずコマンドが実行できなかった。)
ダウンロードしたファイルを解凍。
$ unzip CloudWatchMonitoringScripts-1.2.2.zip
$ rm CloudWatchMonitoringScripts-1.2.2.zip
$ cd aws-scripts-mon
--verify
オプションでテストラン。 ( CloudWatch には送信されない。)
$ ./mon-put-instance-data.pl --disk-path=/ --disk-space-util --verify --verbose
DiskSpaceUtilization [/]: 72.608597660556 (Percent)
...
Verification completed successfully. No actual metrics sent to CloudWatch.
--mem-util
: メモリ使用率 パーセント (%) 単位--disk-path=PATH
: 監視する対象にしたいディスクのパス 例)--disk-path=/home
, --disk-path=/
--disk-space-util
: ディスク使用率 パーセント (%) 単位CloudWatch にデータ送信。
$ ./mon-put-instance-data.pl --disk-path=/ --disk-space-util
Successfully reported metrics to CloudWatch. Reference Id: hogehoge
cron に登録。crontab -e
コマンドでもいい。
$ cd /etc/cron.d
$ sudo vi ec2-monitoring
*/5 * * * * bitnami /home/bitnami/bin/aws-scripts-mon/mon-put-instance-data.pl --disk-space-util --disk-path=/ --from-cron
問題がなければ、 AWS CloudWatch のメトリクス画面に「 Linux システム」というカスタムメトリクスが表示される。
AWS CloudWatch でアラームを設定
AWS CloudWatch の設定
- AWS CloudWatch 管理画面 → アラーム画面 → 「アラームの作成」
- 「メトリクスの作成」をクリック
- 対象のメトリクスを選択し、「メトリクスの選択」をクリック
- [メトリクス]セクション:[統計]から「最大」を選択(バツをクリックして、入力欄をクリックすると選択肢が表示される。)
[条件]セクション:「しきい値の種類」、「アラーム条件」、「しきい値」を入力し、「次へ」をクリック
- 「アラーム状態」を選択
メール通知したいので、「通知」のとこから「新しいトピックの作成」を選択
「トピック名」と「通知を受け取る E メールエンドポイント」にメール送信先を入力し、「トピックの作成」をクリック
「通知の送信先」に今作ったトピック名が表示されたら、「次へ」をクリック
※ 新たにトピックを作成すると、エンドポイントが確認されるまで動かないので、 SNS の設定を行う。 - 「アラーム名」と「アラームの説明(任意)」を入力し、「次へ」
- プレビューを確認し、問題なければ「アラームの作成」をクリック
初めの数分は[状態]が「データ不足」と表示されるが、問題がなければ「 OK 」に変わる。
Amazon SNS の設定
AWS CloudWatch アラーム設定で、エンドポイントにメールを指定すると、「 AWS Notification – Subscription Confirmation 」という件名の E メールが届くので、「 Confirm subscription 」というリンクをクリックして承認する。
Amazon SNS のサブスクリプション画面で、今承認したサブスクリプションの[ステータス]が「確認済み」となっていることを確認。
Amazon SNS のトピック画面から作成したトピックをクリック → 「メッセージの発行」をクリック。
「件名」と「メッセージ本文」を入力し、「メッセージの発行」をクリック。
メッセージを発行すると、 @sns.amazon.com から今作成したメールが送信される。