プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

CloudWatch Agent を試してみました

さて、こちらの記事で書いたように、自分用の Redmine を 4.1.1 にアップデートしました。この際、サーバーも新たにしました。

以前、下記の記事で書いたようにディスク容量がひっ迫してえらい目にあったので、今回もディスクの空き容量の監視を行いたいと思います。

blog.mori-soft.com

更新前のサーバー(Redmine 3.3.2 を運用)では CloudWtach スクリプトを利用して、ディスク容量監視を行っていました。設定方法などはこちらの記事にありますのでご参考にどうぞ。

今回も同じようにすればよいと思い調べてみると、昨今は Cloudwatch スクリプトではなくて、CloudWatch Agent を使うのが良いようです。

ということで、試してみたので、メモっときます。

Cloudwatch Agent によるディスク使用量の監視

まず、 CloudWtach Agent がどんなものか調べてみました。

Amazon Systems Manager と統合されていたり、インスタンス内のログを CloudWtach で管理できたりと非常に便利そうです(使わないけど)。

ま、まずは試してみないとなんとも言えないので、やってみます。

IAM ロールの作成

CloudWatch Agent を使うには IAM ロールがいるとのことなので、作成します。

AWS のコンソールで IAM を選び、ロールの作成を選択します。サービスとして、EC2を選びます。

f:id:junichim:20200701165339p:plain

次に、ポリシーとして、 CloudWatchAgentServerPolicy を選択します。 Amazon Systems Manager は使わないので、 CloudWatchAgentAdminPolicy は不要です。

f:id:junichim:20200701165505p:plain

あと、ロール名を適当に設定すれば完了です。

f:id:junichim:20200701165654p:plain

これを EC2 のインスタンスに割り当てます。 割り当てたいインスタンスを選び、

f:id:junichim:20200701165813p:plain

アクションから、『インスタンスの設定』、『IAMロールの割り当て/置換』と進みます。

f:id:junichim:20200701170004p:plain

割り当て設定画面で、先ほど作成した IAM ロール名を選択すれば完了です。

インストール

実際に作業する際の手順は下記を参考にしました。

コマンドラインを使用して CloudWatch エージェントをインストールする - Amazon CloudWatch

インストールはコマンドラインから行います。

ダウンロード

bitnami@ip-172-30-0-111:~$ wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/debian/amd64/latest/amazon-cloudwatch-agent.deb
--2020-06-28 18:25:35--  https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/debian/amd64/latest/amazon-cloudwatch-agent.deb
s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com) をDNSに問いあわせています... 52.219.136.54
s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com)|52.219.136.54|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 57648712 (55M) [application/octet-stream]
`amazon-cloudwatch-agent.deb' に保存中

amazon-cloudwatch-agent.deb                 100%[==========================================================================================>]  54.98M  91.3MB/s 時間 0.6s

2020-06-28 18:25:36 (91.3 MB/s) - `amazon-cloudwatch-agent.deb' へ保存完了 [57648712/57648712]

bitnami@ip-172-30-0-111:~$

パッケージのインストール

bitnami@ip-172-30-0-111:~$ sudo dpkg -i -E amazon-cloudwatch-agent.deb
以前に未選択のパッケージ amazon-cloudwatch-agent を選択しています。
(データベースを読み込んでいます ... 現在 31402 個のファイルとディレクトリがインストールされています。)
amazon-cloudwatch-agent.deb を展開する準備をしています ...
create group cwagent, result: 0
create user cwagent, result: 0
amazon-cloudwatch-agent (1.246396.0-1) を展開しています...
amazon-cloudwatch-agent (1.246396.0-1) を設定しています ...
bitnami@ip-172-30-0-111:~$

特に問題もなくパッケージがインストールされました。

設定

CloudWtach Agent の設定はウィザードでやるのが簡単なようです。

bitnami@ip-172-30-0-111:~$ 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
default choice: [1]:
1
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]:
1
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
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]:
1
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]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
Current config as follows:
{
// 中略
}
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]:
1
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
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:
{
// 中略
}
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.
bitnami@ip-172-30-0-111:~$

中略としているところでは、作成されたjsonファイルが表示されています。 ほとんどがデフォルトを選べば問題ないようです。なお、メトリクスの種類として、ディスクの i-ノードの残り容量を知りたかったので、 Standard を選択しています。

試用

設定が終わったら、起動してみます。

bitnami@ip-172-30-0-111:~$ 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
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2020/06/28 21:12:56 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
No log configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.
bitnami@ip-172-30-0-111:~$

動いているか確認します。

bitnami@ip-172-30-0-111:~$ /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
{
  "status": "running",
  "starttime": "2020-06-28T12:12:57+00:00",
  "version": "1.246396.0"
}
bitnami@ip-172-30-0-111:~$

問題ないようです。

しばらくしてから、 AWS のコンソールで CloudWatch のメトリクスを見ると、 カスタムメトリクス CWA が追加されており、ディスク容量などの状態を見ることができました。

費用問題

さて、これでディスク容量も監視できるようになったし、めでたしめでたし、と終わりたかったのですが、よくよく考えてみるとカスタムメトリクスが結構大量に追加されています。これって、お金かかるんじゃなかったっけ?と思い出して、調べてみました。

すると、今回の場合はカスタムメトリクスが28個も追加されてて、0.3/メトリクス/月なので、約$8.5ぐらい毎月かかることになります。

マジ!?

EC2のインスタンス代よりはるかに大きいです・・・

せっかく、EC2 のインスタンス代を抑えようとしてスポットインスタンスをつかったりしてたのに、本末転倒感がたっぷりです(まあ、監視も必要なので、本当は本末転倒ではないんですがね)。

ということで、このままで使い続けるわけにはいかないので、一旦アンインストールしておきます。

アンインストール

とりあえず、メトリクスの送信を停止します。

bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
bitnami@ip-172-30-0-111:~$ 
bitnami@ip-172-30-0-111:~$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "stopped",
  "starttime": "",
  "version": "1.246396.0"
}
bitnami@ip-172-30-0-111:~$ 

改めて、状態を確認します。

bitnami@ip-172-30-0-111:~$ sudo systemctl status amazon-cloudwatch-agent.service 
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2020-06-30 08:34:15 JST; 2min 55s ago
  Process: 2302 ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent (code=killed, signal=TERM)
 Main PID: 2302 (code=killed, signal=TERM)

 630 08:34:15 ip-172-30-0-111 systemd[1]: Stopping Amazon CloudWatch Agent...
 630 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Main process exited, code=killed, status=15/TERM
 630 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Succeeded.
 630 08:34:15 ip-172-30-0-111 systemd[1]: Stopped Amazon CloudWatch Agent.
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
bitnami@ip-172-30-0-111:~$ 

このままだと再起動するとサービスが始まるので、無効にしておきます。

(参考) https://forums.aws.amazon.com/thread.jspa?messageID=908106

bitnami@ip-172-30-0-111:~$ sudo systemctl disable amazon-cloudwatch-agent.service 
Removed /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service.
bitnami@ip-172-30-0-111:~$ 
bitnami@ip-172-30-0-111:~$ sudo systemctl status amazon-cloudwatch-agent.service 
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

 630 08:34:15 ip-172-30-0-111 systemd[1]: Stopping Amazon CloudWatch Agent...
 630 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Main process exited, code=killed, status=15/TERM
 630 08:34:15 ip-172-30-0-111 systemd[1]: amazon-cloudwatch-agent.service: Succeeded.
 630 08:34:15 ip-172-30-0-111 systemd[1]: Stopped Amazon CloudWatch Agent.
bitnami@ip-172-30-0-111:~$ 

まあ、このままにしておいてもいいんですが、ついでなのでパッケージも削除しておきます。

bitnami@ip-172-30-0-111:~$ sudo dpkg -r amazon-cloudwatch-agent 
(データベースを読み込んでいます ... 現在 32407 個のファイルとディレクトリがインストールされています。)
amazon-cloudwatch-agent (1.246396.0-1) を削除しています ...
bitnami@ip-172-30-0-111:~$ 

ゴミ収集

bitnami@ip-172-30-0-111:~$ sudo rm -rf /opt/aws/

これでアンインストールされました。

メトリクスは自分で削除することはできなくて、一度メトリクスを追加したら15ヶ月は消えないそうです・・・・ 高い授業料になりました。

次善策

ということで、 CloudWatch Agent は便利そうですが、お金もそれなりに必要なので今回は採用を見合わせました。

じゃあ、どうやって監視するのがいいのか? 例えば、

  • 既にサポート外となった、 CloudWatch スクリプトを使う
  • zabbixサーバー立てる
  • 自分でディスク容量調べて、メール通知する
  • etc

なんかが頭に浮かんでますが、どうするのがいいか、決めきれていません。 あー、悩ましい。 しばらく考えてみようと思います。

一応、モニタリングスクリプトの記事もまだあります。

Amazon EC2 Linux インスタンスのメモリとディスクのメトリクスのモニタリング - Amazon Elastic Compute Cloud