AWS

CloudWatchエージェントでディスク使用率の可視化を簡単に実装してみた

Mattermostサーバ、検証用途のサーバ、サービス紹介用のデモサイトなどのために、弊社ではいくつかEC2でAWS上にサーバを構築しています。

サーバは構築してしばらくは良いのですが、サーバを長期的に運用していくと、メモリ不足やログやWorkファイルなどによるディスク使用率の圧迫などが起きることがあります。

サービスなどで顧客に提供しているサーバはきっちり設計して監視できていても、自社向けで利用しているものってコストをかけたくないので、ついついこういう監視は後回しになりがち。
使いたいときに100%になってしまったりしていて使えなかったり。。。

いちいちサーバにログインして、dfコマンドを打つのも煩わしいので、CloudWatchエージェントで簡単にディスク使用率の可視化を実装してみました。

IAMロールの作成・ポリシーの適用

CloudWatchエージェントを実行する上で必要なIAMポリシーを適用していきます。

  • 必要なポリシー:CloudWatchAgentServerPolicy

既にIAMロールがアタッチされている場合は、ポリシーを追加で大丈夫です。

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

では、さっそくCloudWatchエージェントをインストールしていきましょう。
Linuxのディストリビューションでインストール方法が異なります。そのほかのOSの場合はサポートサイトを参照ください。

Amazon Linux2の場合

$ sudo yum install amazon-cloudwatch-agent

CentOSの場合

$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm
$ sudo rpm -U amazon-cloudwatch-agent.rpm
インストールが完了したら自動起動を有効にしておきましょう。
$ sudo systemctl enable amazon-cloudwatch-agent

念のため、statusを見てみましょう。(/etc/systemd/system/amazon-cloudwatch-agent.service; enabled;になっていればOKです)

$ sudo systemctl status amazon-cloudwatch-agent
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
Active: inactive (dead)

引き続き起動に必要なモジュールをインストールしていきます。
collectdはCPU、メモリ、ディスク関係のメトリクスを取得するために必要です。インストールをしておかないとエージェント起動時に「open /usr/share/collectd/types.db: no such file or directory」のエラーになります。

### Amazon Linux2の場合
$ sudo amazon-linux-extras install epel

### CentOSの場合
$ sudo yum install epel-release

### epelのリポジトリ有効以降は同じ手順で
$ sudo yum-config-manager --enable epel
$ sudo yum install collectd

CloudWatch エージェントの設定

CloudWatch エージェントの設定ファイルの初期化をしていきます。
「amazon-cloudwatch-agent-config-wizard」とウィザードが用意されています。
手動でも可能ですが、今回は手軽に実施したいのでウィザードを利用します。

コマンドベースに受け答えをしていくことで設定できます。
基本的にデフォルトで設定しています。今回はログファイルの監視はなしとSSMパラメータストアへの設定保存はしないようにしています。
また、取得するメトリクスはデフォルトの「Basic」。メモリの使用率とディスクの使用率のみです。
取得するメトリクスを変えたい場合は、「ウィザードを使用して CloudWatch エージェント設定ファイルを作成する」を参考にしてください。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:

> [Enter]

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]

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:

> [Enter]

Which port do you want StatsD daemon to listen to?
default choice: [8125]

> [Enter]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

> [Enter]

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]

Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:

> [Enter]

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

> [Enter]

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:

> [Enter]

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]

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:

> [Enter] 

Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "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]:

> [Enter] 

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]:

> 2

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": {
                "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]:

> 2

Program exits now.

CloudWatchエージェントの起動

設定が完了したら起動します。初回起動はコマンドで実行する必要があるようです。

$ 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

なお、私の環境ではもう一度デーモンの再起動をしないとCloudWatchでデータが表示されませんでした。

$ sudo systemctl status amazon-cloudwatch-agent

CloudWatchメトリクスで確認

それでは、CloudWatchではどのように見えるか見てみましょう。

メトリクスはカスタム名前空間の「CWAgent」のメトリクスに格納されます。

実際のMattermostサーバのグラフになります。

コストについて

基本的にはざっくりと「1メトリクス」が「$0.3」という計算でよいかと思います。
少なくとも今回実施したウィザードで設定した場合は、この計算でほぼ問題ないかと思います。

ちなみに厳密には違うようで、以下のような記事を載せている方がおりました。 
参考記事:CloudWatchのカスタムメトリクスについて、料金計算が分かりづらかったので確認した

ディスクを設定するとパーティション毎にメトリクスが作成されるので、1サーバあたり5~8ぐらいできてしまうのではないでしょうか。7個と仮定すると1サーバあたり、$2.1になります。手軽ではありますが思いのほか高いなと思ってしまいました。(カスタムメトリクスは10個までは無料枠なので1サーバだけなら無料枠で補えますね。)

さいごに

弊社ではエンジニア募集してます。AWSに興味があるエンジニアも大歓迎です。

https://www.wantedly.com/companies/company_6372758/projects


Recruit

ディーメイクでは各ポジションで一緒に働く仲間を募集中! エンジニア、デザイナー、ディレクターなど、多彩な職種があります。
一緒に成長していきましょう!

最新記事

おすすめ記事リンク

-AWS
-,