【AWS】LinuxのEC2にCloudWatch Agentをインストールして標準では確認することが出来ないメトリクスを確認する方法

はじめに

通常、CPU使用率やEC2インスタンスのステータス監視のメトリクスは標準で確認をすることができますが、メモリやディスク使用率はCloudWatch Agentをインストールをしないと監視をすることが出来ません。今回はLinuxのEC2にCloudWatch Agentをインストールし、標準では確認することが出来ないメトリクスを確認する手順を記載いたします。

環境

  • Amazon EC2
  • Red Hat Enterprise Linux 8(RHEL8)

手順

事前準備

RHEL8のEC2インスタンスにCloudWatch Agentをインストールするためにいくつか事前準備をする必要があります。

IAMロールにCloudWatchのIAMポリシーをアタッチする

CloudWatch AgentをインストールしたいインスタンスにIAMポリシー「CloudWatchAgentServerPolicy」をアタッチします。

CloudWatchのIAMポリシーにはCloudWatchAgentServerPolicyのほかに「CloudWatchAgentAdminPolicy」というものがあります。CloudWatchAgentAdminPolicyはCloudWatch Agentの設定ファイルをAWSサービスの「パラメータストア」へ書き込むことができる「ssm:PutParameter」という権限を持っています。今回は、パラメータストアへの書き込みをすることはないので、「CloudWatchAgentServerPolicy」をアタッチしています。

インスタンスにWgetコマンドをインストールする

Wgetコマンドを使用すると、URLを指定してファイルをダウンロードすることが出来るようになります。今回は、CloudWatch Agentのパッケージをローカルにダウンロードするために使用します。

$ yum install wget
セキュリティグループ設定

Wgetコマンドを使用してCloudWatch Agentのパッケージをローカルにダウンロードする際に外部を宛先とする通信が発生するため、CloudWatchエージェントをインストールしたいインスタンスにアタッチしているセキュリティグループのアウトバウンドルールにHTTPS(443)を許可するルールを追加します。

EPELリポジトリを追加する

collectDパッケージをRHELのインスタンスにインストールするためにはEPELリポジトリが必要になりますので有効にします。

$ dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
CodeReady Builderリポジトリを追加する

RHELインスタンスでEPELリポジトリを使用するにはCodeReady Builderリポジトリの追加が必要になりますので有効にします。

$ /usr/bin/crb enable
collectDパッケージのインストール・サービス起動

EC2内のメモリやディスク使用率のメトリクスを取得するためには、collectDというソフトウェアを対象のインスタンスにインストールする必要があります。

$ yum install -y collectd
$ systemctl start collectd.service

CloudWatch Agentインストール

事前準備が完了しましたので、CloudWatch Agentをインストールします。

CloudWatch Agentがインストールされていないことを確認 する

CloudWatch Agentがインストールされる指定のディレクトリがなく、移動できないことを確認します。

$ cd /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d
CloudWatch Agentパッケージをローカルにダウンロードする

CloudWatch Agentパッケージ「amazon-cloudwatch-agent.rpm」をローカルにダウンロードします。

$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-agent.rpm
ローカルにダウンロードしたCloudWatch Agentパッケージをyumコマンドでインストールする

ローカルにダウンロードしたCloudWatch Agentパッケージ「amazon-cloudwatch-agent.rpm」をyumコマンドを使用してインストールします。

$ yum install amazon-cloudwatch-agent.rpm

CloudWatch Agent設定

インストールしたCloudWatch Agentの設定をします。

CloudWatch Agentウィザードファイルがあるディレクトリに移動
$ cd /opt/aws/amazon-cloudwatch-agent/bin
CloudWatch Agentウィザードの実行

CloudWatch Agentウィザードを実行し、CloudWatch Agentに関する設定を実施します。

$ ./amazon-cloudwatch-agent-config-wizard

コマンド実行後、いくつか対話形式で質問をされますので回答してCloudWatch Agentウィザードファイルの設定を実施していきます。今回、私が回答した内容を記載しますので、参考にしていただければと思います。

 

1. エージェントを使用するOSについての質問になります。今回はLinux環境で使用するため、「1. linux」を選択します。

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

2. エージェントを使用するサーバについての質問になります。今回はEC2を使用しているので、「1. EC2」を選択します。

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

3. エージェントを実行するユーザについての質問になります。今回はルートユーザを使用するため、「1. root」を選択します。

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

4. StatsDデーモンを使用するかの質問になります。今回はカスタムメトリクスを使用するため、「1. yes」を選択します。

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

5. StatsDデーモンで使用するポートについての質問になります。今回は指定がないためデフォルト値の「8125」を選択しています。

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

6. StatsDデーモンのデータ収集間隔についての質問になります。今回はデフォルト値の「1. 10s」を選択しています。

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

7. StatsDデーモンのデータ集約間隔についての質問になります。今回はデフォルト値の「4. 60s」を選択しています。

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

8. Collectデーモンを使用するかの質問になります。今回はカスタムメトリクスを使用するため、「1. yes」を選択します。

$ Do you want to monitor metrics from CollectD?
$ 1. yes
$ 2. no
$ default choice: [1]:

9. CPUやメモリのメトリクスを収集するかの質問になります。今回はCPUやメモリのメトリクスを収集するため、「1. yes」を選択します。

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

10. CPUコア単位での使用率を取得するかの質問になります。今回は「1. yes」を選択します。

$ Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
$ 1. yes
$ 2. no
$ default choice: [1]:

11. ImageId、InstanceId、InstanceType、AutoScalingGroupNameが取得可能であれば取得をするかの質問になります。今回は「1. yes」を選択します。

$ 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]:

12. 高解像度メトリクスの収集間隔に関する質問になります。今回は指定がないため、デフォルト値の「4. 60s」を選択しています。

$ 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]:

13. どのメトリクスセットを選択するかの質問になります。今回はメモリ使用率のメトリクス「mem_used_percent」を取得したいので、「2. Standard」を選択しています。

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

メトリクスセットによって取得できるメトリクスが異なります。詳しくは下記を参考にしてください。

docs.aws.amazon.com

14. これまで設定した内容が表示されるので、問題がなければ「1. yes」を選択します。

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
                        },
                        "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"
                                ],
                                "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"
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}
Are you satisfied with the above config? Note: it can be manually customized aft                            er the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:

15. インポートするCloudWatch Agentの設定ファイルを既に所持しているかの確認になります。今回は新規作成になりますので、「2. no」を選択します。

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]:

16. ログファイルを監視するかの質問になります。今回はログファイルの監視は実施しませんので、「2. no」を選択します。

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

17. これまで設定した内容が表示されます。この設定をSSMパラメータストアに保存するかの質問になります。今回は保存しないので「2. no」を選択します。

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
                        },
                        "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"
                                ],
                                "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"
                        },
                        "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]:2

「Program exits now.」と表示されたらCloudWatch Agentの設定は完了です。

CloudWatch Agent起動

CloudWatch Agentの設定が完了しましたので、起動します。

CloudWatch Agent起動前のステータス確認

下記コマンドを実行し、statusがstoppedとなっていることを確認します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

コマンド実行結果

{
  "status": "stopped",
  "starttime": "",
  "configstatus": "not configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247355.0b252062"
}
CloudWatch Agent起動

下記コマンドを実行し、CloudWatch Agentを起動します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a start
CloudWatch Agent起動後のステータス確認

下記コマンドを実行し、statusがrunningとなっていることを確認します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status</pre

コマンド実行結果

{
  "status": "running",
  "starttime": "2022-11-28T07:08:39+00:00",
  "configstatus": "configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247355.0b252062"
}

CloudWatch メトリクス確認

AWSマネジメントコンソールより新しく追加したメトリクスを確認します。

1. AWSマネジメントコンソール画面でCloudWatchを選択します。

2. 左ペインより「すべてのメトリクス」を選択します。

3. カスタム名前空間の「CWAgent」を選択します。

4. 「ImageId, InstanceId, InstanceType」を選択します。

5. 対象のメトリクスのチェックボックスにチェックを入れ、画面上部にグラフが表示されることを確認します。

以上でCloudWatch Agentをインストールしたインスタンスのメモリ使用率のメトリクスを確認することが出来ました。

 

ディスク使用率のメトリクスは、「CWAgent」-「ImageId,InstanceId,InstanceType,device,fstype,path」よりメトリクス名「disk_used_percent」を選択することで確認することが出来ます。

最後に

今回はRHEL8のEC2にCloudWatch Agentインストールをし、メモリ使用率やディスク使用率のメトリクスを確認する方法を記載いたしました。

私はこちらを案件で取り扱ったのですが、事前準備に記載した内容をいくつか実施しておらず、苦労した思い出があります。

こちらの記事を確認いただき、私のように苦労することがなくなれば嬉しいです!

執筆担当者プロフィール
神田 皓貴

神田 皓貴(日本ビジネスシステムズ株式会社)

クラウドソリューション事業本部所属。AWSを中心としたクラウドインフラに携わっています。

担当記事一覧