目次
はじめに
こんにちは、クラウド事業部の菅です。
今回は、カスタムメトリクスを使用してプロセス監視を実装してみたいと思います。
構成
以下の構成を作成します。

2つのEC2インスタンス (EC2-A、EC2-B) で稼働しているhttpdサービスを監視します。
実行中のプロセス数を監視対象とし、プロセス数をカスタムメトリクスとして収集します。
サービスの停止は、CloudWatchアラームで監視します。
1つ以上のEC2インスタンスのhttpdサービスが停止した場合、CloudWatchアラームがアラートとなるように設定します。
※VPCやEC2インスタンスの作成は省略します。
また、CloudWatchアラームがアラートとなった後の処理は本記事の対象外とします。
実装
EC2の確認
プロセス監視構築前に、EC2の状態を記載します。
導入は省略しますが、各EC2インスタンスにはCloudWatchエージェントとhttpdをインストール済みです。
※CloudWatchエージェントはインストールのみで、設定はまだ行っていません。
sh-5.2$ hostname
ec2-a
sh-5.2$ systemctl status httpd amazon-cloudwatch-agent
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Active: active (running) since Fri 2025-05-16 01:10:28 UTC; 2min 33s ago
Docs: man:httpd.service(8)
Main PID: 3394 (httpd)
Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec: 0 B/sec"
Tasks: 177 (limit: 1057)
Memory: 17.5M
CPU: 230ms
CGroup: /system.slice/httpd.service
├─3394 /usr/sbin/httpd -DFOREGROUND
├─3729 /usr/sbin/httpd -DFOREGROUND
├─3733 /usr/sbin/httpd -DFOREGROUND
├─3734 /usr/sbin/httpd -DFOREGROUND
└─3735 /usr/sbin/httpd -DFOREGROUND
○ amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; preset: disabled)
Active: inactive (dead) since Fri 2025-05-16 01:10:28 UTC; 2min 33s ago
Duration: 82ms
Process: 3443 ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent (code=exited, status=0/SUCCESS)
Main PID: 3443 (code=exited, status=0/SUCCESS)
CPU: 74ms
sh-5.2$ curl http://localhost/
<html><body><h1>It works!</h1></body></html>
sh-5.2$ tail -n 1 /var/log/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.log
2025/05/16 01:10:28 I! No json config files found, please provide config, exit now
sh-5.2$
※同様の状態のため、EC2-Bは省略します。
カスタムメトリクスの収集設定
各EC2インスタンスに、カスタムメトリクスの収集設定を行います。
CloudWatchエージェントの収集設定作成
カスタムメトリクスの収集設定をパラメータストアに定義します。
以下のCloudFormationテンプレートを使用してパラメータストアを作成します。
AWSTemplateFormatVersion: 2010-09-09
Resources:
ParameterCloudWatchConfig:
Type: AWS::SSM::Parameter
Properties:
Name: apc-kan-parameter-config-cloudwatchagent
Description: Config CloudWatchAgent
Type: String
Value: |
{
"metrics": {
"metrics_collected": {
"procstat": [
{
"exe": "httpd",
"measurement": [
"pid_count"
],
"metrics_collection_interval": 60
}
]
},
"aggregation_dimensions": [
[
"exe",
"pid_finder"
]
]
}
}
収集設定として、2つの設定を行っています。
metrics_collected
収集するメトリクスの情報を定義します。
今回は、procstatプラグインを使用してプロセスメトリクスを収集するため、"procstat"セクションを定義しています。
exe
収集対象となるプロセス名を設定します。
今回はhttpdサービスのプロセスなので、"httpd"を設定しています。
measurment
収集するメトリクス名を設定します。
今回はプロセス数を収集するので、"pid_count"を設定しています。
metrics_collection_interval
値の収集間隔を設定します。
metrics_collection_intervalでは、以下の秒数が設定可能です。
- 1
- 5
- 10
- 30
- 60の倍数
今回は、デフォルト値の60を設定しています。
aggregation_dimensions
収集されたメトリクスを集約するディメンションを定義します。
デフォルトでは、pid_countメトリクスは以下の3つのディメンションで収集されます。
- exe
- host
- pid_finder
このままではCloudWatchアラームを作成する際に不便ですので、hostを除いた2つのディメンションに集約されるよう設定しています。
docs.aws.amazon.com余談ですが、CloudFormationでパラメータストアを作成する際、"|"を使用することで整形した状態でJSONを定義できます。
ただし、パラメータストアの値の上限は4096文字であり、インデントの空白も文字数とカウントされてしまうため、整形した状態で長い設定を定義することはできません。

収集設定の適用
作成したパラメータを使用して、各EC2インスタンスにCloudWatchエージェントの設定を行います。
設定の適用には、AWS SystemsManagerのRunCommandを使用します。

RunComandは以下の設定で実行します。
コマンドドキュメント
AWSのドキュメントである "AmazonCloudWatch-ManageAgent" を指定します。
コマンドのパラメータ
Action
CloudWatchエージェントに対するアクションを指定します。
今回は新規に設定を行うため、"configure"を指定します。
Mode
適用対象を指定します。
今回はEC2インスタンスに対して適用するため、"ec2"を指定します。
Optional Configuration Source
Actionで"configure"に関連する設定を選択した場合の追加設定です。
CloudWatchエージェントの設定はSSMパラメータストアの値から設定するため、"ssm"を指定します。
- "ssm":SSMパラメータストアの値から設定する場合に選択します。
- "default":デフォルトの設定を適用する場合に選択します。
- "all":"configure (remove)”選択時のみ、すべての設定を消去する場合に選択します。
今回はSSMパラメータストアから設定するため、"ssm"を指定します。
Optional Configuration Location
Optional Configuration Sourceで"ssm"を選択時のみ、使用するSSMパラメータストアを指定します。
今回は、カスタムメトリクスの収集設定で作成したパラメータストア"apc-kan-parameter-config-cloudwatchagent"を指定します。
Optional Restart
Actionで"configure"に関連する設定を選択した場合の追加設定です。
設定適用後のCloudWatchエージェントの再起動の実施有無を指定します。
適用した設定を反映させるためには再起動が必要なので、今回は"yes"を指定します。
RumCommand実行後、CloudWatchのページから設定したカスタムメトリクスが収集されていることを確認します。


各EC2インスタンスのプロセス数が収集されていることを確認できました。
また、EC2インスタンス個別のメトリクスとは別に、exeとpid_finderの2つのディメンションで集約されています。
CloudWatchアラームの設定
実行中のhttpdプロセス数を監視するCloudWatchアラームを作成します。
以下のCloudFormationテンプレートを使用して作成します。
AWSTemplateFormatVersion: 2010-09-09
Resources:
AlarmHttpd:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: apc-kan-alarm-httpd
AlarmDescription: Monitoring httpd process count.
Namespace: CWAgent
MetricName: procstat_lookup_pid_count
Dimensions:
- Name: exe
Value: httpd
- Name: pid_finder
Value: native
Period: 60
Statistic: Minimum
ComparisonOperator: LessThanThreshold
Threshold: 5
EvaluationPeriods: 3
TreatMissingData: breaching

CloudWatchアラームでは、集約したカスタムメトリクスを参照するように設定しています。
カスタムメトリクスの値の収集間隔は60秒のため、CloudWatchアラームでの値の評価も60秒ごととしています。
カスタムメトリクスの収集設定の作業で、各EC2インスタンスでは通常5つのプロセスが動作していることが確認できました。
今回は、メトリクスの収集遅延などは考慮せず、単純に収集した各メトリクスデータの最小値が5未満となった場合に異常値と判定するようにしています。
動作確認
動作確認のため、EC2-Aのサービスを停止してみます。
sh-5.2$ hostname
ec2-a
sh-5.2$ date
Fri May 16 03:41:24 UTC 2025
sh-5.2$ ps aux |grep httpd
root 32397 0.0 1.1 18536 11068 ? Ss 03:17 0:00 /usr/sbin/httpd -DFOREGROUND
apache 32398 0.0 0.4 18192 4604 ? S 03:17 0:00 /usr/sbin/httpd -DFOREGROUND
apache 32399 0.0 0.8 1708816 7592 ? Sl 03:17 0:00 /usr/sbin/httpd -DFOREGROUND
apache 32449 0.0 0.8 1544912 7588 ? Sl 03:17 0:00 /usr/sbin/httpd -DFOREGROUND
apache 32460 0.0 0.8 1544912 7588 ? Sl 03:17 0:00 /usr/sbin/httpd -DFOREGROUND
ssm-user 33843 0.0 0.2 222316 2196 pts/0 S+ 03:41 0:00 grep httpd
sh-5.2$ sudo systemctl stop httpd
sh-5.2$ date
Fri May 16 03:41:43 UTC 2025
sh-5.2$ ps aux |grep httpd
ssm-user 33863 0.0 0.2 222316 2176 pts/0 S+ 03:41 0:00 grep httpd
sh-5.2$

CloudWatchアラームがアラートとなることが確認できました!
まとめ
今回は、カスタムメトリクスを使用してプロセス監視を実装してみました。
今回は1回でも異常値と判定されたらアラートとなるよう設定しましたが、メトリクスデータの収集遅延やCloudWatchエージェントの停止など様々な要因で収集に失敗する可能性があり、実際に使用する際は慎重に考慮する必要があります。
また、今回は使用していませんが、メトリクスデータのプッシュはAWS CLIを使用して行うこともできます。
CloudWatchエージェントでは収集できないような状態を監視したい場合はバッチ処理等で実装することもできそうです。
この記事が誰かのお役に立てば幸いです。
お知らせ
APCはAWS Advanced Tier Services (アドバンストティアサービスパートナー) 認定を受けております。
その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。