サイトアイコン 協栄情報ブログ

CloudWatch + CloudWatch AgentでEC2インスタンスを監視・メトリクスの閾値を超えたらSNSで通知を送付


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

こんにちは。協栄情報クラウド事業本部の丁(テイ)です。

CloudWatchの監視機能について詳しくハンズオンを実施していきたいと思います。

概要

 
EC2インスタンスの各種使用率が高くなる場合、パフォーマンスが低下し、EC2インスタンス上のアプリケーションの動作は遅延が生じ、ユーザー体験が悪くなり、お客様がサービスプロバイダーへの信頼に影響を及ぼす恐れがあります。そのため、EC2インスタンスの各種使用率を常に監視し、メトリクスを超えたら運用担当者に通知を送り、はややかに措置を取らなければなりません。
 
 

目的

 
EC2インスタンスの各種使用率はメトリクスを超えたら運用担当者に通知を送り、直ちに措置を取れる仕組みを実現することによって、アプリケーションへの影響を最小限に控えるようにしたいです。
 
 

目標

 
CPU使用率 >=80%
メモリー使用率 >=60%
ディスク使用率 >=80%
の場合、SNSを通じて運用担当者に送信する機能を実現したいです。
 
 

CloudWatchについて

 

■CloudWatchとは

 
CloudWatchはEC2など各AWSリソースのアクションをリアルタイムで監視できるサービスです。
 
 

■CloudWatch Agentとは

 
標準のメトリクスでは「EC2」のデータしか収集できませんが、CloudWatchエージェントは追加のメトリクスを収集した時に使用するサービスです。
 
 

事前準備

 
VPC,EC2は以下設定で作成します。
 
 

■VPC作成

VPC
名前タグ cpi-cloudwatch-handson-vpc
IPv4 CIDR 10.251.0.0/16
サブネット cpi-cloudwatch-handson-subnet-pub
アベイラビリティゾン ap-northeast-1a
Internet gateway
名前タグ cpi-cloudwatch-handson-igw
route table
名前タグ cpi-cloudwatch-handson-rtb-public
送信先 target
0.0.0.0/16 IGW
10.251.0.0/16 Local
セキュリティグループ
名前タグ cpi-sg-cloudwatch
インバウンドルール
タイプ:SSH ソース:0.0.0.0
タイプ:HTTP ソース:0.0.0.0

 

■EC2インスタンス作成

EC2インスタンス
名前タグ cpi-cloudwatch-ec2
AMI Amazon Linux 2 Kernel 5.10 AMI 2.0.20230504.1 x86_64 HVM gp2
インスタンスタイプ t2.micro
キーペア cpi-keypair-ding
ネットワーク cpi-cloudwatch-handson-vpc
サブネット cpi-cloudwatch-handson-subnet-public1-ap-northeast-1a
パブリックIPの自動割り当て 有効化
セキュリティグループ cpi-sg-cloudwatch

 

■EC2インスタンスにSSMエージェントをインストール

SSMエージェントはEC2 インスタンス、オンプレミスサーバー、仮想マシン (VM) にインストールして設定することができる Amazon のソフトウェアです。
SSMエージェントにより、Systems Manager がこれらのリソースを更新、管理、設定できるようなります。

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

 

■IAMロール作成&EC2インスタンスにアタッチ

System ManagerとCloudWatch Agentを使うには、IAMロールを作成し、下記3つのPolicyを付与してからEC2インスタンスへアタッチする必要があります。
 
①AmazonSSMManagedInstanceCore
②CloudWatchAgentServerPolicy
③CloudWatchAgentAdminPolicy
 
ステップ:

①:ロールを作成

 
「ロールを作成」ボタンをクリック

 

信頼されたエンティティタイプ:AWSのサービス
ユースケース:EC2

 

②:ポリシーを付加

 
3つのポリシーを検索し、チェックをつける
 


 
 
ロール名を入れてから「ロール作成」をクリックして完了です


 

③:EC2インスタンスにアタッチ

 
EC2ページの「アクション」→「セキュリティ」→「IAMロールを変更」をクリック


 

さきほど作ったIAMロールを選び、「IAMロールの更新をクリック」

 

アタッチ完了


 
 

■System Managerにパラメータストアをセット

 
EC2インスタンスにログインして、下記コマンドを打つと、パラメータストア作成用の「Amazon CloudWatch Agent Configuration Manager」が出てきます。

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

 
OSはLinuxなのでデフォルトでEnterキーを押します

 
環境はEC2なのでデフォルトでEnterキーを押します

 
ユーザーは今回のハンズオンでrootを使うのでデフォルトでEnterキーを押します

 
StatsD DaemonはCloudWatch Agentのカスタムメトリクス収集用のツールなので「Yes」でいいのでデフォルトでEnterキーを押します

 
StatsD daemonの収集間隔は10秒でいいのでデフォルトでEnterキーを押します

 
メトリクスの収集間隔は60秒でいいのでデフォルトでEnterキーを押します

 
CollectDはCloudWatch Agentが追加メトリクス取得用のツールで、使いますのでデフォルトでEnterキーを押します

 
CPU・メモリーなどを監視しますのでデフォルトでEnterキーを押します

 
コアごとにCPUを監視してもいいのでデフォルトでEnterキーを押します

 
EC2 dimensionsを追加してもいいのでデフォルトでEnterキーを押します

 

ディメンションとは?(Dimensions)
例えば、EC2のメモリ使用率をグラフ化したい場合、各インスタンス毎のメモリ使用率を表示するか、EC2全体のメモリ使用率をすかなど、Auto Scalingグループ別や、イメージID別、すべてのインスタンスにわたり、などがディメンションとなる。

 
EC2 dimensionsの集合はしてもいいのでデフォルトでEnterキーを押します

 
高精度メトリクス収集してもいいのでデフォルトでEnterキーを押します

 
どのデフォルトメトリクスを設定するのかって聞かれています。今回の目標は標準メトリクスのCPU使用率と追加メトリクスのメモリー使用率とディスク使用率なので、「Basic」を選びます。

 
これで設定が一旦完了し、設定内容は下記のように出てきます。

Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}

 
 
上記の設定に満足しましたので、デフォルトでEnterキーを押します

 
既存のCloudWatch Agentのコンフィグファイルはないので、デフォルトでEnterキーを押します

 
今回はログファイルの監視は必要ないので「2」を入れてEnterキーを押します

 

今までの設定内容が出てきます。
下記ディレクトリーに格納されていますので必要に応じて手動で編集できます

Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.

 
作ったコンフィグファイルをSystem Managerのパラメータストアに格納しますので、デフォルトでEnterキーを押します

 

パラメータストア名は他の方と重複しないため、「AmazonCloudWatch-linux-ding」に設定します。

 
リージョンはデフォルトの東京リージョンでいいのでEnterキーを押します

 
json configをパラメータストアに送信するためにクレデンシャルが必要です。すでにCloudWatchAgentAdminPolicyで書き込み権限を付与しているのでデフォルトでEnterキーを押します

 
これでようやく設定完了しました。

 
エージェントの設定ファイルでCollectdを有効にしたので、Collectdをインストールする必要があります。

sudo amazon-linux-extras install collectd

 

■Systems Managerを使って CloudWatch Agentをインストール

 
「Systems Manager」→「ノード管理」→「Run Command」に入り、下記にように設定します。

マンドドキュメント  AWS-ConfigureAWSPackage 
ドキュメント 1(デフォルト)


 
コマンドのパラメータを入力
パラメータは以下のように指定

・Action:install
・Installation Type:Uninstall and reinstall
・Name:AmazonCloudWatchAgent
・Version:latest
 

 
「ターゲット」で、CloudWatch エージェントをインストールする先のインスタンスを選択し、実行をクリック

 

 
成功しました。

 
 

■Systems ManagerからCloudWatchエージェントを起動・結果確認

 
下記コマンドを実行し、CloudWatchエージェントを起動

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-ding

 
CloudWatchでメモリ使用率の[mem_used_percent]とディスク使用率の[disk_used_percent]が取得できていることを確認
 

 
 

■SNSトピックを作成

 

CloudWatchアラームの通知をメールで受け取るためにSNSトピックを作成します。

 
「タイプ」はスタンダード、[名前]にcpi-cloudwatch-tpc(任意の名前)を入力
 
トピックの作成をクリック
 

 

 
できた後サブスクリプションの作成をクリックし、サブスクリプションを作成
 

 
プロトコルにEメール・エンドポイントにメールアドレスを入力し、サブスクリプションの作成をクリック
 

 
作成できました。
 

 
入力したアドレス宛に確認メールが送られてきますので、確認できたら「Confirm subscription」をクリック
 

 
「Subscription confirmed」が表示されました


 
 

■CloudWatchアラームを作成する

 
CloudWatchの「すべてのアラーム」を選択し、「アラームの作成」をクリック
 

 

下記条件でCPU使用率>=80のアラームを設定

設定項目 設定値
インスタンスID cpi-cloudwatch-ec2
メトリクス名 CPUUtilization
統計 平均値
期間 5分
しきい値の種類 静的
アラーム条件 以上
…よりも 80
アラームを実行するデータポイント 2/2
欠落データの処理 欠落データを無視

 

下記条件でメモリー使用率>=80のアラームを設定

設定項目 設定値
インスタンスID cpi-cloudwatch-ec2
メトリクス名 mem_used_percent
統計 平均
期間 5分
しきい値の種類 静的
アラーム条件 以上
…よりも 60
アラームを実行するデータポイント 2/2
欠落データの処理 欠落データを見つかりませんとして処理

 

下記条件でディスク使用率>=80のアラームを設定

設定項目 設定値
インスタンスID cpi-cloudwatch-ec2
メトリクス名 disk_used_percent
Path /
統計 平均
期間 5分
しきい値の種類 静的
アラーム条件 以上
…よりも 80
アラームを実行するデータポイント 2/2
欠落データの処理 欠落データを見つかりませんとして処理

 

検証

■CPU使用率アラームを検証

 
下記コマンドで意図的にCPU使用率を高める
 

[ec2-user@ip-10-251-7-43 ~]$ yes > /dev/null &
[1] 1237
[ec2-user@ip-10-251-7-43 ~]$ yes > /dev/null &
[2] 1238
[ec2-user@ip-10-251-7-43 ~]$ yes > /dev/null &
[3] 1239

 

topコマンドでCPU使用率がすでに97%になったことを確認しました
 

 
しばらく放置したらアラームメールが届きましたのでOKです。

 
CloudWatch中もアラーム状態になりました。
 

 
プロセスを消すのも忘れずに
 

[ec2-user@ip-10-251-7-43 ~]$ kill 1237
[ec2-user@ip-10-251-7-43 ~]$ kill 1238
[1]   Terminated              yes > /dev/null
[ec2-user@ip-10-251-7-43 ~]$ kill 1239
[2]-  Terminated              yes > /dev/null

 

■メモリー使用率アラームを検証

 
下記のように「test-memory.sh」というスクリプトを作成し、中身を書き込みます

vi test-memory.sh
#! /bin/bash
# "--bytest 5000000" is 500MB.
echo PID=$$
echo -n "[ Enter : powerup! ] , [ Ctrl+d : stop ]"
c=0
while read byte; do
   eval a$c'=$(head --bytes 5000000 /dev/zero |cat -v)'
   c=$(($c+1))
   echo -n ">"
done
echo

「:wq」で保存して、実行権限を付与してから実行してみます

chmod +x test-memory.sh
bash test-memory.sh

 

アラームメールが届きましたのでOKです。


 
CloudWatch中もアラーム状態になりました。


 

■ディスク使用率アラームを検証

 
EBSのデフォルト容量は8GBで、OSはすでに2GB弱使われていますので、下記コマンドで6GBのファイルを作ってみます。

dd if=/dev/zero of=6G.dummy bs=1MD count=6000

 
アラームメールが届きましたのでOKです。


 
 
CloudWatch中もアラーム状態になりました。


 
 

まとめ

 
今回はCloudWatchおよびCloudWatch Agentのハンズオンによって、CloudWatchの導入・Wizardを使ってパラメータストアの作成・標準メトリクスと追加メトリクスの監視など、幅広く実施しました。3つのテスト項目も検証しました。

数多くのインストール・配置をしなければならないので、途中で1つ見落としてしまうとハマってしまいますので、ここもいい勉強ができました。

Wizardは今回Basicの部分しか触れていませんが、時間があったらAdvanceなどもしっかり検証したいと思います。

以上です。

モバイルバージョンを終了