「Agentを入れて設定したのに CloudWatch Logs に何も出てこない」——監視で最初にハマる典型です。本記事は CloudWatch / Logs / Agent の役割を切り分け、コピペで動く設定JSON(Linux・Windows)と、症状→原因→対処の逆引き表で「ログが来ない」を最短で解決します。

01まず整理:CloudWatch / Logs / Agent は別物

「ログが来ない」で消耗する原因のほとんどは、名前が似た3つを同じものだと思い込むことです。まず役割を切り分けます。

CloudWatch Agent = サーバーから送る「配達員」 サーバー (EC2 / オンプレ) ログファイル /var/log・IISログ 等 メモリ / ディスク空き 既定では取得不可 CloudWatch Agent = 配達員 CloudWatch Logs 保管・検索の置き場 CloudWatch Metrics 数値・アラーム 既定メトリクス(CPU等)は自動 実線=Agentが配達 / 点線=既定メトリクス(CPU・NW・ディスクI/O)は自動送信
図:Agentは「サーバーの中身(ログファイル・メモリ・ディスク空き)」を集めて Logs と Metrics へ配達する。CPU等の既定メトリクスは Agent なしで自動的に送られる。
現場のコツ:「置き場(Logs)」を作れば勝手にログが集まる、という誤解が事故のもと。ログを運ぶ主体は Agentで、Agentの設定と権限が要。ここを最初に押さえると迷いません。

02Agentは要る?要らない?(既定で取れるもの・取れないもの)

EC2 は既定で AWS/EC2 名前空間に CPUUtilization・ネットワーク・ディスクI/O(EBS)・ステータスチェックを送っています。ただしこれらはハイパーバイザー視点の数値で、OSの中身は見えていません。

つまり「メモリ・ディスク空きを監視したい」「アプリやOSのログを CloudWatch Logs に集めたい」なら Agent が要ります。逆に CPU とネットワークだけで足りるなら Agent は不要、という判断もアリです。

なお旧 awslogs(CloudWatch Logs エージェント)は非推奨です。IMDSv2 環境では統一 CloudWatch Agent が必須。新規は統一エージェント一択で進めてください。監視の位置づけの基礎は クラウドエンジニアの教科書(可用性・監視) も合わせてどうぞ。

現場のコツ:「取れない=壊れている」ではありません。メモリとディスク空きは設計上ゲストOSからしか見えないため、Agentで能動的に送るのが正解です。

03動かす前提:IAMロール・SSM・制御コマンド

Agent がログ・メトリクスを送れるのは、サーバーに付いたIAMロール(インスタンスプロファイル)のおかげです。ここが抜けていると、設定が正しくても Logs に何も出ません。最初に必ず確認します。

# 1) IAMロール(インスタンスプロファイル)に必要な権限を付ける
#    - CloudWatchAgentServerPolicy   … メトリクス/ログ送信・保持期間設定
#    - AmazonSSMManagedInstanceCore  … SSM経由でインストール/配布する場合

# 2) SSM Run Command で統一エージェントを配布インストール
#    ドキュメント: AWS-ConfigureAWSPackage / パッケージ: AmazonCloudWatchAgent

# 3) インストール後の稼働確認は agent-ctl の status
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
現場のコツ:権限確認は「送信テストの前」に。ロールを付け替えたら反映に少し時間がかかることがあるので、付与直後は数分待ってから status を見ると落ち着いて切り分けられます。

04Configのキモ①:agent / metrics / logs の3ブロック

設定ファイルは JSON で、agent / metrics / logs(+X-Ray用の traces)のセクションで構成します。ログだけ集めたいなら metrics は省略可、メトリクスだけなら logs を省略可、という足し引きで考えると迷いません。

{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "cwagent"
  },
  "metrics": {
    "metrics_collected": { }
  },
  "logs": {
    "logs_collected": { }
  }
}

推奨の置き場所は Linux が /opt/aws/amazon-cloudwatch-agent/etc/ 配下、Windows が %ProgramData%\Amazon\AmazonCloudWatchAgent\ 配下です。ファイル名は任意ですが、切り分けやすいよう分かりやすい名前にします。

現場のコツ:迷ったら「まずlogsだけ」で小さく始めるのが安全。1ファイル1ロググループで動かして、Logsに出ることを確認してから metrics やファイルを足していくと事故りません。

05Configのキモ②:metrics(メモリ・ディスクはここだけ)

メモリとディスク空きはこの metrics セクションにしか出てきません。逆に言えば、ここを書かない限りメモリ監視は永遠に始まりません。

{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "cpu":  { "resources": ["*"], "measurement": ["usage_active"], "totalcpu": true },
      "mem":  { "measurement": ["used_percent", "available_percent"] },
      "disk": { "resources": ["/"], "measurement": ["used_percent", "inodes_free"] }
    },
    "metrics_collection_interval": 60
  }
}
現場のコツ:diskresources でマウントポイントを絞れます。パーティションが多いインスタンスで "*" を使うと、その分だけカスタムメトリクスが増えて費用が増える点に注意。

06Configのキモ③:logs(collect_listが本体)

ログファイルは logs_collected.files.collect_list に1エントリ=1ログ種として並べます。ここでの指定ミスが「一部だけ来ない」の主因です。

{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_name": "/ec2/linux/messages",
            "log_stream_name": "{instance_id}",
            "timestamp_format": "%b %d %H:%M:%S",
            "retention_in_days": 30
          },
          {
            "file_path": "/var/log/nginx/error.log",
            "log_group_name": "/app/nginx/error",
            "log_stream_name": "{instance_id}",
            "timestamp_format": "%Y/%m/%d %H:%M:%S",
            "multi_line_start_pattern": "{timestamp_format}",
            "retention_in_days": 90
          }
        ]
      }
    }
  }
}
現場のコツ:メトリクスの ${aws:InstanceId} と、ログの {instance_id}書式が別物です($と波かっこの有無)。ここを混同するとプレースホルダがそのまま文字列として使われるので要注意。

07適用と配布:fetch-config と SSM Parameter Store

設定はファイルを置いただけでは反映されませんfetch-config で読み込ませ、-s で(再)起動して初めて有効になります。ここを忘れて「変えたのに効かない」となる人が非常に多いです。

# ローカルのファイルから読み込んで起動(-s で start)
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/config.json

# SSM Parameter Store に置いた設定を複数台へ一元配布
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux

# 状態確認 / 停止
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

Windows では PowerShell から .ps1 を同じ引数で呼びます。

& "$Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" `
  -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-windows
現場のコツ:同じ設定を SSM Parameter Store に1つ置いて全台に配るのが定番。台ごとにファイルを配って回るより、更新も一箇所で済み事故が減ります。設定ウィザードから直接パラメータ保存もできます。

08取るべきログ:Linux と Windows(表2つ)

「とりあえず全部」は費用と検索性の両面で損です。まずはトラブル解析に効く定番を押さえます。Linux はファイル収集が中心です。

ログ / パス用途log_group 例
/var/log/messages(syslog系)OS全般・カーネル・デーモンの動き/ec2/linux/messages
/var/log/secure(RHEL)・auth.log(Debian)ログイン・sudo・認証の監査/ec2/linux/secure
/var/log/croncron/バッチの実行結果/ec2/linux/cron
/var/log/cloud-init.log起動時のブートストラップ調査/ec2/linux/cloud-init
nginx/httpd の access・error ログWebの状態・エラー・遅延の一次調査/app/nginx/access ・ /error
/var/log/audit/audit.log(auditd)詳細な操作監査(要件がある場合)/ec2/linux/audit

一方 Windows は「ファイルではなくイベントログが主役」で、設定ブロックが別になります。System / Application / Security は windows_events セクションで event_name を指定して収集します。IIS のアクセスログだけはテキストファイルなので、Linux 同様に files 側で収集します。

対象収集セクションlog_group 例
Systemイベントログlogs_collected.windows_events(event_name: System)/win/system
Applicationイベントログlogs_collected.windows_events(event_name: Application)/win/application
Securityイベントログlogs_collected.windows_events(event_name: Security)/win/security
IISログ(C:\inetpub\logs\LogFiles)logs_collected.files(テキストファイル)/win/iis

Windowsイベントログの設定断片は次の通りです。event_levels でレベルを絞り、event_formatxml(イベントビューアと同じ形式)か text(旧エージェント形式)を選べます。

{
  "logs": {
    "logs_collected": {
      "windows_events": {
        "collect_list": [
          {
            "event_name": "System",
            "event_levels": ["ERROR", "CRITICAL", "WARNING"],
            "log_group_name": "/win/system",
            "log_stream_name": "{instance_id}",
            "event_format": "xml",
            "retention_in_days": 30
          },
          {
            "event_name": "Application",
            "event_levels": ["ERROR", "CRITICAL"],
            "log_group_name": "/win/application",
            "log_stream_name": "{instance_id}",
            "event_format": "xml"
          }
        ]
      },
      "files": {
        "collect_list": [
          {
            "file_path": "C:\\inetpub\\logs\\LogFiles\\**",
            "log_group_name": "/win/iis",
            "log_stream_name": "{instance_id}"
          }
        ]
      }
    }
  }
}

ログの中身の読み方・grep での絞り込みは Linux実践コマンドリファレンス にまとめています。

現場のコツ:event_name はイベントビューアの表示名(ログ名)ではなくチャネルのフルネームで判定されます。ずれることがあるので、迷ったらイベントビューアでチャネルのプロパティを開いて正式名を確認します。

09ユースケース:メモリ/ディスクのアラーム化・ログ調査

やりたいこと①:メモリ逼迫でアラートを出す。 Agentが送る CWAgent 名前空間の mem_used_percent(ディスクなら disk_used_percent)にアラームを張ります。

aws cloudwatch put-metric-alarm \
  --alarm-name mem-high \
  --namespace CWAgent \
  --metric-name mem_used_percent \
  --statistic Average --period 300 --evaluation-periods 2 \
  --threshold 80 --comparison-operator GreaterThanThreshold \
  --dimensions Name=InstanceId,Value=i-0123456789abcdef0

CLIの基本操作は AWS CLI実践リファレンス を参照してください。

やりたいこと②:アプリのエラーを追う。 集めたログは Logs Insights で横断検索します。

fields @timestamp, @message
| filter @message like /ERROR|Exception/
| sort @timestamp desc
| limit 50
現場のコツ:アラームは「Agentがメトリクスを送っている」ことが前提。データが無いと INSUFFICIENT_DATA になります。まずコンソールで CWAgent にメトリクスが出ているかを確認してからアラームを作ると空振りしません。

10「ログが来ない」チェックリスト

Logs に何も出ない・一部だけ来ないときは、上から順に潰します。ほとんどはこの中にあります。

現場のコツ:切り分けの起点は Agent自身のログ(/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log)。権限エラーやパス不一致はここに出るので、まずこれを tail します。

11コンテナは別物(ECS / EKS)

EC2/オンプレの CloudWatch Agent 設定は、コンテナにはそのまま流用しません。ECS / EKS ではログ収集は Fluent Bit(FireLens / aws-for-fluent-bit)、メトリクスや Container Insights は CloudWatch agent や ADOT(AWS Distro for OpenTelemetry)を使う、という別の枠組みになります。

本記事は EC2・オンプレ向けの統一 CloudWatch Agent が対象です。コンテナのログ設計は収集器も配置も別テーマとして切り分けて考えてください。

12早見表:症状 → 原因 → 対処(逆引き)

症状ありがちな原因対処
ログが1件も出ないIAMロール未アタッチ / CloudWatchAgentServerPolicy 不足ロールを付与し fetch-config で再適用、Agentログで権限エラー確認
一部のログだけ来ないfile_path のパス / glob 誤り、読み取り権限なしパス実在と cwagent ユーザの読取権を確認、glob を見直す
時刻がずれる / バラけるtimestamp_format 不一致、timezone 未指定ログ実物に合わせ timestamp_format を設定、必要なら timezone 指定
メトリクスにメモリが無いmetrics に mem / disk 未記載(既定では出ない)metrics_collected に mem・disk を追加して fetch-config
コンソールに出ない / 別の場所region 指定違い、閲覧リージョン違い送信先 region と閲覧リージョンを一致させる
料金が膨らむretention_in_days 未設定で無期限保管ロググループに保持期間を設定(低頻度なら INFREQUENT_ACCESS も検討)
設定変更が効かないfetch-config / -s を忘れている-a fetch-config -m ec2 -s で読み直して再起動
複数行ログが分割されるmulti_line_start_pattern 未設定スタックトレース等は multi_line_start_pattern を設定
監視設計からログ基盤の構築・運用まで、EMWが伴走します。基礎からしっかり身につけたい方の 採用情報・カジュアル面談はこちら

13よくある質問(FAQ)

EC2の既定メトリクスにメモリ使用率はありますか?

いいえ。既定の AWS/EC2 メトリクスは CPUUtilization・ネットワーク・ディスクI/O(EBS)・ステータスチェックまでで、いずれもハイパーバイザー視点の数値です。メモリ使用率とファイルシステムの空き容量はゲストOSの中の情報なので、既定では取得できません。これらを取るには CloudWatch Agent を入れ、metrics セクションに mem / disk を書く必要があります。

旧 awslogs エージェントはまだ使えますか?

非推奨です。旧 CloudWatch Logs エージェント(awslogs)はレガシー扱いで、特に IMDSv2 環境では統一 CloudWatch Agent が必須になります。新規構築は統一エージェント一択、既存環境も統一エージェントへの移行を推奨します。設定ファイルの書式(INIから JSON へ)も別物なので、流用せず作り直してください。

ロググループは事前に作っておく必要がありますか?

いいえ。Agent が log_group_name をもとに自動作成します(IAMロールに権限があれば)。「作ったのに来ない」の多くは、権限不足・リージョン違い・パス誤りが原因で、ロググループの有無ではありません。ただし retention_in_days を指定しないと新規ロググループは無期限保管になり、コストが膨らみます。保持期間は必ず設定してください。

Windows と Linux で設定は同じですか?

metrics / logs という考え方は同じですが、収集元が違います。Windows のイベントログ(System / Application / Security)は files ではなく logs_collected の windows_events セクションで event_name を指定して収集します。一方 IIS のアクセスログはテキストファイルなので、Linux と同様に files 側の file_path で収集します。「ファイルではなくイベントログが主役」という点が Windows の勘所です。

EMWは札幌拠点で、AWSの監視設計・ログ基盤の構築から日々の運用まで伴走しています。「メトリクスは出るのにログだけ来ない」といった詰まりも、設計段階から一緒に解きほぐします。基礎から力をつけたいエンジニアの採用も歓迎です。

相談する
← ブログ一覧へ戻る