今回の記事では、EC2インスタンスのメモリ使用状況を監視するためのCloudWatch Agentをインストールする手順を学習します。EC2インスタンスのデフォルトのモニタリングメトリクスにはCPUの使用率やデータ通信量関連のものは含まれていますが、メモリの使用率は含まれていません。CloudWatch Agentを使用することでEC2インスタンスのメモリの使用率をCloudWatchで確認できるようになります。
以下の記事の内容はEC2インスタンスの作成がされ、インスタンスにSSH接続ができていることを前提に解説をしていきます。インスタンスの作成方法については以下の「EC2インスタンスの作成手順」記事を参考にして下さい。

事前設定
AIMロールの作成
AWSの管理画面最上部の検索窓に「AIM」と入力しtえAIMのサービスページに移動します。
「アクセス管理」>「ロール」メニュを選択し、「ロールを作成」ボタンを押下します。
以下の設定でロールを作成します。
- 信頼されたエンティティタイプ
-
「AWSのサービス」を選択。
- ユースケース
-
ドロップダウンリストから「EC2」を選択。
表示された各ユースケースのラジオボタンからも「EC2」を選択します。 - 許可ポリシー
-
「CloudWatchAgentServerPolicy」で検索し、検索結果に表示された「CloudWatchAgentServerPolicy」にチェックを入れます。
- ロール名
-
分かりやすい任意の名前を設定しましょう。ここでは iam-role-ec2-cloudwatch-agent-testとしておきます。
EC2インスタンスへの紐づけ
EC2インスタンスのリストから対象となるインスタンスを選択します。
「アクション」>「セキュリティー」>「AIMロールを変更」メニューを選択します。
上記で作成したAIMロールを選択して保存します。
CloudWatchサービスにアクセスする権限を付与したロールをEC2インスタンスに紐づけることでEC2インスタンスがCloudWatchサービスにデータを送るアクセスすることができるようになります。
EC2インスタンスのホスト名の設定
CloudWatchサービスに表示されるホスト名(ドメイン名)はインスタンスに設定されているホスト名になります。デフォルトでは以下のようなホスト名になっています。
ip-172-**-**-**.us-west-2.compute.internal
このままでは名前が分かりにくく探しにくくなるので、以下のコマンドで分かりやすいホスト名を変更しておきます。EC2インスタンスに紐づけたドメイン名がよいでしょう。
【現在のホスト名の表示】
hostname
【ホスト名の設定】
sudo hostnamectl set-hostname 指定するするホスト名
【変更後のホスト名の確認】
hostname
CloudWatch Agentのインストールと設定
CloudWatch Agentのインストール
以下のコマンドでCloudWatch Agentのインストールを行います。
【パッケージの確認】
dnf list installed | grep amazon-cloudwatch-agent
dnf info amazon-cloudwatch-agent
【パッケージのインストール】
sudo dnf install amazon-cloudwatch-agent -y
CloudWatch Agentの設定ファイルの作成
CloudWatch Agentのデフォルトの設定ファイルは以下の場所に作成されます。
/opt/aws/amazon-cloudwatch-agent/etc
これらデフォルトの設定ファイルとは別に設定ファイルを作成する必要があります。以下のコマンドでウィザードを使って設定ファイルの作成をします。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
以下の入力例を参考に質問に答えていってください。
================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
= =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply. =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
2
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
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]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
2
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]:
2
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
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]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60,
"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
},
"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]:
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]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2
Existing config JSON identified and copied to: /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
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"
]
],
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60,
"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
},
"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.
ウィザード完了後には以下の場所に設定ファイルが作成されます。
/opt/aws/amazon-cloudwatch-agent/bin/config.json
CloudWatch Agentの起動
以下のコマンドを実行してCloudWatch Agentを起動します。
【起動コマンド】
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
【起動の確認】
ps aux | grep cloudwatch
->以下のような表示が出たら起動成功です。
-
root 4847 1.0 10.4 1374024 101808 ? Ssl 06:15 0:00 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -otelconfig /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.yaml -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid
-
CloudWatchでメモリ使用率の確認
AWS管理画面最上部の検索窓に「CloudWatch」と入力してCloudWatchのサービスページに移動します。
「メトリクス」>「すべてのメトリクス」メニューを選択。
「参照」タブの上部の「カスタム名前空間」セクションに「CWAgent」の表示がされるので、それをクリックします。出ていない場合は5分ほど待ちましょう。
次に、「host」を選択しましょう。メトリクス名が「mem_used_percent」となっている行のチェックを入れてみましょう。これがメモリの使用率になります。上部のグラフに使用率が表示されます。
設定直後はデータがたまっていないので、グラフ欄の右端に点として見えている状態なので分かりにくいですが、時間が経つと線となって使用率が見やすくなります。
swap_used_percent はスワップメモリの使用率を表しています。スワップメモリとは物理的なメモリが(RAM)が不足したときに一時的にハードドライブをメモリ代わりに使用する方法を指します。ハードドライブへのアクセスは非常に低速なのでスワップメモリは常に使用されていない状態(0%)が理想的です。スワップメモリが使用されてきている場合はメモリの増設を検討しましょう。
まとめ
この記事ではEC2インスタンスのメモリ使用率を監視するためにCloudWatch Agentを使用する方法を学びました。まずはAIMロールを作成することが必要でした。そして、それをEC2インスタンスに紐づけることでCloudWatchサービスにデータを送ることができるようになりんでしたね。インスタンスのホスト名の表示もしておくとよいことも学びました。CloudWatch Agentのインストール後には、設定ファイルの作成が必要でした。ウィザードを使用して質問に答えて作成をしましたね。最後にCloudWatchサービスで実際に対象インスタンスのメモリの使用率の確認ができました。設定ファイルはオプションが沢山あるのでここで学んだことだけではなく、自分でも開拓していきましょう。