CloudWatchでディスク容量やメモリ使用量まで含めて監視設定しようと思うたびにあっちこっちのサイトを見て時間を浪費してしまっていたので手順を記載します。
Linuxサーバで構築している前提の話です。
おおまかな手順
- EC2インスタンスにsshで入る
- perlモジュールのインストール
- curlコマンドを実行してモニタリングスクリプトをダウンロード
- ダウンロードしたモニタリングスクリプトをインストール
- IAMユーザーを作成
- 認証を設定
- Cronを設定
- 通知用SNSを作成
- アラートの作成
1. EC2インスタンスにsshで入る
2. perlモジュールのインストール
サーバの情報をCloudWatchへ送る際にそれぞれ必要なモジュールが存在するためにインストールします。
sudo yum install perl-Switch perl-Sys-Syslog perl-LWP-Protocol-https perl-DateTime
sudo yum install gcc make perl-CPAN perl-Time-HiRes perl-XML-Parser mod_perl cpanminus
3. curlコマンドを実行してモニタリングスクリプトをダウンロード
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
4. ダウンロードしたモニタリングスクリプトをインストール
解凍とzipファイルの削除とディレクトリ移動を同時に行なっています。
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon
失敗するとわかっていますがここで動作テストしてみます。
CloudWatch にデータを送信しない簡単なテストです。
./mon-put-instance-data.pl --mem-util --verify --verbose
↓
失敗します。
EC2インスタンスとIAMロールが関連づけられていないことが原因です。
MemoryUtilization: 9.57435398335551 (Percent)
No credential methods are specified. Trying default IAM role.
ERROR: No IAM role is associated with this EC2 instance.
For more information, run 'mon-put-instance-data.pl --help'
5. IAMユーザーを作成
AWSのIAMのサービスページにて「ユーザを追加」を選択
ユーザ名は今回は「CloudWatch」にします。
AWS 認証情報タイプの選択はアクセスキーさえチェックが入っていればOKですがここでは2つとも入れてます。
次のステップへ。
既存のポリシーを直接アタッチを選択し、「CloudWatchAgentAdminPolicy」を選択し次のステップへ。
タグはいらないのでスキップしてユーザの作成をする
「.csvのダウンロード」を押して作成したIAMの情報を保存
この画面で出てくるアクセスキーIDとシークレットアクセスキーは後ほど使用します。
6. 認証を設定
IAMユーザーを作成したら、アクセスキーIDとシークレットアクセスキーを設定します。解凍されたファイルの中に、awscreds.templateというファイルがあるのでawscreds.confという名前でコピーして編集します。 先程追加したIAMユーザーのアクセスキーIDとシークレットキーを設定します。
cp awscreds.template awscreds.conf
vi awscreds.conf
# 先ほど保存したアクセスキーIDとシークレットアクセスキーを挿入します
AWSAccessKeyId=[アクセスキーID]
AWSSecretKey=[シークレットキー]
ここで動作確認をします。
さきほどと同じようにCloudWatch にデータを送信せずに簡単なテストを実行します。
./mon-put-instance-data.pl --mem-util --verify --verbose
↓
動作テストに成功します
MemoryUtilization: 11.2770928669156 (Percent)
Using AWS credentials file <./awscreds.conf>
Endpoint: https://monitoring.ap-northeast-1.amazonaws.com
Payload: {"MetricData":[{"Timestamp":1635180338,"Dimensions":[{"Value":"i-025913bb8d07e4678","Name":"InstanceId"}],"Value":11.2770928669156,"Unit":"Percent","MetricName":"MemoryUtilization"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}
Verification completed successfully. No actual metrics sent to CloudWatch.
7. Cronを設定
cron スケジュールを設定します。crontab -e コマンドを使用して crontab の編集を開始します。5 分ごとにメモリとディスクスペースの使用状況を CloudWatch にレポートします。
crontab -e
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron
8. 通知用SNSを作成
AmazonSNSのサービスページにて「トピック作成」を選択
タイプをスタンダードにして名前と表示名はわかりやすい名前にします。
「プロジェクト名_alert」とかで自分は結構付けます。
トピックの作成をします。
次に通知の送信先を設定するためにサブスクリプションの作成をします。
「サブスクリプションの作成」を選択します。
トピックARNはデフォルトのままでプロトコルをEメールにします。
エンドポイントには設定したいメールアドレスを設定します。
サブスクリプションの作成。
サブスクリプションが作成されましたが、ステータスがまだ保留中です。
設定したメールアドレスに確認メールが届いていますのでそちらを許可します。
このようなメールが届いていますので「Confirm subscription」を押して許可します。
この画面が出てればOKです。
9. アラートの作成
やっとアラートの設定です。
CloudWatchのサービスページにてアラームの作成を選択します。
メトリクスの選択画面でSystem/Linuxの項目ができていることがわかります。
DiskSpaceUtilization(ディスク使用率)やMemoryUtilization(メモリ使用率) をメトリクスとして選択できるようになっています。
統計を最大にして期間はデフォルト最短の5分にします。
1分にしても拡張アラート(有料)にしていないと1分ごとには測定してくれないのと無闇に欠落データをつくってしまって正確な測定結果が得られない可能性があるため5分推奨です。
今回はディスク使用率90%以上になるように設定します。
欠落データは無視するようにします。
さきほどAmazon SNSで設定したトピックを選択してアラート時の通知先設定をします。
他の設定は特に不要であれば次へ。
名前と説明を入力し次へを選択し内容を確認してアラームの作成
アラート作成まで完了
これで以上になります。
作成直後は状態がデータ不足ですが5分ごとにメトリクスをサーバから送信しているため5分後に状態がOKかアラートになるかと思います。
参考
・AWS CloudWatchでディスク容量チェック
・CloudWatchでリソースを監視する手順。メモリやディスクの使用率を可視化しよう!