こんにちは。植松です。

AWS 環境では、EBS(Elastic Block Store)の容量が逼迫するとシステムに影響を及ぼす可能性があります。
今回は、CloudWatch メトリクスを利用して EBS のディスク使用率を監視し、閾値を超えた際に SNS を通じて通知する方法をご紹介します。

監視の仕組み

CloudWatch 自体には EBS の使用済み容量(ディスク使用率)のメトリクスはありませんが、CloudWatch Agent を EC2 に導入し、ディスク使用率をカスタムメトリクスとして CloudWatch に送信することで監視が可能になります。

手順

1.IAM ロールの作成

以下のポリシーを許可したロールを作成し、インスタンスにアタッチします。

・CloudWatchAgentAdminPolicy
・AmazonSSMManagedInstanceCore

2.CloudWatchエージェントインストール

エージェントを入れる方法はいくつかありますが、今回はAWS Systems Managerを使って入れます。
Systems Manager でインストールするには、対象サーバに SSM エージェントのインストール が必要です。
SSM エージェントをサーバにインストールすると、EC2・オンプレミスに関わらず AWS Systems Manager の コンソールから、情報を監視したり、リモートでコマンドを実行することが可能になります。

・collectdとSSMエージェントをEC2にインストール


# dnf install -y collectd
# dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
# systemctl enable collectd
# systemctl enable amazon-ssm-agent
# systemctl start collectd
# systemctl start amazon-ssm-agent

・Systems ManagerからCloudWatch エージェントのインストール

コンソール>Systems Manager>Run Command

AWS-ConfigureAWSPackageを検索、チェックを入れる

コマンドパラメータに以下を追加
・Action : Install
・Name : AmazonCloudWatchAgent
ターゲット:インスタンスを手動で選択する
出力オプションのS3へのログ出力は各々の環境に応じて有効化するか決めて下さい。↑以外の項目はデフォルトで進みます。

パラメータを入力した後は画面下の「実行」を押して、コマンドが完了することを確認します。

★ターゲットですが、SSMエージェントを入れた直後はインスタンスが表示されない場合があります。その時はインスタンスを再起動します。

・CloudWatch エージェントの設定ファイル作成

EC2に入り、以下コマンドを実行。ファイルを作成します。

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

基本はデフォルトのまま進めます。以下注意する箇所です。

you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
コアごとのCPUメトリクスを監視するかどうか聞かれています。追加料金がかかるようです。

Which default metrics config do you want?
収集するメトリクスセットを選択します。以下より各々最適なものを選択してください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html#cloudwatch-agent-preset-metrics

Do you want to monitor any log files?
監視したいログがある場合は1を選択し、監視対象のログファイルのパスを入力します。

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
ストア名の設定です。任意の名前を設定します。デフォルトでもOKですが、複数インスタンスを監視する場合は、インスタンス毎に名称を割り振ったほうが良いです。
ここに設定した名前は次の作業で利用しますので、控えておきます。
デフォルトはAmazonCloudWatch-linuxです。今回は、「AmazonCloudWatch-AL2023」としました。

正常に終了すれば AWS Systems Manager のパラメータストアに表示されます。

000526_1.png

・エージェントの起動

Systems Manager から 「Run Command」 を選択し、検索窓に 「AmazonCloudWatch-ManageAgent」 と入力後、表示された項目にチェック

「コマンドのパラメータ」 の以下項目に、先ほどパラメータストアに保存したファイル名を入力
Optional Configuration Location : ここに先ほど設定したストア名を入れる

「ターゲット」 の項目にて 「インスタンスを手動で選択する」 を選択し、対象のインスタンスにチェックし、画面下の「実行」を押して、コマンドが完了することを確認します。

・確認

コンソールから CloudWatch を選択し、「メトリクス」を押します。
すると、これまでなかった「CWAgent」という項目が表示されています。

000526_2.png

中に入ると、以下のようにメモリやボリュームの使用率が見れます。添付はボリュームの使用率を表示しています。

000526_3.png

3.アラートメール通知設定

続いて、アラートメールを自動送信する設定を行います。

・SNS(Simple Notification Service)の設定

コンソール>Simple Notification Service

<トピックの作成>

タイプ:スタンダード
名前:わかりやすい名称を設定してください。今回は「diskalert」としました。
表示名:わかりやすい名称を設定してください
他はデフォルトで、画面下の「トピックを作成」を押し、作成します。

<サブスクリプションの作成>
プロトコル:Eメール
エンドポイント:通知先メールアドレス
他はデフォルト、画面下の「サブスクリプションの作成」を押し、作成します。

確認メールが来るので、クリックして完了です。

・CloudWatchアラーム設定

コンソール>CloudWatch>ダッシュボード>アラーム

<アラームの作成>
メトリクスの選択→カスタム名前空間→disk_used_percentで絞り込んで、対象のボリュームを選択し、次へ

・条件
しきい値の種類:静的
disk_used_percent が次の時:より大きい
よりも:90 ←ここで閾値を設定します。数字を入力します。システム上は%で設定されます。

その他はデフォルトのままで、次へ

・通知

アラーム状態トリガー:アラーム状態
次の SNS トピックに通知を送信:既存の SNS トピック
通知の送信先:先ほど作成したトピックを指定し、次へ

アラーム名:わかりやすい名称を設定してください。これで設定完了です。

定期的にチェックが入り、閾値を越えたらこんな件名のメールが来ます。
ALARM: "diskalert" in Asia Pacific (Tokyo)

最後に

この方法を実装することで、EBS のディスク使用率を監視し、容量が逼迫した際に適切な通知を受け取ることが可能になります。EC2 に CloudWatch Agent を導入することで、EBS だけでなく CPU やメモリの監視も同様に実装できるため、システム全体の監視にも活用できます。SNSトピックをトリガーにしてLambdaを実行し、対象のEBSボリュームのサイズを増やすといったことも可能です。

EBS の容量管理を適切に行い、安定した AWS 環境を維持しましょう。