AWS CloudWatchでLinuxサーバーを監視する方法|CloudWatch Agentの設定からメトリクス収集・アラート通知まで

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > AWS CloudWatchでLinuxサーバーを監視する方法|CloudWatch Agentの設定からメトリクス収集・アラート通知まで
「AWSにLinuxサーバーを立てたが、CPUやメモリの監視設定がまだできていない」
「EC2のOSレベルのメトリクス(メモリ・ディスク使用率)がCloudWatchに表示されない理由がわからない」

こうした声は、AWSを使い始めたLinuxエンジニアからよく聞きます。AWSはデフォルトでCPUやネットワークなど一部のメトリクスを自動収集しますが、メモリ使用率やディスク使用率はOS内部の情報のため、CloudWatch Agentを別途インストールしなければ見えません。

この記事では、Amazon Linux 2023環境でのCloudWatch Agentのインストールから、カスタムメトリクス(メモリ・ディスク)の収集設定、アラームによるSNS通知、CloudWatch Logsを使ったログ集約まで、一通りの監視設計を実践的に解説します。

動作確認環境: Amazon Linux 2023 / CloudWatch Agent 1.300044.0 / AWS CLI 2.17.x

この記事のポイント

・CloudWatch Agentがないとメモリ・ディスクは取得できない
・IAMポリシー2つをEC2ロールにアタッチするのが設定の前提
・put-metric-alarmでメモリ85%・ディスク80%のアラームを設定
・CloudWatch Logsへのログ集約とERRORフィルターで異常を検知


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

AWSのLinux監視でCloudWatch Agentが必要な理由

AWSはEC2インスタンスの「ハイパーバイザーレベル」のメトリクスを自動収集しています。CPUUtilization・NetworkIn・NetworkOut・DiskReadOps といった指標はエージェントなしで確認できます。

しかし、OSレベルのメトリクス(メモリ使用率・ディスク使用率・プロセス数・スワップ使用率)はAWSのハイパーバイザーからは取得できません。これらを収集するには、EC2インスタンスの内側からメトリクスをCloudWatchへ送信するエージェントが必要です。それが CloudWatch Agent です。

CloudWatch Agentが担う役割は主に3つあります。

カスタムメトリクス収集: メモリ・ディスク使用率・プロセス数などをCloudWatchへ送信
ログ転送: /var/log/messages・アプリケーションログをCloudWatch Logsへリアルタイム転送
StatsD/collectdの受信: アプリ独自のメトリクスを受け取りCloudWatchへ中継

エージェントが未設定のまま「メモリ使用率が85%を超えたらアラートを出す」という設定はできません。サーバーを本番公開する前に必ず設定しておきましょう。

AWSでLinuxサーバーを構築する実践的な手順については、Amazon Linuxの入門教材・学習ロードマップもあわせてご覧ください。

CloudWatch Agentのインストールと基本設定

1. SSMエージェントとIAMロールの確認

CloudWatch AgentのインストールにはSSM(Systems Manager)経由とダウンロード手動インストールの2通りがあります。Amazon Linux 2023ではSSM Agentがプリインストールされているため、SSM経由が最短です。

まず、EC2インスタンスにアタッチされているIAMロールに以下の2つのポリシーが含まれているか確認します。

CloudWatchAgentServerPolicy: メトリクス・ログ送信に必要
AmazonSSMManagedInstanceCore: SSM経由でのエージェント操作に必要

AWSマネジメントコンソールで EC2 → インスタンス → IAMロール のポリシー一覧から確認するか、AWS CLIで確認します。

# IAMロールにアタッチされているポリシーを確認 # INSTANCE_PROFILE_NAME はEC2インスタンスのIAMロール名に置き換える aws iam list-attached-role-policies --role-name INSTANCE_PROFILE_NAME --query 'AttachedPolicies[].PolicyName' --output table # 出力例(2つのポリシーがあれば準備OK) # ---------------------------------------- # | ListAttachedRolePolicies | # +--------------------------------------+ # | CloudWatchAgentServerPolicy | # | AmazonSSMManagedInstanceCore | # +--------------------------------------+

ポリシーがない場合は aws iam attach-role-policy で追加してから先に進みます。

2. Amazon Linux 2023へのインストール

Amazon Linux 2023ではdnfでインストールできます。

# CloudWatch Agentをdnfでインストール sudo dnf install amazon-cloudwatch-agent -y # インストール確認 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl --version # 出力例(バージョンは環境により異なる) # /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl --version # /opt/aws/amazon-cloudwatch-agent: CWAgent/1.300044.0b703 (linux; amd64; go1.22.1)

3. 設定ウィザードで設定ファイルを生成する

設定ファイルは手書きでも作れますが、初回は対話型ウィザードを使うのが確実です。

# 設定ウィザードの起動 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard # ウィザードの主な設問と推奨回答 # On which OS are you running this agent? # => 1 (Linux) # Are you installing the agent on an EC2 instance? # => 1 (Yes) # Do you want to monitor cpu metrics per core? # => 2 (No) # コア別は通常不要。全体CPUで十分 # Do you want to add ec2 dimensions? # => 1 (Yes) # InstanceIdがメトリクスのディメンションに付与される # Would you like to monitor memory utilization? # => 1 (Yes) # Would you like to monitor disk utilization? # => 1 (Yes) # Which disk paths do you want to monitor? # => / と入力(複数の場合は改行で追加) # Do you have any existing CloudWatch Log Agent? # => 2 (No) # 初回は No # Do you want to monitor any log files? # => 1 (Yes) # Log file path # => /var/log/messages # Log group name # => (デフォルトのまま Enter → /var/log/messages) # Log stream name # => (デフォルトのまま Enter → {instance_id}) # 設定ファイルの保存先 # /opt/aws/amazon-cloudwatch-agent/bin/config.json

ウィザード完了後、設定ファイルは /opt/aws/amazon-cloudwatch-agent/bin/config.json に保存されます。チームで複数インスタンスを管理する場合はS3に格納してSSM Parameter Store経由で配布するのが本番運用の標準パターンです。

注意: CloudWatch Agentは設定ファイルのポリシー名のタイポや存在しないパスを指定しても起動時にエラーを出さない場合があります。起動後は必ず status コマンドで "running" を確認してから、CloudWatchコンソールでメトリクスが届いているかを検証してください。

4. エージェントの起動と動作確認

# 設定ファイルを読み込んでエージェントを起動 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s # エージェントの状態確認 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status # 正常起動時の出力例 # { # "status": "running", # "starttime": "2026-07-05T09:15:32+09:00", # "configstatus": "configured", # "cwoc_status": "stopped", # "version": "1.300044.0b703" # } # OS起動時の自動起動確認 sudo systemctl is-enabled amazon-cloudwatch-agent # enabled

起動後、数分以内にCloudWatchコンソールに「CWAgent」名前空間のメトリクスが届きます。

CloudWatchコンソールでメトリクスを確認する

エージェント起動後、CloudWatchコンソールで確認します。

・CloudWatchコンソール → 左メニュー「メトリクス」→「すべてのメトリクス」
・名前空間「CWAgent」を選択
・「InstanceId, device, fstype, path」(ディスク)または「InstanceId」(メモリ)でフィルタ

メモリメトリクスの代表的な指標

mem_used_percent: メモリ使用率(%)← 最もよく使うメトリクス
mem_available: 空きメモリ(バイト)
mem_cached: キャッシュ使用量

ディスクメトリクスの代表的な指標

disk_used_percent: ディスク使用率(%)← アラームに最適
disk_free: 空きディスク(バイト)
disk_inodes_free: 空きinode数(inode枯渇の早期検知に有効)

コンソールでグラフが表示されれば収集設定は成功です。

CloudWatchアラームでメモリ・ディスクの閾値超過を通知する

メトリクスが収集できたら、閾値を超えたときにメール通知するアラームを設定します。
通知にはSNS(Simple Notification Service)を使います。

1. SNSトピックとメール購読の作成

# SNSトピックを作成 aws sns create-topic --name ec2-linux-alerts --region ap-northeast-1 # 出力例 # { # "TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:ec2-linux-alerts" # } # メール購読を追加(TopicArnは上記出力の値を使用) aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:123456789012:ec2-linux-alerts --protocol email --notification-endpoint your-alert-address@example.com --region ap-northeast-1 # 購読後、メールに届くconfirmリンクをクリックして承認する

2. メモリ使用率アラームの作成

メモリ使用率が85%を5分間継続して超えたら通知するアラームを作成します。

# メモリ使用率アラームの作成 # INSTANCE_ID は実際のEC2インスタンスIDに置き換える aws cloudwatch put-metric-alarm --alarm-name "ec2-mem-used-high" --alarm-description "Memory usage over 85 percent for 5 minutes" --metric-name mem_used_percent --namespace CWAgent --dimensions Name=InstanceId,Value=i-0123456789abcdef0 --statistic Average --period 300 --evaluation-periods 1 --threshold 85 --comparison-operator GreaterThanThreshold --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:ec2-linux-alerts --treat-missing-data notBreaching --region ap-northeast-1 # アラーム一覧の確認 aws cloudwatch describe-alarms --alarm-names ec2-mem-used-high --query 'MetricAlarms[*].{Name:AlarmName,State:StateValue}' --output table # 出力例 # ----------------------------------------------- # | DescribeAlarms | # +-----------------------+-----------------------+ # | Name | State | # +-----------------------+-----------------------+ # | ec2-mem-used-high | OK | # +-----------------------+-----------------------+

3. ディスク使用率アラームの作成

/ パーティションの使用率が80%を超えたら通知します。
ディスクアラームでは --dimensions のdeviceとfstypeの値がポイントです。Amazon Linux 2023の場合、EBSボリュームは nvme0n1p1(xfs)が一般的ですが、インスタンスタイプにより異なります。CloudWatchコンソールのメトリクス一覧で実際の値を確認してからコマンドに反映させてください。

# ディスク使用率アラームの作成(device・fstypeは環境に合わせて調整) aws cloudwatch put-metric-alarm --alarm-name "ec2-disk-used-high" --alarm-description "Disk usage over 80 percent for 5 minutes" --metric-name disk_used_percent --namespace CWAgent --dimensions Name=InstanceId,Value=i-0123456789abcdef0 Name=device,Value=nvme0n1p1 Name=fstype,Value=xfs Name=path,Value=/ --statistic Average --period 300 --evaluation-periods 1 --threshold 80 --comparison-operator GreaterThanThreshold --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:ec2-linux-alerts --treat-missing-data notBreaching --region ap-northeast-1

CloudWatch Logsでサーバーログを集約する

エージェントの設定ウィザードで/var/log/messagesの転送を有効にした場合、CloudWatch Logsの指定ロググループにリアルタイムでログが届きます。

ログ確認はAWS CLIで行えます。

# ロググループの一覧確認 aws logs describe-log-groups --log-group-name-prefix /var/log --query 'logGroups[*].logGroupName' --output table --region ap-northeast-1 # 出力例 # -------------------------------- # | DescribeLogGroups | # +------------------------------+ # | /var/log/messages | # +------------------------------+ # 最新ログストリームの確認 aws logs describe-log-streams --log-group-name /var/log/messages --order-by LastEventTime --descending --max-items 3 --query 'logStreams[*].{Stream:logStreamName,Last:lastEventTimestamp}' --output table --region ap-northeast-1 # 最新イベントの表示(ログストリーム名はインスタンスIDを指定) aws logs get-log-events --log-group-name /var/log/messages --log-stream-name i-0123456789abcdef0 --limit 10 --query 'events[*].message' --output text --region ap-northeast-1

ログメトリクスフィルターで「ERROR」を自動カウントする

ログの中に「ERROR」が含まれた行を自動でカウントし、アラームに連動させることができます。

# ロググループにメトリクスフィルターを作成("ERROR"を検出してカウント) aws logs put-metric-filter --log-group-name /var/log/messages --filter-name ErrorCount --filter-pattern "ERROR" --metric-transformations metricName=ErrorCount,metricNamespace=LinuxServer/Logs,metricValue=1 --region ap-northeast-1 # フィルター確認 aws logs describe-metric-filters --log-group-name /var/log/messages --region ap-northeast-1 # 5分間のErrorCountが3件を超えたらアラームを発報する設定 aws cloudwatch put-metric-alarm --alarm-name "ec2-log-error-spike" --alarm-description "Log ERROR count over 3 in 5 minutes" --metric-name ErrorCount --namespace LinuxServer/Logs --statistic Sum --period 300 --evaluation-periods 1 --threshold 3 --comparison-operator GreaterThanThreshold --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:ec2-linux-alerts --treat-missing-data notBreaching --region ap-northeast-1

トラブルシュート|CloudWatch Agentが動かない時の確認手順

1. エージェントのログでエラーを確認する

# エージェントのエラーログを確認 sudo tail -50 /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log # よくあるエラーメッセージと原因 # "NoCredentialProviders: no valid providers in chain" # -> IAMロールがアタッチされていない。EC2インスタンスのIAMロールを確認 # "RequestError: send request failed ... EOF" # -> CloudWatchエンドポイントへの通信が遮断されている。 # セキュリティグループのアウトバウンド443の設定を確認 # "context deadline exceeded" # -> タイムアウト。NTPが正確に同期されているか確認

2. IAMロールが正しいか確認する

EC2インスタンスからのIMDS(インスタンスメタデータ)アクセスでIAMロール情報が取得できるか確認します。

# インスタンスに割り当てられたIAMロールの確認(EC2インスタンス内から実行) curl -s http://169.254.169.254/latest/meta-data/iam/info | python3 -m json.tool # 出力例(正常時) # { # "Code": "Success", # "LastUpdated": "2026-07-05T00:15:31Z", # "InstanceProfileArn": "arn:aws:iam::123456789012:instance-profile/CloudWatchAgentRole", # "InstanceProfileId": "AIPA000000000000EXAMPLE" # }

3. アウトバウンド443ポートの疎通を確認する

CloudWatchへのデータ送信はHTTPS(TCP/443)を使います。セキュリティグループでアウトバウンドが制限されている場合は通信できません。

ポートの確認方法については、Linux ポート確認の全コマンドを参照してください。

4. NTP時刻同期のズレが大きい場合

CloudWatchメトリクスのタイムスタンプはEC2インスタンスのシステム時刻に基づきます。時刻のズレが大きいとメトリクスが正しい時系列で記録されません。

Amazon Linux 2023ではchronyがデフォルトで動作しています。時刻同期の詳細設定については、ntpd 時刻同期設定も参考にしてください。

# chronydの同期状態確認 chronyc tracking # 出力例(正常時) # Reference ID : 169.254.169.123 (169.254.169.123) # Stratum : 4 # Ref time (UTC) : Sat Jul 5 00:15:31 2026 # System time : 0.000003826 seconds fast of NTP time # Last offset : +0.000002154 seconds # RMS offset : 0.000003971 seconds # Frequency : 1.234 ppm slow # Residual freq : +0.000 ppm # Skew : 0.015 ppm # Root delay : 0.000000001 seconds # Root dispersion : 0.000017639 seconds # Update interval : 1025.3 seconds # Leap status : Normal

本記事のまとめ

AWS CloudWatchでLinuxサーバーを監視する設定手順をまとめます。
設定項目 手順・ポイント
IAMロールの確認 CloudWatchAgentServerPolicy と AmazonSSMManagedInstanceCore の2つをEC2ロールにアタッチ
CloudWatch Agentインストール sudo dnf install amazon-cloudwatch-agent でインストール後、ウィザードで設定ファイルを生成
エージェントの起動 amazon-cloudwatch-agent-ctl -a fetch-config -c file:... -s で設定を読み込んで起動
メモリ・ディスクのメトリクス CWAgent名前空間に mem_used_percent・disk_used_percent が届くことをコンソールで確認
アラームとSNS通知 aws cloudwatch put-metric-alarm でメモリ85%・ディスク80%の閾値アラームを作成
ログ集約 /var/log/messages → CloudWatch Logs へ転送。メトリクスフィルターでERROR検知
トラブルシュート エージェントログ確認 → IAMロール確認 → アウトバウンド443確認 → NTP時刻同期確認の順

AWSのインフラ設計をLinuxエンジニアとして体系的に学びたい方は、
AWSをLinuxエンジニアが学ぶためのロードマップもご覧ください。

AWSの監視設計を「実務の型」として身につけませんか?

CloudWatchの設定方法は調べれば分かります。でも「なぜその閾値を選ぶのか」「どのメトリクスを組み合わせるのか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。