おはようございます!インフラエンジニアの木村(@K2020_js)です!今回はEC2でAutoScalingのメモリ/ディスクの監視について、少し工夫が必要だったので、その手順を紹介しようと思います。
今回やろうとしたこと
上記図のように、AutoScalingにぶら下がるEC2にCloudWatch Agentをインストールし、そのAutoScaling単位のメモリ、ディスクの値をCloudWatch Alarmで確認し、閾値を超えたら、SNS経由でUserに通知を行おうと考えていました。
ただし、こちらがうまくいかず、デフォルトのCloudWatch Agentの設定ではAutoScaling単位でのメモリ、ディスクの値は取得できず、どうしても、そのAutoScalingにぶら下がるEC2単位でしかメモリ、ディスクの値の取得ができませんでした。
これの何が問題かというと、CloudWatch Alarmの設定をするときに、監視する対象にEC2の個別のIDを指定して設定を行わないといけないため、もしそのIDのEC2がAutoScalingのスケールインで削除された際、EC2とCloudWatchAlarmとの紐づきは消え、何も紐づかないCloudWatch Alarmが残ってしまいます。
また、この後再度EC2のスケールアウトが起こった際、起動したEC2にCloudWatch Alarmの設定はされていないので、何も監視されていないEC2が存在してしまうのです。(スケールイン/アウトが発生するたびに手動で紐付け直すのも現実的でない…)
今回このような問題が起こらないように、AutoScaling単位でメモリ、ディスクの監視を行える設定方法をご紹介させていただきます。
環境
OS:Amazon Linux 2023
手順
※今回AutoScalingのメモリ/ディスクを取得するための、CloudWatchの設定以外は他の記事の参照先を記載させていただきます。ご了承ください。
1. CloudWatch Agentの設定を行う
1-1. EC2にSSHする
1 |
$ ssh -i <SSH KEY> <user名>@<EC2のパブリックIP> |
セッションマネージャーをご利用する場合は以下の記事がわかりやすかったので、ご参照ください
-
セッションマネージャーを使って鍵ストレスの無いEC2アクセス!
1-2. CloudWatch Agentをインストールする
1 |
$ sudo dnf -y install amazon-cloudwatch-agent |
1-3. ウィザードでCloudWatch Agentの設定をする
1 |
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard |
ちなみに、設定内容については私は下記の通りにしています。(CloudWatch logsやX-Rayの設定は省いていますので、設定したい場合は選択肢でyesを選んでください)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
================================================================ = Welcome to the Amazon CloudWatch Agent Configuration Manager = = = = CloudWatch Agent allows you to collect metrics and logs from = = your host and send them to CloudWatch. Additional CloudWatch = = charges may apply. = ================================================================ On which OS are you planning to use the agent? 1. linux 2. windows 3. darwin default choice: [1]: Trying to fetch the default region based on ec2 metadata... I! imds retry client will retry 1 timesAre 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. cwagent 2. root 3. others default choice: [1]: 2 Do you want to turn on StatsD daemon? 1. yes 2. no default choice: [1]: 2 Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start 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]: Do you want to monitor cpu metrics per core? 1. yes 2. no default choice: [1]: 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]: Do you want to aggregate ec2 dimensions (InstanceId)? 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: [1]: Current config as follows: { "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "aggregation_dimensions": [ [ "InstanceId" ] ], "append_dimensions": { "AutoScalingGroupName": "${aws:AutoScalingGroupName}", "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}" }, "metrics_collected": { "disk": { "measurement": [ "used_percent" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } } } 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]: 2 Do you want to monitor any log files? 1. yes 2. no default choice: [1]: 2 Do you want the CloudWatch agent to also retrieve X-ray traces? 1. yes 2. no default choice: [1]: 2 Existing config JSON identified and copied to: /opt/aws/amazon-cloudwatch-agent/etc/backup-configs Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully. Current config as follows: { "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "aggregation_dimensions": [ [ "InstanceId" ] ], "append_dimensions": { "AutoScalingGroupName": "${aws:AutoScalingGroupName}", "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}" }, "metrics_collected": { "disk": { "measurement": [ "used_percent" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } } } 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. |
1-4. 下記コマンドを実行し、config.jsonあることを確認する
1 |
$ ls /opt/aws/amazon-cloudwatch-agent/bin |
1-5. CloudWatch Agentを起動設定を行う
1 |
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json |
1-6. CloudWatch Agentを起動し、ステータスを確認する
1 2 |
$ sudo systemctl start amazon-cloudwatch-agent.service $ sudo systemctl status amazon-cloudwatch-agent |
下記のようにActive: active(running)になっていれば、OK
1 2 3 4 5 6 7 8 9 |
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; preset: disabled) Active: active (running) since Mon 2025-03-03 10:30:54 UTC; 15s ago Main PID: 10370 (amazon-cloudwat) Tasks: 6 (limit: 1111) Memory: 35.5M CPU: 210ms CGroup: /system.slice/amazon-cloudwatch-agent.service └─10370 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -otelconfig /opt/aws/amazon-cloudwatch-agent/etc/ama> |
1-7. CloudWatch AgentのConfigファイルを編集し、AutoScalingNameで項目でCloudWatch メトリクスを作れるように設定する
※ここがポイント!初期設定ではインスタンスIDでしか取得できないところが、この設定でAutoScalingNameでメトリクスの取得が可能となります!
1 |
$ sudo vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json |
aggregation_dimensionsの項目をInstanceIdから[[“AutoScalingGroupName“]]に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
{ "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "aggregation_dimensions": [ [ [["AutoScalingGroupName"]] ] ], "append_dimensions": { "AutoScalingGroupName": "${aws:AutoScalingGroupName}", "ImageId": "${aws:ImageId}", "InstanceId": "${aws:InstanceId}", "InstanceType": "${aws:InstanceType}" }, "metrics_collected": { "disk": { "measurement": [ "used_percent" ], "metrics_collection_interval": 60, "resources": [ "*" ] }, "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } } } |
2. CloudWatch以外の設定
※前述した通り、CloudWatch以外の設定に関しては以下にて参考記事を記載させていただきます。こちらを元に設定お願いします。
2-1. AMIの取得
項番1でCloudWatch Agentの設定を行ったEC2のAMIを取得してください。
手順については下記記事が大変わかりやすかったので参考にしてください
-
AWS EC2入門:AMIの取得・復元方法と安全な削除手順をわかりやすく解説
2-2. IAMロールの作成/アタッチ
EC2からCloudWatchメトリクスを取得できるポリシー(CloudWatchAgentAdminPolicy、AmazonSSMManagedInstanceCore)の付いたIAMロールを作成し、EC2にアタッチしてください。
手順は下記AWSの公式ページを参考にしてください。
- ロールの作成とポリシーのアタッチ (コンソール)
- インスタンスへの IAM ロールのアタッチ
2-3. AutoScalingの作成
項番2のAMI、項番3で作ったIAMロールを使ってAutoScalingを作成してください。
手順は以下記事が大変わかりやすかったので、参考にしてください。
- [初心者向け]EC2 Auto Scaling グループを作成する
3. CloudWatch Agentからメトリクスデータが送信されているか確認
※CloudWatch Agentを設定してから、データがCloudWatchに送信されるまで5分少々かかりますので、少し待ってからご確認ください。
3-1. AWSアカウントにログインし、下記URLよりCloudWatchのコンソールに移動する
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#home:
3-2. 左ペインから「全てのメトリクス」→「CWAgent」を開く
3-3. AutoScalingGroupNameの項目があれば、OK
4. CloudWatch アラームの設定
項番5で確認したメトリクスを使用してCloudWatchアラームを設定していきます。
今回はディスクの監視設定を行いますが、メモリの設定する場合も同様の手順で設定可能ですので、ご参考にしていただけますと幸いです。
4-1. 左ペインから「すべてのアラーム」→「アラームの作成」をクリックする
4-2. 「メトリクスの選択」をクリックする
4-3. 「CWAgent」をクリックする
4-4. AutoScalingGroupNameをクリックする
4-5. 対象のAutoScaling/メトリクス名(今回はdisk)を選択し、「メトリクスの選択」をクリックする
4-6. 以下値を入力し、「次へ」をクリックする
- 統計:平均値
- 期間:5分
- しきい値の種類:静的
- アラームの条件:より大きい
- …よりも:80
- アラームを実行するデータポイント:1/1
- 欠落データ:欠落データは見つかりませんとして処理
※値は設定したい内容によって変わりますので、あくまで参考値としてください
4-7. 以下の内容でSNSを設定し、「次へ」をクリックする
- トリガー:アラーム状態
- SNS:設定しているSNS
※値は設定したい内容によって変わりますので、あくまで参考値としてください
4-8. 任意のアラーム名を付け、「次へ」のボタンをクリックする
4-9. 設定値に間違いがないか確認し、「アラームの作成」をクリックし完了
まとめ
今回AutoScalingのメモリ、ディスクの監視設定について記載しました。知らないと意外とドツボにハマると思うので、初心者の方はぜひこのブログで回避していただけますと幸いです!

1992年生まれのインフラエンジニア。建築資材の営業マンから、エンジニアへキャリアチェンジし、エンジニア歴としては3年目となる。都内の受託会社にて様々なAWS案件に携わり、3年目にてAWS All Certification EngineersやAWS Top Engineersに選出される。業務領域を超えた幅広い知識を身につけるためTechBullコミュニティへ参画。業界未経験という立場からインフラエンジニアへキャリアアップした経験やクラウド関連の記事を執筆。