はじめに
クラウドインテグレーション事業部の嶋﨑です。
本記事では、メモリやディスク使用率を含むOSレベルの詳細なMetricsを取得するためのCloudWatchエージェント導入方法について解説します。
数台であれば手作業でも対応できますが、台数が増えてくると1台ずつSSH接続してコマンドを実行するのは現実的ではありません。
そこで今回は、AWS Systems Manager(SSM)の Run Command を利用し、CloudWatchエージェントのインストールから設定ファイル(config.json)の適用までコマンドベースで一括実行する方法をまとめました。
実務でそのまま流用できる構成案として整理しています。
ゴール
本記事の手順を実施することで、以下の状態になることを目指します。
- 対象のEC2インスタンスにCloudWatchエージェントがインストールされていること
- 標準メトリクス(CPU、メモリ、ディスク等)に加え、OSログ(messages, secure)が収集できていること
事前確認:
SSMを使って作業をするため、いくつか前提条件があります。ここが躓きポイントになりやすいので、しっかり確認しておきましょう。
1. SSM Agent の確認
対象のEC2インスタンスで SSM Agent が動作している必要があります。
Amazon Linux 2 / 2023 や Ubuntu などの主要なAMIを使用している場合、デフォルトでインストールされています。
2. IAM ロールの設定
EC2インスタンスにアタッチするIAM ロールには、以下の権限が必要です。
- 信頼関係
EC2がこのロールを使用できるように、プリンシパルは ec2.amazonaws.com である必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- 許可ポリシー (Permissions)
以下の2つのAWS管理ポリシーをアタッチするのが推奨です。監視用途だけであれば、Stop/Start等の強い権限を個別に書くよりも管理ポリシーの方が安全で手軽です。ポリシー 説明 AmazonSSMManagedInstanceCore SSMからインスタンスを操作するために必須です。 CloudWatchAgentServerPolicy エージェントがメトリクスやログをCloudWatchへ送信するために必須です。
3. VPC エンドポイント(プライベート環境のみ)
対象インスタンスがインターネットに出られない(プライベートサブネットにある)場合、
AWSサービスと通信するために以下のVPC エンドポイントが必要です。
※NAT GatewayやIGW経由でインターネットに出られる場合は不要です。
- Systems Manager (SSM) 関連
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ssmmessages
- com.amazonaws.ap-northeast-1.ec2messages
- CloudWatch 関連
- com.amazonaws.ap-northeast-1.monitoring (メトリクス用)
- com.amazonaws.ap-northeast-1.logs (ログ用)
- その他
- com.amazonaws.ap-northeast-1.s3 (SSMの実行ログ出力やエージェントのダウンロード用)
- com.amazonaws.ap-northeast-1.s3 (SSMの実行ログ出力やエージェントのダウンロード用)
手順1:CloudWatchエージェントのインストール
まずはエージェント自体をインストールします。SSMの「Run Command」機能を使います。
AWSコンソールで Systems Manager > Run Command を開きます。
コマンドドキュメント検索バーで AWS-ConfigureAWSPackage を入力し選択します。

コマンドのパラメータは下記のように設定します。

| 項目 | 設定値 | 説明 |
|---|---|---|
| Action | Install | インストールを実行します |
| Installation Type | Uninstall and reinstall | 古い設定が残っている可能性を考慮し、クリーンインストールを行います |
| Name | AmazonCloudWatchAgent | パッケージ名を指定します。 |
| Version | latest | 最新版をインストールします。 |
- ターゲット: インスタンスを選択、またはタグで指定します。

- 出力オプション: S3への書き込みチェック必要に応じて有効化してください

設定できたら「実行」をクリックします。ステータスが 「成功」 になればインストール完了です。

手順2:config.json の設定と適用
ここが本題です。エージェントを入れただけでは何も収集してくれません。「何を監視するか」を定義した config.json を作成し、エージェントを再起動する必要があります。
今回は AWS-RunShellScript を使って、「設定ファイルの作成」から「適用」までをスクリプト一発で行います。
1.SSM Run Command で AWS-RunShellScript を検索し選択します。

2.「コマンドのパラメータ」に以下のスクリプトを貼り付けます。
#!/bin/bash
# ============================================================
# CloudWatch Agent 設定・起動スクリプト (Linux 用)
#
# 収集内容:
# - CPU, Memory, Disk, Swap
# - /var/log/messages, /var/log/secure
# - Agent自身のログとプロセス死活
# ============================================================
CONFIG_PATH="/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json"
# -----------------------------
# JSON 設定内容
# ※ JSON構文エラー回避のためコメントは含めない
# -----------------------------
read -r -d '' CONFIG_JSON << 'EOM'
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root",
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/messages",
"log_group_name": "EC2_System_Messages",
"log_stream_name": "{instance_id}",
"timezone": "Local",
"retention_in_days": 30
},
{
"file_path": "/var/log/secure",
"log_group_name": "EC2_Security_Logs",
"log_stream_name": "{instance_id}",
"timezone": "Local",
"retention_in_days": 30
},
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"log_group_name": "EC2_CloudWatch_Agent_Logs",
"log_stream_name": "{instance_id}",
"timezone": "Local",
"retention_in_days": 30
}
]
}
},
"force_flush_interval": 60
},
"metrics": {
"aggregation_dimensions": [["InstanceId"]],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"usage_idle",
"usage_iowait",
"usage_user",
"usage_system"
],
"metrics_collection_interval": 60,
"totalcpu": true
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": ["*"]
},
"swap": {
"measurement": [
"swap_used_percent"
],
"metrics_collection_interval": 60
},
"procstat": [
{
"exe": "amazon-cloudwatch-agent",
"measurement": ["pid_count"],
"metrics_collection_interval": 60,
"append_dimensions": {
"ProcessName": "CloudWatch_Agent"
}
}
]
},
"force_flush_interval": 60
}
}
EOM
# -----------------------------
# 設定ファイルを書き込み
# -----------------------------
sudo mkdir -p "$(dirname $CONFIG_PATH)"
echo "$CONFIG_JSON" | sudo tee "$CONFIG_PATH" > /dev/null
# -----------------------------
# 設定反映 & CloudWatch Agent 起動
# -a fetch-config : 設定を読み込む
# -m ec2 : EC2モード
# -s : エージェント再起動
# -----------------------------
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config -m ec2 -c file:$CONFIG_PATH -s
# -----------------------------
# ステータス確認(ログ出力用)
# -----------------------------
sudo systemctl status amazon-cloudwatch-agent --no-pager
ターゲットと実行
- 先ほどと同様にインスタンスを選択します。
- 「実行」をクリックします。
- ステータスが 「成功」 になるまで待ちます(反映に少し時間がかかる場合があります)
手順3:正しく動いているか確認する
最後に、本当にログやメトリクスが取れているか確認しましょう。
1.インスタンス上での確認
- SSM Session Manager等でログインし、以下のコマンドでRunningになっていることを確認します。
sudo systemctl status amazon-cloudwatch-agent.service

- 適用された設定ファイルの確認
cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json

2.CloudWatch コンソールでの確認
- メトリクス: CloudWatch > すべてのメトリクス > CWAgent という名前空間ができているはずです。
ここに ImageId, InstanceId… などのディメンションでデータが来ていれば成功です。

- ログ: CloudWatch > ログ管理 > ロググループ名 > インスタンスIDごとのログストリームにデータが流れていればOKです。
まとめ
SSM Run Command を使えば、SSHでログインすることなく大量のサーバーに対して監視設定を一括投入できます。
今回のスクリプトをベースに、監視したいログファイルやプロセスを書き換えれば、独自の監視要件にもすぐに対応できるはずです。
ぜひ活用してみてください。