この記事は公開されてから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などもしっかり検証したいと思います。
以上です。