こんにちは、櫻井です。
EC2インスタンスを監視するためのツールとして、CloudWatchを選ぶ方は多いと思います。CloudWatchでEC2インスタンスのメモリ使用率を監視したい場合、CloudWatchが標準で用意しているメトリクスの中に、「メモリ使用率」の項目が無いので、EC2インスタンスにCloudWatch Agentをインストールし、CloudWatchのカスタムメトリクスとしてメモリ使用率を出力し、監視できるようにする必要があります。今回はその方法を紹介します。
余談ですが、サーバーの監視項目として一般的な、「メモリ使用率」がなぜCloudWatchの標準メトリクスに含まれていないのか。という疑問が生まれたので調べてみました。
結論としては、責任共有モデルが関係しているようです。
責任共有モデルとは、どこまでがAWS側の責任で、どこまでがAWS利用者側の責任になるのかという範囲を分けるためのものです。
責任共有モデルについてはAWS公式ドキュメントに記載があるので、詳しく知りたい方は下記のリンクを参照してください。
上記のドキュメントを参考にすると、OSについての責任を持つ必要があるのはAWS利用者側にある。ということがわかります。
したがって、OSの役割に該当するメモリ使用率や、空きディスク領域、ログインユーザ数などは、AWSの管理領域外になるため、CloudWatchの標準メトリクスでは取得することができない。ということらしいです。勉強になりました。
では、これからCloudWatch Agentを使ったメモリ使用率の監視方法を紹介していきます。
目次
CloudWatch Agent起動前の準備
以下の手順でCloudWatch Agentの起動前の準備を行います。
- 起動するインスタンスにアタッチするIAMロールを作成する
- CloudWatch Agentをインストールする
- CloudWatch Agentの設定ファイルを作成する
- CloudWatch Agentを起動する
- メモリの使用率を確認する
前提
- 今回利用するEC2インスタンスのAMIはAmazonLinux2を利用しています。
- リージョンは東京リージョンを利用します。
起動するインスタンスにアタッチするIAMロールを作成する
AWS管理ポリシーであるCloudWatchAgentAdminPolicyがアタッチされたIAMロールを作成し、EC2にアタッチします。
CloudWatchAgentAdminPolicyとはCloudWatch Agentをサーバーにインストールし、メトリクスを CloudWatch に送信するために必要なポリシーです。
- “IAM” → “ロール” から “ロールを作成” をクリックします。
- “信頼されたエンティティタイプ” で “AWSのサービス” を選択し、”一般的なユースケース” に “EC2” を選択して次へ
- 許可ポリシーに”CloudWatchAgentAdminPolicy”を選択し、次へ
- 必要なポリシーがアタッチされていることを確認して、”ロールを作成”をクリックします。
これでロールの作成は完了です。
上記で作成したロールをメモリを監視したいEC2インスタンスにアタッチしてください。
CloudWatch Agentを監視対象のEC2インスタンスにインストールする
立ち上げたEC2インスタンスにログインしてCloudWatch Agentをインストールします。
以下のコマンドを実行してください。
1 |
sudo yum install amazon-cloudwatch-agent |
CloudWatch Agentの設定ファイルを作成する
amazon-cloudwatch-agent-config-wizardを起動します。
1 |
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard |
起動すると対話形式で設定を行うことができます。
OSの種別を聞かれています。Amazon Linuxなので、何も入力せずにEnterキーを押下します。
1 2 3 4 5 |
On which OS are you planning to use the agent? 1. linux 2. windows 3. darwin default choice: [1]: |
サーバはEC2かオンプレミスかを聞かれています。EC2なので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
Are you using EC2 or On-Premises hosts? 1. EC2 2. On-Premises default choice: [1]: |
Agent を稼働させるユーザーを聞かれています。 rootでいいので、何も入力せずにEnterキーを押下します。
1 2 3 4 5 |
Which user are you planning to run the agent? 1. root 2. cwagent 3. others default choice: [1]: |
StatsDを起動するかを聞かれています。StatsDは指標データを集計するためのデーモンなので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
Do you want to turn on StatsD daemon? 1. yes 2. no default choice: [1]: |
StatsDを使うためののポート番号を聞かれています。8125でいいので何も入力せずにEnterキーを押下します。
1 2 |
Which port do you want StatsD daemon to listen to? default choice: [8125] |
メトリクスの収集間隔を聞かれています。10秒でいいので、何も入力せずにEnterキーを押下します。
1 2 3 4 5 |
What is the collect interval for StatsD daemon? 1. 10s 2. 30s 3. 60s default choice: [1]: |
メトリクスの集計間隔を聞かれています。60秒でいいので、何も入力せずにEnterキーを押下します。
1 2 3 4 5 6 |
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キーを押下します。
1 2 3 4 |
Do you want to monitor metrics from CollectD? 1. yes 2. no default choice: [1]: |
CPU、メモリなどのホストメトリクスを監視するかを聞かれています。監視するので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
Do you want to monitor any host metrics? e.g. CPU, memory, etc. 1. yes 2. no default choice: [1]: |
CPUメトリクスをコアごとに監視するかを聞かれています。監視するので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply. 1. yes 2. no default choice: [1]: |
メトリクスに利用可能なディメンションを追加するかを聞かれています。追加するので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
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キーを押下します。
1 2 3 4 5 6 |
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キーを押下します。
1 2 3 4 5 6 |
Which default metrics config do you want? 1. Basic 2. Standard 3. Advanced 4. None default choice: [1]: |
設定内容が表示されるので、確認して問題ないようであれば、何も入力せずにEnterキーを押下します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Current config as follows: { "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "aggregation_dimensions": [ [ "InstanceId" ] ], "append_dimensions": { "AutoScalingGroupName": "${aws:AutoScalingGroupName}", "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}" }, "metrics_collected": { "collectd": { "metrics_aggregation_interval": 60 }, "disk": { "measurement": [ "used_percent" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 }, "statsd": { "metrics_aggregation_interval": 60, "metrics_collection_interval": 10, "service_address": ":8125" } } } } 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]: |
既存のCloudWatch Agentがあるかを聞かれています。今回は新規なので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
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]: |
監視したいログファイルがあるかを聞かれています。今回、ログファイルは監視しないので、2を入力してEnterキーを押下します。監視したいログファイルがある場合は、何も入力せずにEnterキーを押下します。
1 2 3 4 5 |
Do you want to monitor any log files? 1. yes 2. no default choice: [1]: 2 |
この設定をSSMパラメータストアに保存するかを聞かれています。保存したいので、何も入力せずにEnterキーを押下します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully. Current config as follows: { "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "aggregation_dimensions": [ [ "InstanceId" ] ], "append_dimensions": { "AutoScalingGroupName": "${aws:AutoScalingGroupName}", "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}" }, "metrics_collected": { "collectd": { "metrics_aggregation_interval": 60 }, "disk": { "measurement": [ "used_percent" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 }, "statsd": { "metrics_aggregation_interval": 60, "metrics_collection_interval": 10, "service_address": ":8125" } } } } 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キーを押下します。
1 2 |
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キーを押下します。
1 2 |
Which region do you want to store the config in the parameter store? default choice: [ap-northeast-1] |
設定ファイルをパラメータに送るためのクレデンシャルは何にするかを聞かれています。今回はデフォルトでいいので、何も入力せずにEnterキーを押下します。
1 2 3 4 |
Which AWS credential should be used to send json config to parameter store? 1. ******************(From SDK) 2. Other default choice: [1]: |
以下のように出力されれば設定は完了です。
1 2 |
Successfully put config to parameter store AmazonCloudWatch-linux. Program exits now. |
CloudWatch Agentを起動する
collectdをインストールする
collectdをインストールすることで、EC2インスタンスのメモリ使用率などの情報をカスタムメトリクスとしてAWS側に送ることができるようになります。こちらをインストールしないとCloudWatch Agentの起動に失敗するのでインストールします。
以下のコマンドでcollectdをインストールしてください。
1 |
$sudo amazon-linux-extras install collectd |
CloudWatch Agentを起動する
以下のコマンドを実行することでCloudWatch Agentを起動することができます。以下のコマンドの “-a fetch-config” は最新バージョンの CloudWatch Agentの設定ファイルをロードすることを意味しており、”-s” は起動を意味しています。”-c” にはSSMパラメータストアに保存されているパラメータを入力するので、先ほど作成したパラメータであるAmazonCloudWatch-linuxを入力しています。
1 |
$sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c ssm:AmazonCloudWatch-linux |
EC2インスタンス内でCloudWatch Agentが起動できているかを確認します。
1 |
$systemctl status amazon-cloudwatch-agent |
以下の画像のような出力がされていれば起動ができています。
メモリ使用率を確認する
- マネジメントコンソール上からCloudWatchに移動し、”すべてのメトリクス”にある、”CWAgent”をクリックします。
- “InstanceId”をクリックします。
- 作成したEC2インスタンスのメトリクス名の”mem_used_percent”を選択すると、メモリの使用率を確認できるようになります。
まとめ
これでインスタンスのメモリ使用率を外部から確認することができるようになりました。
インスタンスのメモリ使用率の監視は使う機会が多いと思うので、手間がかかるところではありますが、ぜひやってみてください。
一緒に働く仲間を募集中!
ギークフィードではAWSエンジニアを募集しています。
興味がある方はこちらからエントリーをしてぜひ一緒に働きましょう!
- 特定の時間あたりのlambda実行数をSlackに通知する - 2023-12-23
- 公衆電話からでも使える電話帳サービスをLEX + AmazonConnectで作ってみた - 2023-12-19
- SQSを使ってlambdaを10秒ごとに定期実行する - 2023-12-14
- Slack と AWS の電話番号登録アプリ – Bolt + CDK ソースコード解説 - 2023-03-26
- SlackとAWSを組み合わせた電話番号登録アプリの開発 – Boltフレームワーク+CDKで作ってみた - 2023-03-26