EC2のCloudWatchメトリクスが選択できない原因と解決方法【メモリ・ディスクが出ない】

  • このエントリーをはてなブックマークに追加

スポンサーリンク

「EC2のアラームを作ろうとしたのに、監視したいメトリクスが選択肢に出てこない……」という経験はありませんか?特にメモリ使用率やディスク使用率を選ぼうとしたら見当たらない、というのはAWS初心者がつまずきやすいポイントです。

結論から言うと、原因は大きく次の2つに分かれます。この記事では、それぞれの見分け方と解決方法を順番に解説します。

  1. そもそもEC2がそのメトリクスを送っていない(メモリ・ディスク使用率など)→ CloudWatchエージェントで取得する
  2. メトリクスは存在するが、コンソールに表示される条件を満たしていない(データポイントが古い・インスタンスが停止中)→ 起動やCLIで対処する

まず確認:どんな状態か

典型的なのは、アラーム作成の途中で目的のメトリクスが見つからないケースです。手順を追って状態を確認しましょう。

AWSマネジメントコンソールにログインし、CloudWatchを開きます。左のメニューから「すべてのアラーム」をクリックします。

CloudWatchの「すべてのアラーム」画面

「アラームの作成」をクリックします。

CloudWatchのアラーム作成ボタン

続いて「メトリクスの選択」をクリックします。

CloudWatchのメトリクスの選択画面

ここで監視したいEC2インスタンスのメトリクスを探しても、選択肢に表示されない——というのが今回のテーマです。

目的のメトリクスが表示されない状態

原因1:メモリ・ディスク使用率は「デフォルトでは送られていない」

探しているのがメモリ使用率(mem_used_percent)やディスク使用率(disk_used_percent)なら、見つからないのは正常です。バグでも設定ミスでもありません。

EC2がデフォルトでCloudWatchに送っているのは、ハイパーバイザー(外側)から見える範囲のメトリクスだけです。具体的には次のようなものです。

  • CPU使用率(CPUUtilization)
  • ネットワーク送受信(NetworkIn / NetworkOut)
  • ディスクI/O(DiskReadBytes など)
  • ステータスチェック(StatusCheckFailed)

一方、メモリ使用率やディスクの空き容量は、OSの中を見ないと分かりません。「どのプロセスがどれだけメモリを使っているか」「マウントしたディスクの何%が埋まっているか」は、インスタンスの外側からは観測できないのです。そのため、これらを取りたい場合はOSの中にエージェントを入れて自分で送る必要があります。それがCloudWatchエージェントです。

解決:CloudWatchエージェントを導入する

大まかな流れは「①IAMロールを付ける → ②エージェントを入れる → ③設定して起動する」の3ステップです。順に見ていきます。

① EC2にIAMロールを付ける

エージェントがメトリクスを送信できるように、対象のEC2に CloudWatchAgentServerPolicy を含むIAMロールをアタッチします。設定ファイルをSSMパラメータストアで管理する場合は AmazonSSMManagedInstanceCore も付けておくと便利です。

IAMロールは「EC2 > インスタンス > アクション > セキュリティ > IAMロールを変更」から後付けできます。

② エージェントをインストールする

OSに合わせてインストールします。Amazon Linux 2023なら次のとおりです。

# Amazon Linux 2023 / 2
$ sudo dnf install -y amazon-cloudwatch-agent

Ubuntuなどでは、公式の.debパッケージを取得してインストールします。

# Ubuntu(x86_64の例)
$ wget https://amazoncloudwatch-agent.s3.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
$ sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

なお、SSHで1台ずつ入るのが面倒な場合は、Systems Manager(SSM)のRun CommandやDistributorから AmazonCloudWatchAgent パッケージをまとめて配布することもできます。台数が多い本番環境ではこちらが定番です。

③ 設定して起動する

付属の設定ウィザードを使うと、対話形式でメモリ・ディスクなどの収集設定を作れます。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

作成した設定ファイル(デフォルトでは /opt/aws/amazon-cloudwatch-agent/bin/config.json)を読み込んでエージェントを起動します。

$ 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

# 動作確認
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status

起動して数分待つと、CloudWatchのメトリクス一覧に CWAgent という名前空間が現れ、その中に mem_used_percent や disk_used_percent が表示されるようになります。あとはこのメトリクスを選んでアラームを作成すればOKです。

「デフォルトのCPU等はEC2側から、メモリ・ディスクはエージェント(CWAgent)から」と覚えておくと、探す場所を間違えずに済みます。

原因2:メトリクスはあるのに表示されない

CPU使用率のようなデフォルトで取れるはずのメトリクスが出てこない場合は、表示条件を疑います。よくあるのは次の2つです。

インスタンスが停止している

停止中のインスタンスはメトリクスを送っていないため、選択肢に現れないことがあります。インスタンスを起動し、数分待ってから再度確認してください。

データポイントが2週間以上ない

CloudWatchには、しばらくデータが来ていないメトリクスをコンソールに出さない仕様があります。公式ドキュメントでは次のように説明されています。

過去 2 週間に新しいデータポイントがないメトリクスは、コンソールに表示されません。また、これらはコンソールの [すべてのメトリクス] タブの検索ボックスにメトリクス名やディメンション名を入力しても表示されず、list-metrics コマンドの結果でも返されません。これらのメトリクスを取得する最善の方法は、AWS CLI の get-metric-data コマンドまたは get-metric-statistics コマンドを使用することです。

利用可能なメトリクスを表示する – Amazon CloudWatch

この場合、コンソールに出ていなくてもAWS CLIからは取得できます。例えば、利用可能なメトリクスの一覧は次のように確認できます。

$ aws cloudwatch list-metrics --namespace AWS/EC2 \
    --dimensions Name=InstanceId,Value=i-xxxxxxxxxxxxxxxxx

EC2の画面から直接アラームを作る

CloudWatch側からではなく、EC2インスタンスのメニュー(アクション > モニタリングとトラブルシューティング > CloudWatchアラームの管理)からアラームを作成する方法もあります。対象インスタンスが決まっている場合はこちらのほうが迷いにくいです。詳しくはAWS公式ドキュメントを参照してください。

まとめ

EC2のメトリクスが選択できないときは、次の順で切り分けると解決が早いです。

  • メモリ・ディスク使用率が無い → デフォルトでは送られない。CloudWatchエージェントを導入する(IAMロール → インストール → 設定・起動、名前空間は CWAgent)
  • CPU等の標準メトリクスが無い → インスタンスが停止していないか、2週間以上データが来ていないかを確認。CLIなら停止中でも取得できる
  • そもそもアラームを作りたいだけ → EC2インスタンスのメニューから直接作成するのも手

特に「メモリが選べない」で悩む人が多いですが、これはエージェントを入れれば解決すると分かっていれば怖くありません。RailsアプリをEC2で動かして監視したい場合にも、そのまま役立つはずです。

AWSでのRails運用そのものに興味がある方は、Rails 8をKamalでAWSにデプロイする方法や、Railsの前段にNginxは必要なのかもあわせてどうぞ。

スポンサーリンク

  • このエントリーをはてなブックマークに追加