はじめに

クラウドインテグレーション事業部の嶋﨑です。

本記事では、メモリやディスク使用率を含む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の実行ログ出力やエージェントのダウンロード用)
       

手順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でログインすることなく大量のサーバーに対して監視設定を一括投入できます。
今回のスクリプトをベースに、監視したいログファイルやプロセスを書き換えれば、独自の監視要件にもすぐに対応できるはずです。
ぜひ活用してみてください。