AWS

【AWS】たのしいEC2ディスク監視

今回はEC2 のディスク使用率の監視についてです。

CloudWatch の標準メトリクスでは、EC2 のディスク使用率に該当するものがないので、
ユーザー側でちょこちょこ対応が必要となります。

”ちょこちょこ”とはズバリ、CloudWatch エージェントを導入すること(だけ)
なのですが、今回が初めての導入だったので簡単に整理してみました。

どうやって監視するのか

端的に言うと、
EC2 にCloudWatch エージェントを入れて、作成されるカスタムメトリクスを使用してCloudWatch で監視する
という方法になります。

調べると、やり方は結構色々あるようですので、
「他にはこんな手法もあるらしいよ」な情報も交えつつ
導入方法について整理していきます。

EC2 ディスク監視の方法は2つ

  • スクリプトを利用する方法
  • CloudWatchエージェントを利用する方法

いきなりですが、
先ほど記載した「CloudWatch エージェント」を利用する方法の他に、「スクリプト」による手法もあるようです。

今回は「CloudWatch エージェント」を利用する方法を採用したが、
どちらも『カスタムメトリクスを作成し、CloudWatch で監視する』という点は共通しているようです。

IAMロールの作成

IAMロールを作成する

必要となるIAMロール(およびアタッチするIAMポリシー)は以下の通り。

  • IAMロール:CloudWatchAgentServerRole
  • IAMポリシー:CloudWatchAgentServerPolicy

IAMロールをEC2 にアタッチする

上で作成したIAMロールを、EC2サーバーにアタッチする
※既にIAMロールがアタッチされている場合は、そのIAMロールに対して”IAMポリシー” をアタッチするとよい。(ただし他でも使用しているIAMロールの場合は、アタッチして問題ないか要確認)

EC2 への接続方法2つ

これ以降の作業は、EC2サーバーに接続してコマンドを実行していくのですが、
EC2サーバーへの接続方法は大きく分けて2つあります。

  • AWS Systems Manager(SSM) にて接続する
  • SSH にて接続する

なお、今回使用した方法は「SSHにて接続する」方法です。
SSM を使用した手順をよく目にしましたが、こちらを選びました。(GUIベースの手順を記録するのは面倒なので…w)

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

インストール方法は4つ

  • コマンドラインを使用して CloudWatch エージェントをインストールする
  • AWS Systems Manager を使用して CloudWatch エージェントをインストールする
  • AWS CloudFormation を使用して CloudWatch エージェントをインストールする
  • CloudWatch エージェントパッケージの署名を確認する

(参考:公式|CloudWatch エージェントのインストール

実際にインストールしてみる

上にあげた4つの方法のうち、今回使用する方法はこちら。

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

下記コマンド実行により、CloudWatchエージェントパッケージのダウンロードおよび、インストールを行います。

# CloudWatch エージェントパッケージをダウンロードする
sudo yum install amazon-cloudwatch-agent -y

CloudWatch エージェントの設定

設定ファイルの作成方法は2つ

  • ウィザードを使用して CloudWatch エージェント設定ファイルを作成する
  • CloudWatch エージェント設定ファイルを手動で作成または編集する

(参考:公式|CloudWatch エージェント設定ファイルを作成する

エージェント設定ファイルは、エージェントが収集するメトリクスとログを指定する JSON ファイルです。
このファイルを作成するには、ウィザードを使用するか、一から自分で作成します。

一度作成した設定ファイルは手動で変更することもできます。
ただし、変更を加えた場合にはエージェントの再起動により変更を有効にする必要があります。

実際に設定ファイルを作成してみる

上にあげた2つの方法のうち、今回使用する方法はこちら。

「ウィザードを使用して CloudWatch エージェント設定ファイルを作成する」

(参考:公式|CloudWatch エージェント設定ウィザードを実行する

下記コマンド実行により、設定ファイル作成ウィザードが起動します。
(参考:コチラの記事はSSM エージェントを利用した手順ではあるがウィザードに関する説明が丁寧に書かれててわかりやすかった)

# ウィザードを実行
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

ウィザード実行結果

$ 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
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
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: :
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: :
1
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: :
1
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: :
4
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: :
1
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: :
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: :
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
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
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: :
3
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
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
Do you want to monitor any log files?
1. yes
2. no
default choice: :
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: :
2
Program exits now.

CloudWatch エージェントの起動

SSH接続によりエージェントのインストールを行った場合の手順を以下に記載します。

※ウィザード実行時に「collectd を使用する」設定を行っている場合は、
 起動の前にcollectd がインストールされていることを確認しましょう。
 (詳細は後述の『起動エラー発生』参照)

# CloudWatchエージェントを起動
$ 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

(参考:公式|コマンドラインを使用して CloudWatch エージェントを起動する

起動エラー発生

起動コマンドを実行したところ、エラーが発生した。ログファイルは以下の通り。

$ cat /opt/aws/amazon-cloudwatch-agent/logs/configuration-validation.log
2021-01-22T02:04:46Z E! [telegraf] Error running agent: Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory

原因としては「collectd (データ収集用のツール)が存在しない」点にあるようです。
ウィザード実行時に「collectd を使用する」選択をしたのに、「ツール入ってないぜ」な状態ですね。

下記コマンドを実行してcollectd をインストールし、改めて起動することで無事起動することが出来ました。

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install -y collectd

(参考:collectd を使用したカスタムメトリクスの取得

その他、監視のために必要なこと

細かい操作方法などについては割愛しますが、取得できるようになったメトリクスを使用して監視(および通知)を行うために必要なタスクについて軽く触れてみます。

メトリクスの確認

一応、メトリクスの取得が上手くいっていることを確認しましょう。
CloudWatch エージェントの起動を行って数分待つと、コンソール画面にてカスタムメトリクスの確認が可能となります。
「CWAgent」リンクをクリックすることで各メトリクスを確認することが出来ます。

SNSトピックの作成

アラームの通知用にSNSトピックを作成する必要があります。
作成したトピックはサブスクライブ(購読) 承認が必要となりますので、必要に応じてメンバー等を追加しましょう。

CloudWatchアラームの作成

上で確認したメトリクスを使用して、統計やしきい値などを指定してアラームを作成します。
作成したアラームのアクションには、上で作成したSNSトピックを指定することで通知を受け取ることが可能となります。

余談

CloudWatchエージェントがサポートされるOS

カスタムメトリクスを送ることが出来るか確認

CloudWatch エージェントの状態確認

# 起動状態(status)を確認
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

# 停止
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

監視テスト時に使いそうなコマンド

# ディスクの空き領域を表示
df -h

# サイズを指定してダミーファイルを作成(ディスク領域の割り当てを行う)
fallocate -l 1g AAAAA.txt

# ディスクの使用量を表示
du -sh /usr/*

まとめ

サーバー内でログファイルが増え続け、「ディスク容量が不足」して問題となる場面はチラホラ見かけるので、ディスク監視が出来るようになったのは(個人的には)けっこう嬉しかったです。たのしい監視ライフの始まりですね。w

今回整理した「CloudWatch エージェントを利用したEC2 ディスク監視」の方法は、
たいして難しいことはやっておらず、手軽に導入でるようなので、どんどん活用(監視)していこうと思います。

最後まで読んでいただきありがとうございました。