CloudWatchでサーバーを監視し、メトリクスの閾値を超えた時にメールで通知を受けとる。


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

概要

ClouswatchでEC2を監視するハンズオンをやっていきます。
要件は2点です。
①サーバのメトリクス閾値が下記を超えた場合、メールで通知を受け取れるようにする。

  • CPU使用率 >=80%
  • メモリー使用率 >=80%
  • Disk使用率 >=80%

②この時、利用者が勝手にSNStopicのサブスクリプションを解除できないようにする。
※メモリ使用率とDisk使用率については、通常のCloudWatchでは取得できないため、EC2インスタンスにCloudWatchエージェントをインストールし、カスタムメトリクスとして取得します。

構成図

構成図4

前提

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

VPC
名前タグ VPC-nakaniwa
IPv4CIDR 10.0.0.0/16
サブネット
サブネット名 Public subnet-nakaniwa
アベイラビリティゾーン ap-northeast-1a
IPv4CIDR 10.0.1.0/24
インターネットゲートウェイ
名前タグ igw-nakaniwa
VPC VPC-nakaniwa
ルートテーブル/ Public subnet-nakaniwa
送信先 ターゲット
10.0.0.0/16 Local
0.0.0.0 Internet Gateway
セキュリティグループ
セキュリティグループ名 sg-nakaniwa
インバウンドルール
タイプ:SSH ソース:0.0.0.0
タイプ:HTTP ソース:0.0.0.0
タイプ:HTTPS ソース:0.0.0.0
EC2インスタンス
名前タグ ec2-nakaniwa
AMI Amazon Linux 2
インスタンスタイプ t2.micro
キーペア nakaniwa
ネットワーク VPC-nakaniwa
サブネット Public subnet-nakaniwa
パブリックIPの自動割り当て 有効化
セキュリティグループ sg-nakaniwa

作業ステップ

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

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

[ec2-user@ip-10-0-1-176 ~]$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

IAM ロールの作成。

EC2にSystems ManagerとCloudWatchAgentエージェントを使用するために必要な3つのポリシーを付与していきます。
①AmazonSSMManagedInstanceCore
②CloudWatchAgentServerPolicy
③CloudWatchAgentAdminPolicy

ロールを作成をクリック。

IAMロール作成1

信頼されたエンティティタイプとユースケースを選択

IAMロール作成2

必要な3つのポリシーを検索して選択したら次へをクリック

①Systems Manager でCloudWatchAgentをインストールするのに必要なポリシー
IAMロール作成3
②CloudWatchAgentエージェントを実行するのに必要なポリシー
IAMロール作成5
③エージェント設定ファイルをParameter Storeに保存するために必要なポリシー
IAMロール作成6

ロール名を入力し、ロールを作成をクリック

ロール名はわかりやすく「CloudwatchAgentRole」としました。

IAMロール作成6
IAMロール作成8

ロールを作成したらEC2にアタッチ。

アクション>セキュリティ>IAMロールを変更と選択していきます。

IAMロールをアタッチ

作成したIAMロールを選択し、IAMロールの更新をクリックしたらアタッチ完了

IAMロールをアタッチ2

Systems Manager を使用して CloudWatch エージェントをインストール

Systems Managerにアクセスし、[Run Command] を選択

SSM1

コマンドドキュメントで[AWS-ConfigureAWSPackage] を選択

SSM2

コマンドのパラメータを入力

パラメータは以下を指定して実行します。

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

SSM3

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

SSM4
SSM5

ステータスが「成功」となっていたらインストール完了

SSM6

CloudWatch エージェント設定ファイルを作成する

EC2にSSHで接続して以下のコマンドを実行。

CloudWatch エージェント設定ウィザードが開始するので質問に回答していきます。

[ec2-user@ip-10-0-1-176 ~]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

どのOSでエージェントを使用するか聞かれています。今回Amazon linuxを使用しているのでデフォルトのままエンターを押します。

On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:

EC2かオンプレミス使用かを聞かれています。EC2を使用しているので、デフォルトのままエンターを押します。

Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:

どのユーザーでエージェントを使用するか聞かれています。rootで使用で大丈夫ですので、デフォルトのままエンターを押します。

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:

StatsDデーモンを有効にするか聞かれています。有効でOKなのでデフォルトのままエンターを押します。

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:

StatsD を使用してカスタムメトリクスを取得する

CloudWatch エージェントで StatsD プロトコルを使用することで、アプリケーションやサービスから追加のカスタムメトリクスを取得できます。StatsDは、さまざまなアプリケーションからメトリクスを収集できる一般的なオープンソースソリューションです。StatsD は、独自のメトリクスを計測する場合に特に便利です。

StatsD がどのポートを利用するかき聞かれています。デフォルトの8125でよいのでそのままエンターを押します。

Which port do you want StatsD daemon to listen to?
default choice: [8125]

StatsDデーモンの収集間隔をを何にするか聞かれています。デフォルトの10秒でいいのでそのままエンター押します。

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

StatsDデーモンが収集するメトリクスの集計間隔を何にするか聞かれています。デフォルトの60秒でよいのでそのままエンターを押します。

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:

CollectDからメトリクスを監視するか聞かれています。利用するのでデフォルトのままエンターを押します。
ここで注意が必要で、CollectDがインストールされていないと、Agentの起動に失敗します。

Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:

collectd を使用してカスタムメトリクスを取得する

CloudWatch エージェントで collectd プロトコルを使用することで、アプリケーションやサービスから追加のメトリクスを取得できます。collectd プロトコルは Linux サーバーでのみサポートされています。collectd は、さまざまなアプリケーションのシステム統計を収集できるプラグインを備えた、一般的なオープンソースソリューションです。CloudWatch エージェントが既に収集できるシステムメトリクスと collectd からの追加のメトリクスを組み合わせることで、システムやアプリケーションのモニタリング、分析、トラブルシューティングを強化できます。CloudWatch エージェントによってインポートされた collectd メトリクスの表示
collectd メトリクスを CloudWatch にインポートした後、これらのメトリクスを時系列グラフとして表示し、これらのメトリクスをモニタリングし、指定したしきい値に違反した場合に通知できるアラームを作成できます。

CPU,メモリ等を監視するか聞かれています。監視するのでデフォルトのままエンターを押します。

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

コアごとにCPUメトリクスを監視するか聞かれています。これも監視でよいのでデフォルトのままエンターを押します。

Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:

ec2のディメンション(ImageId, InstanceId, InstanceType, AutoScalingGroupName)が利用可能であれば、すべてのメトリクスに追加するか聞かれています。これも追加でよいのでデフォルトのままエンターを押します。

Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:

高解像度でメトリクスを収集するか聞かれています。デフォルトの60秒でよいのでそのままエンターを押します。

Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:

どのデフォルトメトリクス設定を希望するか聞かれています。
Basic, Standard, Advancedで取得できるメトリクスが変わります。

詳細レベル 含められるメトリクス
Basic Mem: mem_used_percent
Disk: disk_used_percent
Standard CPU: cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system
Disk: disk_used_percent、disk_inodes_free
Diskio: diskio_io_time
Mem: mem_used_percent
Swap: swap_used_percent
Advanced CPU: cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system
Disk: disk_used_percent、disk_inodes_free
Diskio: diskio_io_time、diskio_write_bytes、diskio_read_bytes、diskio_writes、diskio_reads
Mem: mem_used_percent
Netstat: netstat_tcp_established、netstat_tcp_time_wait
Swap: swap_used_percent

今回はメモリ使用率とDisk使用率がわかればよいので1のBasicを選びます。

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:

上記の選択をし終わると、設定内容が出力されます。

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"
                        }
                }
        }
}

上記の設定で満足ですかと聞かれています。満足なのでデフォルトのままエンターを押します。

Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:

既存のCloudWatch Log Agentの設定の設定ファイルはあるか聞かれています。ないのでデフォルトのままエンターを押します。

Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:

ログファイルを監視するか聞かれています。今回ログは監視しないのでnoの2を選択します。

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2

上記を選択し終わると今までの設定内容が表示されます。


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"
                        }
                }
        }
}

上記のconfigファイルは/opt/aws/amazon-cloudwatch-agent/bin/config.json に配置されています。
必要であれば手動で編集してください。
SSMパラメータストアにconfigを保存しますかと聞かれています。保存するのでデフォルトのままエンターを押します。

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.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

パラメータストア名を何にするか聞かれています。デフォルトのAmazonCloudWatch-linuxで良いので良いのでそのままエンターを押します。

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]

パラメータストアをどのリージョンに保存するか聞かれています。ap-northeast-1に保存したいのでデフォルトのままエンターを押します。

Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

パラメータストアにjson configを送信するために、どのAWSクレデンシャルを使用する必要があるか聞かれています。今回CloudWatchAgentAdminPolicyで書き込み権限を付与しているのでデフォルトのままエンターを押します。。
パラメータストアへの書き込み権限のあるロールがないとここでエラーとなります。

Which AWS credential should be used to send json config to parameter store?
1. ASIA2N5I5XLCP6PXDUJO(From SDK)
2. Other
default choice: [1]:

以上で設定が完了です。

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

collectdをインストール

エージェントの設定ファイルでCollectdを有効にしたので、Collectdをインストールする必要があります。Amazon Linux 2 にはデフォルトで collectd がインストールされていないためです。

[ec2-user@ip-10-0-1-176 ~]$ sudo amazon-linux-extras install collectd

Systems ManagerからCloudWatchエージェントを起動

Systems Managerにアクセスし、[Run Command] を選択。

SSM1

コマンドドキュメント で「AmazonCloudWatch-ManageAgent」を選択。

SSM7

コマンドのパラメータを入力

SSM8
*[Optional Configuration Location]にはエージェント設定ファイルで設定したパラメータストア名を入力します。

[ターゲット]でインスタンスを手動で選択するにチェックし実行をクリック

SSM9
SSM10

ステータスが[成功]となっていたら完了。

SSM11

CloudWatchでメモリ使用率とディスク使用率が取得できているか確認する

全てのメトリクスを選択

CloudWatch1

カスタム名前空間の[CWAgent]をクリック

CloudWatch2

[InstanceId]をクリック

CloudWatch3

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

CloudWatch4

SNSトピックを作成

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

トピックの作成をクリック

SNS1

[タイプ]はスタンダード、[名前]と[表示名]にCloudWatch_Alarms_nakaniwa(任意の名前)と入力し次へをクリック

SNS2

次にサブスクリプションを作成します。

作成したトピックを選択し、サブスクリプションの作成をクリック

SNS3

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

SNS4

入力したアドレス宛に確認メールが送られてくる。

今回はサブスクリプションを勝手に解除されないようにしたいので、届いたメールからの確認登録はせず、[Confirm subscription]を右クリックしリンクをコピーする。
SNS7

サブスクリプションの確認をクリック

SNS8

先ほどコピーしたリンクを貼り付け、サブスクリプションの確認をクリック

SNS9

サブスクリプションが正常に確認されましたと表示されたらOK

SNS10

テストメールを送信し確認してみる

トピックからメッセージの発行をクリック。

SNS16

件名と本文を入力し、メッセージの発行をする

SNS12

メールが届いたら、unsubscribeのリンクをクリックする

SNS15

解除されないことを確認

SNS14

アラームを作成する

CloudWatchにアクセスし、すべてのアラームを選択、アラームの作成をクリック

CloudWatch5

メトリクスの選択

CloudWatch6

AWS名前空間からEC2を選択

CloudWatch7

インスタンス別メトリクスを選択

CloudWatch12

[CPUUtilization]を検索し、自分が作成したインスタンスの左の□にチェックを入れメトリクスの選択をクリック

CloudWatch13

アラームを出す閾値を設定して次へをクリック

CloudWatch10

トリガーをアラーム状態にし、既存のSNSトピックを選択し通知の送信先をCloudWatch_Alarms_nakaniwaに指定し次へをクリック

CloudWatch14

名前と説明を記入し次へをクリック

CloudWatch15

設定内容に問題なければアラームを作成をクリックし完了

CloudWatch16

同様の手順でメモリ使用率とDisk使用率のアラームを作成。

CloudWatch17

検証

CPUに負荷をかけてアラームを出すようにして通知が来る検証をします。

以下のコマンドでCPUに負荷をかける

[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[1] 3236
[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[2] 3238
[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[3] 3239

CPU使用率が80%を超えてアラーム状態になったことを確認

CloudWatch18

アラーム通知がメールで届いたことを確認し検証完了

CloudWatch19

さいごに

今回ハンズオンをしていて最初IAMロールの権限が足りてなかったり、CollectdをインストールしていないためにRun Commandが失敗したりして、原因がわかるまでハマってしまって大変でしたがとても勉強になりました。

Last modified: 2022-09-17

Author