こんにちは。
カスタマーサクセス部の山本です。😺
Qiita のアドベントカレンダー、23 日目のお題は、久しぶりに EC2 の記事です。
23 日なので、Amazon Linux 2023 の記事にしてみました。
背景
オンプレの DB から、Aurora に DB 移行を進めています。
一時的な EC2 を用意してデータを置いておき、変換処理をして Aurora に移行しています。
そんなある日、EC2 が起動しているものの、 いつものように、Systems Manager から接続できません。
そこで、システムログを見てみましょう。
ストレージの空き領域がないため、cloud-init の起動に失敗しているようです。
cloud-init[1706]: OSError: [Errno 28] No space left on device
レスキュー用のインスタンスを用意してストレージを拡張し、OS を再び起動することで、解決はできそうです。
今後も同じことが起きるかもしれないので、CloudWatch Agent を使って、ストレージの空き容量を監視し、80 % を超えてきたら通知するようにしてみましょう。
本記事は、CloudWatch Agent を導入し、ストレージの空き容量を監視することについて記載します。
CloudWatch Agent で監視できるメトリクス
(参考) Windows
ドキュメント:CloudWatch エージェントにより収集されるメトリクス を見ると、Windows と Linux で異なるようです。
Windows では、「パフォーマンスモニター」の「カウンター」に関連するメトリクスを取得できます。
\Processor(_Total)\% Processor Time
などです。
参考:パフォーマンス データの収集
Linux
Linux では、以下のドキュメントの表に記載のメトリクスを監視できます。
Linux および macOS インスタンスで CloudWatch エージェントにより収集されるメトリクス
抜粋すると、主に CPU 、メモリー、ディスク、ネットワーク、プロセスの情報が取れそうです。
インフラの監視としては十分です。
- cpu_time_active
- cpu_time_guest
- cpu_time_guest_nice
- cpu_time_idle
- cpu_time_iowait
- cpu_time_irq
- cpu_time_nice
- cpu_time_softirq
- cpu_time_steal
- cpu_time_system
- cpu_time_user
- cpu_usage_active
- cpu_usage_guest
- cpu_usage_guest_nice
- cpu_usage_idle
- cpu_usage_iowait
- cpu_usage_irq
- cpu_usage_nice
- cpu_usage_softirq
- cpu_usage_steal
- cpu_usage_system
- cpu_usage_user
- disk_free
- disk_inodes_free
- disk_inodes_total
- disk_inodes_used
- disk_total
- disk_used
- disk_used_percent
- diskio_io_time
- diskio_iops_in_progress
- diskio_read_bytes
- diskio_read_time
- diskio_reads
- diskio_write_bytes
- diskio_write_time
- diskio_writes
- ethtool_bw_in_allowance_exceeded
- ethtool_bw_out_allowance_exceeded
- ethtool_conntrack_allowance_exceeded
- ethtool_linklocal_allowance_exceeded
- ethtool_pps_allowance_exceeded
- mem_active
- mem_available
- mem_available_percent
- mem_buffered
- mem_cached
- mem_free
- mem_inactive
- mem_total
- mem_used
- mem_used_percent
- net_bytes_recv
- net_bytes_sent
- net_drop_in
- net_drop_out
- net_err_in
- net_err_out
- net_packets_recv
- net_packets_sent
- netstat_tcp_close
- netstat_tcp_close_wait
- netstat_tcp_closing
- netstat_tcp_established
- netstat_tcp_fin_wait1
- netstat_tcp_fin_wait2
- netstat_tcp_last_ack
- netstat_tcp_listen
- netstat_tcp_none
- netstat_tcp_syn_recv
- netstat_tcp_syn_sent
- netstat_tcp_time_wait
- netstat_udp_socket
- processes_blocked
- processes_dead
- processes_idle
- processes_paging
- processes_running
- processes_sleeping
- processes_stopped
- processes_total
- processes_total_threads
- processes_wait
- processes_zombies
- swap_free
- swap_used
- swap_used_percent
本記事で監視対象とするメトリクス disk_used_percent
「ストレージの空き容量を監視し、80 % を超えてきたら通知する」ためには、「ディスクスペース合計に対する使用済みの割合。」を示すdisk_used_percent
が適していそうです。
CloudWatch Agent の導入
CloudWatch エージェントをインストールするを参考にすると、以下のインストールコマンドでインストールできます。
sudo yum install amazon-cloudwatch-agent
また、EC2 のインスタンスプロファイルには、以下の AWS 管理ポリシーがあると十分な権限になりそうです。
CloudWatchAgentServerPolicy
プライベートサブネットの EC2 の場合、以下の VPC エンドポイントが必要みたいです。
com.amazonaws.ap-northeast-1.monitoring
com.amazonaws.ap-northeast-1.ec2
インストーラが S3 バケット上で公開されているので、S3 のゲートウェイ型 VPC エンドポイントもあると良いです。
com.amazonaws.ap-northeast-1.s3
構成図
以下のような構成にします。
環境
- Amazon Linux 2023
- ami-023ff3d4ab11b2525
- al2023-ami-2023.6.20241121.0-kernel-6.1-x86_64
- ami-023ff3d4ab11b2525
- Systems Manager の Session Manager を使用して、導入作業を実施する
- インスタンスタイプ
- t2.micro
- CloudWatch Agent を導入するために必要な CPU 数やメモリ量に関しては、ドキュメントがないため最小構成
- 本当は t3 系が新しくておすすめです
- t2.micro
いざ、導入
VPC エンドポイントを作り、セキュリティグループでは EC2 からの HTTPS アクセスを許可しました。
com.amazonaws.ap-northeast-1.monitoring
com.amazonaws.ap-northeast-1.ec2
CloudWatch Agent のインストールモジュールは S3 バケット上で公開されているので、S3 の VPC エンドポイント(無料のゲートウェイ型のもの)も作りました。
参考:コマンドラインを使用して CloudWatch エージェントをダウンロードおよび設定する - Amazon CloudWatch
com.amazonaws.ap-northeast-1.s3
EC2 のインスタンスプロファイルに、IAM ポリシー CloudWatchAgentServerPolicy
を付与しました。(下)
インストールしましょう。
sudo yum install amazon-cloudwatch-agent
インストールできました。
サービスが disable (無効)なので、有効にしましょう。
有効化:sudo systemctl enable amazon-cloudwatch-agent
確認:systemctl status amazon-cloudwatch-agent
気づいたこと
EC2 インスタンスの「モニタリング」タブに「CloudWatch エージェントを設定」ボタンがあり、導入で行った操作をここで全部ポチポチできました。
メトリクスの設定も変更できます。
簡単ですね。素晴らしいです。
確認
CloudWatch のサービス画面にいき、「すべてのメトリクス」画面を開きます。
CWAgent
という名前空間に、メトリクスが出ています。
初期状態では mem_used_percent
というメトリクスのみ存在します。
ストレージの空き容量を監視できるように修正
「ディスクスペース合計に対する使用済みの割合。」を示すdisk_used_percent
をメトリクスにしたいので設定変更をします。
設定ファイルは、以下の場所にありました。ファイル名はインストールを実施したユーザー名(ssm) が接頭についています。
フォルダ:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/
ファイル名:ssm_EC2-Custom-Metrics-e48d441a-b3b0-4d2d-a367-486d7f9fdd8f
なお、このフォルダにある設定ファイルを全て読み込んでいるそうです。
参考:CloudWatch エージェント設定ファイルの管理 - AWS 規範ガイダンス
Linux の場合、 CloudWatch 設定ディレクトリは にあります/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d。
CloudWatch エージェントを起動すると、エージェントはこれらのディレクトリにある各ファイルを自動的に追加して、 CloudWatch 複合設定ファイルを作成します。
中身:
{ "agent": { "metrics_collection_interval": 60 }, "metrics": { "namespace": "CWAgent", "append_dimensions": { "InstanceId": "${aws:InstanceId}" }, "metrics_collected": { "mem": { "measurement": [ "used_percent" ] } } } }
メモリ使用率しか取得していません。
せっかくなので、EC2 インスタンスの「モニタリング」タブにある「CloudWatch エージェントを設定」ボタンから設定を変えてみます。
「Compute Optimizer メモリ」を外し、「ディスク」にチェックします。
設定ファイルは以下のようになります。便利ですね。
{ "agent": { "metrics_collection_interval": 60 }, "metrics": { "namespace": "CWAgent", "append_dimensions": { "InstanceId": "${aws:InstanceId}" }, "metrics_collected": { "disk": { "measurement": [ "used_percent" ] } } } }
これでファイルシステムの使用率が取得できるはずです。
「設定が正常に送信されました」と出ました。
フォルダでは最初の設定ファイルが削除になり、新しい設定ファイルができています。
エージェントのログ
ちなみに、エージェントのログが以下の場所にあり、設定変更に関するログも出ていました。
トラブルシューティングに使えそうですね。
/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
改めて確認
CWAgent
名前空間に disk_used_percent
というメトリクス名で、デバイス毎にメトリクスが出ています。
OS の認識している使用量とも一致しています。
df -h
コマンドで確認しました。
アラームの設定
CloudWatch アラームを作りましょう。
xfs ファイルシステム の /
を監視するようにします。
80 % 以上になったらアラーム状態になります。
この後、通知も設定しました。
通知の確認
5 GB のファイルを /
に作成すると通知できそうなので、やってみます。
sudo dd if=/dev/zero of=/largefile bs=1M count=5120
80 どころか 90 % を超えました。
CloudWatch アラームがアラーム状態になりました。
通知が来ました。
まとめ・感想
Amazon Linux 2023 のストレージ空き容量を CloudWatch Agent で監視する方法を紹介させていただきました。
GUI でできることが増えて便利だなと思いました。
余談
12月になり、山中湖にも雪が降った結果、多数の鹿が人里に降りてきて、鹿のお祭りみたいになっていました。