CloudWatchでEC2のメモリ使用量を監視する

ブログ用に使用しているEC2の使用メモリを調査したいなあと思ったので、AWSのCloudWatchでEC2のメモリを視覚的に監視できるよう設定しました。少しハマったのでメモ。

CloudWatchとは

ログの収集や監視を行うAWSのマネージドサービスです。公式には以下のように紹介されています。

CloudWatch は、ログ、メトリクス、およびイベントという形式でモニタリングデータと運用データを収集し、AWS とオンプレミスのサーバーで実行される AWS のリソース、アプリケーション、およびサービスの統合されたビューをユーザーに提供します。CloudWatch を使用して、環境内における異常動作の検知、アラームの設定、ログとメトリクスを並行させた視覚化、自動化されたアクションの実行、問題のトラブルシューティング、およびインサイトの検出を行い、アプリケーションのスムーズな実行を維持することができます。

https://aws.amazon.com/jp/cloudwatch/

相変わらず初心者には理解が難しい説明です…。

ログや、EC2などの監視対象の状態を収集して視覚化できるし、加えて異常の検知やアラーム発砲など色々できるサービスっぽいです。

さて肝心のEC2のメモリ情報の監視ですが、EC2側にCloudWatchエージェントをインストールして設定する必要があります。

エージェントをインストールしてCloudWatch側に情報を渡すことで、CloudWatch側で数日分の状態を見たり、自動で異常を検知して再起動したりできるようになります。ということで設定していきます。

前準備

ポリシーのアタッチ

AWSのサービスということでお決まりのポリシーのアタッチを行います。
EC2に既にアタッチしているロールがあると思いますので、追加でポリシーをアタッチします。

アタッチするポリシーは以下の2つです。

  • CloudWatchAgentAdminPolicy
  • AmazonSSMManagedInstanceCore

CloudWatchAgentAdminRoleと似たようなポリシーでCloudWatchAgentServerPolicyというものがあります。

違いは、エージェントの設定をパラメータストアに書き込む権限の有無です。

パラメータストアに設定を保存したい場合はCloudWatchAgentAdminPolicyをアタッチする必要がありますが、不要の場合は権限の弱いCloudWatchAgentServerPolicyをアタッチする方がよいです。

一度パラメータストアに設定ファイルを保存しておくとその設定を使いまわせるので、既にパラメータストアに保存している設定を使う場合はCloudWatchAgentServerPolicyのポリシーをアタッチするとよいと思います。

AmazonSSMManagedInstanceCoreはSSM(AWS System Manager)用のポリシーです。
同じようにSSM用のポリシーで「AmazonEC2RoleforSSM」というものもありますが、現在はAmazonSSMManagedInstanceCoreが推奨です。

AWSコンソールから「IAM」→「ロール」と進んでいき、該当EC2にアタッチしているロールを選択。

「ポリシーをアタッチします」ボタンを押下して、上記2つのポリシーをアタッチ!

SSMエージェントのインストール

SSMのエージェントをインストールします。

現在は以下のAMIにはデフォルトでインストールされているので、以下のAMIでEC2インスタンスを作成した場合はこの手順は必要ありません。

  • Amazon Linux
  • Amazon Linux 2
  • Amazon Linux 2 ECS-Optimized AMIs
  • Ubuntu Server 16.04, 18.04, and 20.04

インストール

sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

自動起動の有効

sudo systemctl enable amazon-ssm-agent

CloudWatchエージェントのインストールと設定

CloudWatchエージェントのインストール

EC2にSSMエージェントがインストールされていると、AWSコンソールのSystem Managerから操作することができます。

System ManagerからCloudWatchエージェントをインストールします。

AWSコンソール左上の「サービス」から「System Manager」を検索してアクセス。

System Managerページの左列にある「Run Command」をクリック。
下のような画面になった場合は「コマンドを実行する」をクリック。

SystemManager-RunCommand

下のような画面になった場合は右上にある「Run command」をクリック。

Run commandボタン

「AWS-ConfigureAWSPackage」で検索して選択。

AWS-ConfigureAWSPackage検索

コマンドのパラメータの項目を設定します。
Action:Install
Name:AmazonCloudWatchAgent

と設定。

コマンドのパラメータ欄入力

ターゲットの項目の設定。
インスタンスを手動で選択する」にチェックを入れて該当のEC2を選択。

ターゲット項目の設定

以上までできたら右下にある「実行」を押下します。

以下のような画面になります。進行中成功に変わったらバッチリです!

実行後のステータス

これでCloudWatchエージェントのインストールができました。

CloudWatchエージェントの設定

CloudWatchエージェントをインストールできましたが、起動するためにはエージェントの設定ファイルが必要です。

パラメータストアに書き出している設定ファイルもない場合は、まず設定ファイルを作成する必要があります。

ということで、エージェントの設定をしていきます。

まず対象EC2にログインして、以下のコマンドを実行します。

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

上記コマンドを実行すると、対話型で設定ができるので順番に答えていきます。
デフォルトで指定されている答えで良い場合はEnterキーを打鍵でOKです。

質問入力
サーバのOSについて

On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
      Enter
サーバがEC2かオンプレか

Trying to fetch the default region based on ec2 metadata…
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
Enter
エージェントをどの権限で実行するか

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
Enter
StatsデーモンをONにするか。Statsデーモンはデータ収集のツール。
ONにしときます。


Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
Enter
Statsデーモンのポート

Which port do you want StatsD daemon to listen to?
default choice: [8125]
Enter
Statsデーモンの収集間隔

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
Enter
Statsデーモンが収集するメトリクスを集約する間隔

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
Enter
Collectデーモンで収集するメトリクスを監視したいか。
Collectデーモンもデータ収集用。メモリ情報を収集できるのでyes


Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
Enter
CPUやメモリを監視したいか。

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
Enter
CPUメトリクスをコア毎に監視したいか?追加料金がかかる場合もある

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
EC2のIDやタイプなどを監視項目に追加したいかどうか。

Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName)
into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
Enter
メトリクスの収集間隔

Would you like to collect your metrics at high resolution (sub-minute resolution)?
This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
Enter
AWSが定義したメトリクスセットのどれを使うか。
メトリクスセットによって収集されるメトリクスが違う(参考)。
良くわからないのでStandardにしてみた。


Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
上記までの設定が表示されて、これでOKかと問うてくる。

Are you satisfied with the above config? Note: it can be manually customized
after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
Enter
CloudWatch Logエージェントはあるか。
ないし、CloudWatch Logエージェントは廃止予定らしいのでnoで。


Do you have any existing CloudWatch Log Agent
(http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
Enter
ログファイルを監視するかどうか。

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
Enter
上記までの設定が表示される。
SSMパラメータストアに設定を保存するかを問うてくる。


Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
Enter
パラメータストアに保存するときの設定ファイルの名前を決める。
最初に「AmazonCloudWatch-」をつけてね、と言われている。

なんでもよいがデフォルトのものにする。

What parameter store name do you want to use to store your config?
(Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
Enter
設定ファイルをどのリージョンに保存するか。

Trying to fetch the default region based on ec2 metadata…
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]
Enter
どのロールを使用してパラメータストアへ設定ファイルを送るか。
パラメータストアへ書き込み権限のあるCloudWatchAgentAdminRoleポリシーを
アタッチしたロールをEC2にアタッチしているのでデフォルトに表示されている。


Which AWS credential should be used to send json config to parameter store?
1. ●●●●●●●●●●●●●●
2. Other
default choice: [1]:
Enter

上記の質問に全て回答すると、
Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.
と表示されます。

これで設定ファイルがパラメータストアに送られました。
AWSコンソールで「AWS System Manager」→「パラメータストア」をみると、作成した設定ファイルができています!

パラメータストアに設定ファイル保存完了

エージェントを起動

作成したエージェントの設定を使って、CloudWatchエージェントを起動します。

AWSコンソールで「AWS Systems Manager」→「Run Command」を選択。
画面上の「コマンドを実行」もしくは「Run command」を押下。

コマンドドキュメントの検索窓で「AmazonCloudWatch-ManageAgent」と入力。
表示されたものを選択。

AmazonCloudWatch-ManageAgent入力

コマンドのパラメータの「Optional Configuration Location」の欄にパラメータストアに保存した設定ファイルの名前を入力する。

今回はデフォルトの名前なので「AmazonCloudWatch-linux」と入力。

エージェント設定ファイル名入力

ターゲットの項目で「インスタンスを手動で選択する」を選択して、該当のEC2インスタンスを選択。

上記までが完了したら右下にある「実行」を押下!
これでCloudWatchエージェントが起動します。

私はエラーとなって一発でうまくいきませんでした…?
詳細は以下。

collectdがインストールされていないエラー

Systems ManagerのRun CommandでCloudWatchエージェントの起動しようとしたらエラー。

「Systems Manager」→「RunCommand」で表示される画面に「コマンド履歴」タブがあります。

コマンド履歴タブ

「コマンド履歴」タブを押下すると、コマンド実行履歴が表示されるので、
失敗したコマンドを押下します。

「ターゲットと出力」にエージェント起動に失敗したインスタンスが表示されるので、
EC2インスタンスを選択して「出力の表示」を押下します。

エラー発生コマンドの出力の表示

そうすると以下のように詳細が見られます。

実行コマンドの出力詳細

失敗コマンドの出力を見ると以下のように書かれてありました。

エラー出力詳細
======== Error Log =========
2021-03-01T15:42:47Z E! [telegraf] Error running agent: Error parsing /opt/aws/amazon-cloudwatch-agent/etc/ammazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file of directory

no such file of directoryと言われてます。

調べたら「collectd」がEC2にインストールされていなさそうでした。

下記コマンドでインストールです!

sudo yum install collectd

インストール完了後、エージェントの起動手順を再度行うと無事成功しました!

CloudWatchメトリクスでメモリ使用量を確認

実際にEC2のメモリ使用量を確認してみます。

AWSコンソールで「CloudWatch」と検索。

左列の「メトリクス」をクリック。

すべてのメトリクスの中に「CWAgent」があるので押下。
ImageId,InstanceId,InstanceType」を押下すると、以下のような画面に。

メトリクス名「mem_used_percent」の行にチェックをいれると上図のようにメモリ使用量をグラフで視覚的に確認することができます。

1時間、3時間、1日などのように期間を切って確認することができます。
マウスをグラフ上にあわせると具体的な数値を確認することもできます。

これでEC2のメモリ状態を監視して異常を見つけたり原因や対策を考えたりすることができるようになりました!

状態に応じて決めた動作を実行することもできるようなので、いずれそちらの設定もできたら!

では!
\楽しい人生/

ブログランキング・にほんブログ村へ