APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AWS】【初心者向け】カスタムメトリクスを使用してプロセス監視を実装する

目次

はじめに

こんにちは、クラウド事業部の菅です。

今回は、カスタムメトリクスを使用してプロセス監視を実装してみたいと思います。

構成

以下の構成を作成します。

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を設定しています。

docs.aws.amazon.com docs.aws.amazon.com

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のご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp