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

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

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キーを押します
file
 
ユーザーは今回のハンズオンでrootを使うのでデフォルトでEnterキーを押します
file
 
StatsD DaemonはCloudWatch Agentのカスタムメトリクス収集用のツールなので「Yes」でいいのでデフォルトでEnterキーを押します
file
 
StatsD daemonの収集間隔は10秒でいいのでデフォルトでEnterキーを押します
file
 
メトリクスの収集間隔は60秒でいいのでデフォルトでEnterキーを押します
file
 
CollectDはCloudWatch Agentが追加メトリクス取得用のツールで、使いますのでデフォルトでEnterキーを押します
file
 
CPU・メモリーなどを監視しますのでデフォルトでEnterキーを押します
file
 
コアごとにCPUを監視してもいいのでデフォルトでEnterキーを押します
file
 
EC2 dimensionsを追加してもいいのでデフォルトでEnterキーを押します
file
 

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

 
EC2 dimensionsの集合はしてもいいのでデフォルトでEnterキーを押します
file
 
高精度メトリクス収集してもいいのでデフォルトでEnterキーを押します
file
 
どのデフォルトメトリクスを設定するのかって聞かれています。今回の目標は標準メトリクスのCPU使用率と追加メトリクスのメモリー使用率とディスク使用率なので、「Basic」を選びます。
file
 
これで設定が一旦完了し、設定内容は下記のように出てきます。

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キーを押します
file
 
既存のCloudWatch Agentのコンフィグファイルはないので、デフォルトでEnterキーを押します
file
 
今回はログファイルの監視は必要ないので「2」を入れてEnterキーを押します
file
 

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

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キーを押します
file
 

パラメータストア名は他の方と重複しないため、「AmazonCloudWatch-linux-ding」に設定します。
file
 
リージョンはデフォルトの東京リージョンでいいのでEnterキーを押します
file
 
json configをパラメータストアに送信するためにクレデンシャルが必要です。すでにCloudWatchAgentAdminPolicyで書き込み権限を付与しているのでデフォルトでEnterキーを押します
file
 
これでようやく設定完了しました。
file
 
エージェントの設定ファイルでCollectdを有効にしたので、Collectdをインストールする必要があります。

sudo amazon-linux-extras install collectd

 

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

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

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

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

・Action:install
・Installation Type:Uninstall and reinstall
・Name:AmazonCloudWatchAgent
・Version:latest
 
file
 
「ターゲット」で、CloudWatch エージェントをインストールする先のインスタンスを選択し、実行をクリック
file
 
file
 
成功しました。
file
 
 

■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]が取得できていることを確認
 
file
 
 

■SNSトピックを作成

 

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

 
「タイプ」はスタンダード、[名前]にcpi-cloudwatch-tpc(任意の名前)を入力
 
トピックの作成をクリック
 
file
 
file
 
できた後サブスクリプションの作成をクリックし、サブスクリプションを作成
 
file
 
プロトコルにEメール・エンドポイントにメールアドレスを入力し、サブスクリプションの作成をクリック
 
file
 
作成できました。
 
file
 
入力したアドレス宛に確認メールが送られてきますので、確認できたら「Confirm subscription」をクリック
 
file
 
「Subscription confirmed」が表示されました

file
 
 

■CloudWatchアラームを作成する

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

下記条件で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%になったことを確認しました
 
file
 
しばらく放置したらアラームメールが届きましたのでOKです。
file
 
CloudWatch中もアラーム状態になりました。
 
file
 
プロセスを消すのも忘れずに
 

[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です。

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

file
 

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

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

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

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

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

file
 
 

まとめ

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

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

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

以上です。

Last modified: 2023-05-18

Author