【AWS】CloudWatchでカスタムメトリクスでメモリ使用率やディスク使用率をモニタリングする - とあるインフラエンジニアのテクニカルノート

今回は、EC2のCloudWatchのモニタリング項目を追加して、デフォルトにないモニタリング項目のメモリやディスク使用率といったカスタムメトリックスの設定を紹介していきたいと思います。

カスタムメトリックスを使用するには、色々なやり方があるようですが、今回は「CloudWatch Logs」を使用してEC2インスタンスのログ監視をしていきます。
(CloudWatch Logsの詳細は、AWSサイトのこちらを参照ください。)

そのためCloudWatch Logsを使用するため、「統合 CloudWatch エージェント」をインストールして設定することとします。AWSではCloudWatchエージェントの利用を推奨しているようです。

1.IAMロールの作成

エージェントをインストールする前に、始めにIAMロールの作成をする必要があります。
下記2つのロールを作成します。
(1)EC2 から CloudWatch にメトリクスの書き込みを行うためのロールを作成
(2)AWS Systems Manager のパラメータストアに書き込みを行うためのロールを作成

(1)は、「CloudWatchAgentServerRole」という名前のロールで下記2つの権限を付与します。
– サーバから CloudWatch に書き込み許可を与えるためのロール
– EC2 にアタッチすれば、 CloudWatch でのモニタリングが可能になる

(2)は、「CloudWatchAgentAdminRole」という名前のロールで、下記の権限を付与します。
– CloudWatch エージェント設定ファイルをパラメータストアに書き込むためのロール

パラメータストアを使わなければ、「(1)CloudWatchAgentServerRole」 を用意するだけでいいのですが、今回はこのパラメータストアに設定ファイルを保存しようと思いますので、「(2)CloudWatchAgentAdminRole」 のロールも作成していきます。

1.1 CloudWatchAgentServerRoleロールの作成

まず、コンソール管理画面から、「IAM」サービスメニューを選択し、左メニューから「ロール」をクリックします。
ロール画面から、「ロールの作成」ボタン(赤枠)をクリックします。

IAMロール作成1



”ユースケースの選択”で一般的なユースケースの「EC2」を選択し、「次のステップ:アクセス権限」をクリック。
IAMロール作成2


”Attatchアクセス権限ポリシー”で、検索窓に「CloudWatchAgentServerPolicy」と入力し検索するとCloudWatchAgentServerPolicyポリシーが表示されるため、チェックボックスにチェックを入れます。これはCloudWatch に対して書き込み権限を与えるため必要となります。
IAMロール作成3

同様に「AmazonSSMManagedInstanceCore」と入力し検索した結果でAmazonSSMManagedInstanceCoreが表示されるため、チェックします。これはCloudWatch エージェントを Systems Manager でインストールするために必要となります。
2つのチェックを入れたら「次のステップ:タグ」をクリックします。

IAMロール作成4


”タグの追加(オプション)”では特に何も入力しなくても問題ないため、未入力のまま「次のステップ:確認」をクリックします。
IAMロール作成5


"確認"で、ロール名を入力します。ここでは「CloudWatchAgentServerRole_tancox」というロール名にします。ポリシー欄で改めて上で設定したポリシー2つが設定されていることを確認したうえで「ロールの作成」ボタンをクリックします。

IAMロール作成6


1.2 CloudWatchAgentAdminRoleロールの作成

CloudWatchAgentServerRoleの時と同じ手順で作成していきます。
付与した権限アクセスポリシーは、下記の2つになります。
 - CloudWatchAgentAdminPolicy
 - AmazonSSMManagedInstanceCore
ロール名は「CloudWatchAgentAdminRole_tancox」としました。
下記に作成時の画面キャプチャのみ紹介していきます。
IAMロール作成2-1


IAMロール作成2-2

IAMロール作成2-3

IAMロール作成2-4

IAMロール作成2-5

1.3対象EC2へアタッチ

対象の EC2 に上記のロールをアタッチします。今回は前述した通りパラメータストアに書き込みを行うため「CloudWatchAgentAdminRole_tancox」 をアタッチします。

EC2の管理コンソール画面を開き、該当のEC2インスタンスをチェックし、「アクション」-「インスタンスの設定」-「IAM ロールの割り当て/置換」を選択します。
EC2への割り当て


"IAM ロールの割り当て/置換" でIAMロールを設定します。今回は作成した「CloudWatchAgentAdminRole_tancox」を入力し、「適用」ボタンをクリックします。
IAMロールへの割り当て1


 下記のように表示されれば成功です。「閉じる」ボタンをクリックし、終了します。
IAMロールへの割り当て2


2.CloudWatchエージェントのインストール・設定


次は CloudWatch エージェント の設定に移ります。

前述の通り AWS Systems Manager にて CloudWatch エージェントをインストールするのですが、Systems Manager でインストールするには、SSM エージェントのインストールが必要です。
SSM エージェント (AWS Systems Manager エージェント) とは、CloudWatch エージェントとは別の、AWS Systems Manager のエージェントを指します。

この SSM エージェントをサーバにインストールすると、EC2やオンプレミスに関わらず AWS Systems Manager の コンソールから、監視したり、リモートからのコマンド実行が可能になります。

2.1 SSMエージェントの確認

SSMエージェントはデフォルトでされていたりしますが、下記のようにして該当EC2インスタンスにログインし、コマンドで確認します。
もしインストールされていなければインストールをしておく必要があります。

$ sudo systemctl status amazon-ssm-agent

● amazon-ssm-agent.service - amazon-ssm-agent
Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-07-08 03:48:00 UTC; 2 weeks 4 days ago

2.2 CloudWatchエージェントのインストール

SSM エージェントが動作していれば、Systems Manager から操作ができますので、CloudWatchエージェントをインストールします。

AWS管理コンソール画面から「AWS System Manager」管理コンソール画面に行きます。左メニューから「Run Command」をクリックします。
SystemManagerからエージェントインストール1


「Run command」をクリックします。
SystemMangerからエージェントインストール2


コマンドの実行画面の"コマンドドキュメント"の検索窓に「AWS-ConfigureAWSPackage」と入力し、検索します。
検索結果の内容をチェックします。
SystemManagerからエージェントインストール3


そのまま下にスクロールし、"コマンドのパラメータ"項目で、下記を選択・入力します。
  • Action:「Install」
  • Name:「AmazonCloudWatchAgent」
  • 上記以外は特にいじりませんでした。
SystemManagerからエージェントインストール3


また、そのまま下にスクロールし、"ターゲット"項目で、該当インスタンスを選択します。下記は「インスタンスを手動で選択する」を選択し、候補が出てきた中から該当インスタンスを選択しています。
SystemManagerからエージェントインストール4


 また、さらに下にスクロールし、「実行」をクリックします。
SystemManagerからエージェントインストール5


画面が遷移し、下記のような画面が表示されます。「更新」ボタンをクリックし、ステータスが『成功』と表示されれば、正常に処理できました。
SystemManagerからエージェントインストール6

SystemManagerからエージェントインストール7

これで CloudWatch エージェントのインストールは完了です。


2.3 CloudWatchエージェントの設定ファイルの作成

次にCloudWatchエージェントの設定ファイルを作成していく必要があります。今回はウィザードを使用して作成していきます。

対象EC2インスタンスにログインし、以下のようにコマンドを実行しCUIベースで対話型の選択をしていきます。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
(リターン)
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
(リターン)
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
(リターン)
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
(リターン)
Which port do you want StatsD daemon to listen to?
default choice: [8125]
(リターン)
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
(リターン)
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
(リターン)
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
(リターン)
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
(リターン)
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
(リターン)
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]:
(リターン)
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]:
(リターン)
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
3
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
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]:
(リターン)
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]:
(リターン)
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
(リターン)
Log file path:
/var/log/messages
Log group name:
default choice: [messages]
(リターン)
Log stream name:
default choice: [{instance_id}]
(リターン)
Do you want to specify any additional log files to monitor?
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"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "messages",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
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]:
(リターン)
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]
(リターン)
Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]
(リターン)
Which AWS credential should be used to send json config to parameter store?
1. ASIAQ4N6UXDJTEDCBFQ7(From SDK)
2. Other
default choice: [1]:
(リターン)
Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.


Successfullyとなっているのを確認して、終了です。
これでパラメータストアに CloudWatch エージェントの設定ファイルを保存できました。正常に終了すれば AWS Systems Manager のパラメータストアに表示されます。
SystemManagerからエージェントインストール後確認


2.4 IAMロールの変更

パラメータストアへの書き込みが完了したので、 EC2 にアタッチしている IAM ロールをセキュリティ強化のため 「CloudWatchAgentServerRole」 に変更しておきましょう。

EC2の管理コンソール画面を開き、該当のEC2インスタンスをチェックし、「アクション」-「インスタンスの設定」-「IAM ロールの割り当て/置換」を選択します。
IAMロールの変更


"IAM ロールの割り当て/置換" でIAMロールを設定します。今回は作成した「CloudWatchAgentServerRole_tancox」を入力し、「適用」ボタンをクリックします。
IAMロールの変更2

 下記のように表示されれば成功です。「閉じる」ボタンをクリックし、終了します。

IAMロールの変更3

これで CloudWatch エージェントの設定ファイルの作成が完了です。

3.エージェントの起動

CloudWatch エージェントの設定ファイル作成が完了したので、エージェントを起動させていきます。

3.1 collectdインストール

エージェントを起動させるうえで、collectd及び、そのためにepelがインストールされている必要があります。EC2ではインストールされていないことがありますので、インストール手順を紹介します。(既にインストールされている場合は不要です)

インスタンスにログインし、実行していきます。
まずはepelのインストールです。

$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
epel-release-latest-7.noarch.rpm                                                                                   |  15 kB  00:00:00
Examining /var/tmp/yum-root-1tmiU9/epel-release-latest-7.noarch.rpm: epel-release-7-12.noarch
Marking /var/tmp/yum-root-1tmiU9/epel-release-latest-7.noarch.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-12 will be installed
--> Finished Dependency Resolution
amzn2-core/2/x86_64                                                                                                | 3.7 kB  00:00:00

Dependencies Resolved

==========================================================================================================================================
 Package                         Arch                      Version                 Repository                                        Size
==========================================================================================================================================
Installing:
 epel-release                    noarch                    7-12                    /epel-release-latest-7.noarch                     24 k

Transaction Summary
==========================================================================================================================================
Install  1 Package

Total size: 24 k
Installed size: 24 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : epel-release-7-12.noarch                                                                                               1/1
  Verifying  : epel-release-7-12.noarch                                                                                               1/1

Installed:
  epel-release.noarch 0:7-12

Complete!


続いて、collectdをインストールします。

$ sudo yum install collectd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
191 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package collectd.x86_64 0:5.8.1-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================================================
 Package                          Arch                           Version                               Repository                    Size
==========================================================================================================================================
Installing:
 collectd                         x86_64                         5.8.1-1.el7                           epel                         716 k

Transaction Summary
==========================================================================================================================================
Install  1 Package

Total download size: 716 k
Installed size: 2.1 M
Is this ok [y/d/N]: y
Downloading packages:
warning: /var/cache/yum/x86_64/2/epel/packages/collectd-5.8.1-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEYETA
Public key for collectd-5.8.1-1.el7.x86_64.rpm is not installed
collectd-5.8.1-1.el7.x86_64.rpm                                                                                    | 716 kB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-12.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : collectd-5.8.1-1.el7.x86_64                                                                                            1/1
  Verifying  : collectd-5.8.1-1.el7.x86_64                                                                                            1/1

Installed:
  collectd.x86_64 0:5.8.1-1.el7

Complete!


3.1 エージェントの起動

いよいよエージェントを起動ですが、AWS System Managerから実行していきます。

AWS管理コンソール画面から「AWS System Manager」管理コンソール画面に行きます。左メニューから「Run Command」をクリックします。
システムマネージャからエージェント起動1


「Run command」をクリックします。
システムマネージャからエージェント起動2


コマンドの実行画面の"コマンドドキュメント"の検索窓に「AmazonCloudWatch-ManageAgent」と入力し、検索します。
検索結果の内容をチェックします。
システムマネージャからエージェント起動3


そのまま下にスクロールし、"コマンドのパラメータ"項目で、下記を選択・入力します。
  • Optional Configuration Location:「AmazonCloudWatch-linux」
  • 上記以外は表示状態のままです。
システムマネージャからエージェント起動3




また、そのまま下にスクロールし、"ターゲット"項目で、該当インスタンスを選択します。下記は「インスタンスを手動で選択する」を選択し、候補が出てきた中から該当インスタンスを選択しています。
システムマネージャからエージェント起動4


 また、さらに下にスクロールし、「実行」をクリックします。

システムマネージャからエージェント起動5


画面が遷移し、下記のような画面が表示されます。「更新」ボタンをクリックし、ステータスが『成功』と表示されれば、正常に処理できました。

システムマネージャからエージェント起動5

システムマネージャからエージェント起動6

これで CloudWatch エージェントの起動は完了です。


4.CloudWatchメトリクスの確認

これで設定が完了し、CloudWatch に送信されはじめます。

確認方法を紹介します。
コンソールから CloudWatch を選択し、「メトリクス」を押下します。
すると、これまでなかった「CWAgent」という項目が表示されていますので、これを選択します。
 
CloudWatch拡張メトリクスの確認

CloudWatch拡張メトリクスの確認2
 

ディスク使用率だと、「ImageId,InstanceId,InstanceType,device,fstype,path」を選択し、該当の項目を選びます。
そうするとグラフが閲覧でき、値が取得できていることが確認できます。
CloudWatch拡張メトリクスの確認3


メモリ使用率だと、「ImageId,InstanceId,InstanceType」を選択し、該当の項目を選ぶと、グラフが閲覧でき、値が取得できていることが確認できます。
CloudWatch拡張メトリクスの確認4

これで、CloudWatchのメトリクスを設定し、メモリ使用率やディスク使用率を見れるようになりました。マシンのリソース関連はこれでそこそこの情報が見れるようになります。

(参考・引用元)https://aws.amazon.com/jp/

コメント