Amazon Linux 2023 のストレージ空き容量を CloudWatch Agent で監視する。

記事タイトルとURLをコピーする

こんにちは。
カスタマーサクセス部の山本です。😺

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 、メモリー、ディスク、ネットワーク、プロセスの情報が取れそうです。
インフラの監視としては十分です。

  1. cpu_time_active
  2. cpu_time_guest
  3. cpu_time_guest_nice
  4. cpu_time_idle
  5. cpu_time_iowait
  6. cpu_time_irq
  7. cpu_time_nice
  8. cpu_time_softirq
  9. cpu_time_steal
  10. cpu_time_system
  11. cpu_time_user
  12. cpu_usage_active
  13. cpu_usage_guest
  14. cpu_usage_guest_nice
  15. cpu_usage_idle
  16. cpu_usage_iowait
  17. cpu_usage_irq
  18. cpu_usage_nice
  19. cpu_usage_softirq
  20. cpu_usage_steal
  21. cpu_usage_system
  22. cpu_usage_user
  23. disk_free
  24. disk_inodes_free
  25. disk_inodes_total
  26. disk_inodes_used
  27. disk_total
  28. disk_used
  29. disk_used_percent
  30. diskio_io_time
  31. diskio_iops_in_progress
  32. diskio_read_bytes
  33. diskio_read_time
  34. diskio_reads
  35. diskio_write_bytes
  36. diskio_write_time
  37. diskio_writes
  38. ethtool_bw_in_allowance_exceeded
  39. ethtool_bw_out_allowance_exceeded
  40. ethtool_conntrack_allowance_exceeded
  41. ethtool_linklocal_allowance_exceeded
  42. ethtool_pps_allowance_exceeded
  43. mem_active
  44. mem_available
  45. mem_available_percent
  46. mem_buffered
  47. mem_cached
  48. mem_free
  49. mem_inactive
  50. mem_total
  51. mem_used
  52. mem_used_percent
  53. net_bytes_recv
  54. net_bytes_sent
  55. net_drop_in
  56. net_drop_out
  57. net_err_in
  58. net_err_out
  59. net_packets_recv
  60. net_packets_sent
  61. netstat_tcp_close
  62. netstat_tcp_close_wait
  63. netstat_tcp_closing
  64. netstat_tcp_established
  65. netstat_tcp_fin_wait1
  66. netstat_tcp_fin_wait2
  67. netstat_tcp_last_ack
  68. netstat_tcp_listen
  69. netstat_tcp_none
  70. netstat_tcp_syn_recv
  71. netstat_tcp_syn_sent
  72. netstat_tcp_time_wait
  73. netstat_udp_socket
  74. processes_blocked
  75. processes_dead
  76. processes_idle
  77. processes_paging
  78. processes_running
  79. processes_sleeping
  80. processes_stopped
  81. processes_total
  82. processes_total_threads
  83. processes_wait
  84. processes_zombies
  85. swap_free
  86. swap_used
  87. 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
  • Systems Manager の Session Manager を使用して、導入作業を実施する
  • インスタンスタイプ
    • t2.micro
      • CloudWatch Agent を導入するために必要な CPU 数やメモリ量に関しては、ドキュメントがないため最小構成
      • 本当は t3 系が新しくておすすめです

いざ、導入

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月になり、山中湖にも雪が降った結果、多数の鹿が人里に降りてきて、鹿のお祭りみたいになっていました。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。