CloudWatchでApache httpdサービスを監視し、停止時にメール通知アラートを発生させる方法

## はじめに
本記事では、CloudWatchエージェントを使用してApache WebサーバーのHTTPSサービスを監視し、停止した際にアラートを発生させる方法について解説します。

CloudWatchエージェントは、Apacheのログやシステムメトリクスを収集し、監視やアラートに活用できる有効なツールです。

実務では、Datadogというクラウドに最適化した監視製品を使用していますが、この機会にCloudWatchについても備忘録として整理していきます。

## 知識整理
### EC2
Amazon EC2はAWSが提供するスケーラブルな仮想サーバーです。ここでは、EC2上に構築されたApache Webサーバーの状態をCloudWatchエージェントで監視します。

https://aws.amazon.com/jp/ec2/

### Apache
ApacheはHTTP/HTTPS通信を提供するWebサーバーで、今回の対象となるサービスです。特に、HTTPポート（通常80）での監視を行います。

https://hnavi.co.jp/knowledge/blog/apache/

### CloudWatchエージェント
CloudWatchエージェントは、サーバーのメトリクスやログを収集してCloudWatchに送信し、可視化やアラートのトリガーに使うことができます。Apacheのログやサーバーのメトリクスを監視し、サービスの異常を検知します。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

## 構築/検証手順

今回は、以下の参考画像を用いて、Amazon EC2インスタンスにCloudWatchエージェントを導入し、httpdのサービスを監視する仕組みを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/69dbc6e9-83a2-8238-6b8b-550863a0f7f0.png)
引用画像：https://www.fujitsu.com/jp/products/software/resources/feature-stories/cloud-operation/aws-monitoring/

さらに、CloudWatchからのアラートが発生した際に、SNSサービスと連携して個人のGmailアドレスに通知を送信するところまでを検証のゴールとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/92cf8e31-e350-4a5c-4557-1b36e592da79.png)
引用画像：https://itsakura.com/aws-cloudwatch-sns

## 1. Apacheのインストールと設定（省略）
ここでは、Apache Webサーバーのインストール手順やHTTPSの設定は省略します。HTTPSを提供する状態のApacheがEC2上で動作している前提で進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9f02ef11-10aa-dfaf-7e24-8628174bbacf.png)

過去の記事で、EC2インスタンスに対するApacheのインストールと設定について説明していますので、参考にしてください。

https://qiita.com/free-honda/items/1ebd3d9341299713357e

ここでは、Apacheのデフォルトのテストページが表示されていることを確認済みとし、後続の検証に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b23be7fd-2ff7-9439-ec61-829d622d3a32.png)

### EC2インスタンスに必要なロールの追加

CloudWatchエージェントを正しく機能させるためには、EC2インスタンスに以下のIAMロールを追加する必要があります。このロールは、CloudWatchへのメトリクスデータの送信や取得を許可します。

**以下は、必要なIAMロールのポリシーの例です。**

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}
```

このポリシーを持つIAMロールを作成し、対象のEC2インスタンスにアタッチしてください。

:::note warn
これにより、CloudWatchエージェントが必要なメトリクスデータを収集し、アラームを正常に設定できるようになります。
:::


## 2. CloudWatchエージェントのインストール

EC2インスタンスにSSHでログインし、CloudWatchエージェントをインストールします。

**Amazon Linux 2の場合:**
```bash
sudo yum install amazon-cloudwatch-agent
```

**Ubuntuの場合:**

```bash
sudo apt-get update
sudo apt-get install amazon-cloudwatch-agent
```

次に、CloudWatchエージェントを起動します。

```bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a start
```

psコマンドを使用して、CloudWatchに関連するいくつかのプロセスが正常に起動していることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c06f5635-00fb-b27b-0fa2-ba0246b2b305.png)


## 3. CloudWatchエージェントの設定ファイルを作成

次に、CloudWatchエージェントの設定ファイルを作成します。

:::note warn
ここでは、ApacheのHTTPのプロセスを監視対象とします。
:::


対象サーバーにログインし、設定ファイルを手動で作成します。

```bash
cd /opt/aws/amazon-cloudwatch-agent/etc/
vi amazon-cloudwatch-agent.json
```

/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.jsonに設定ファイルを新規作成します。

```amazon-cloudwatch-agent.json
{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "httpd",
                    "measurement": [
                        "pid_count"
                    ],
                    "metrics_collection_interval": 60
                }
            ]
        }
    }
}
```

この設定では、Apache（httpd）のプロセスが正しく動作しているかを確認し、TCP 80ポート（HTTP）がリッスンしているかを監視します。

cwagentについては、これを機に少し学習を深めたので、以下のサイトを参考にしてみてください。

https://dev.classmethod.jp/articles/cloudwatch-agent-cwagent-user/

https://blog.future.ad.jp/cloudwatch-agent%E3%81%AB%E3%81%A6httpd%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B

設定ファイルを変更したら、CloudWatchエージェントを再起動して新しい設定を反映させます。

```bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a stop
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a start
sudo systemctl restart amazon-cloudwatch-agent
```

また、上記で作成した設定ファイルを読み込ませます。これで完了です。

```bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s
```

## 4. ApacheのHTTPポート監視

CloudWatchエージェントでApacheのプロセスやポート監視を設定したので、次に、HTTPサービスが応答しない場合にアラートを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/91202754-7769-df7a-8ee0-c93c27b929b7.png)

CloudWatchダッシュボードに移動し、メトリクスから「CWAgent」を選択し、適切なインスタンスIDを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/791bc5b4-99f2-b774-eb47-b892deaa0ead.png)

「netstat」メトリクスの中から、tcp_listenを選択し、80番ポートがリッスンしているかを確認します。メトリクスに基づき、以下の条件でアラームを作成します。

## 5. CloudWatchアラームの作成
CloudWatchエージェントによって収集されたメトリクスを使用して、アラームを作成します。

具体的には、Apacheのプロセスが停止した場合やHTTPSポートが応答しない場合にアラートを発生させるための設定を行います。

AWS Management Consoleにログインし、CloudWatchサービスに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/92448e4d-8454-cdc0-a3c9-face4581878a.png)

「CWAgent」メトリクスを選択し、「procstat」セクションから「httpd」プロセスのメトリクス（例：pid_count）を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/553e2fce-f838-7a30-ce4a-500074371e09.png)

アラームの条件を設定します。たとえば、pid_countが0のときにアラートを発生させるように、「静的な値」を選択し、0以下に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7fd3ea8c-6fd4-0e73-9535-25cc818e3691.png)

アラームが発生した際に通知を受け取るためのSNSトピックを選択します。SNSトピックが未作成の場合は、新しく作成します。

ここでは、私のGmailのアドレスに通知を送るように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/15620be9-a16d-d32e-9b18-78bd0d6e4356.png)

アラームの名前や説明を設定します。例：「Apache HTTPS Service Down Alert」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1e8b575e-9bbe-1daa-c903-53048fd6b364.png)

設定を確認し、「アラームの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5e87df36-cf46-f13a-4680-a2228194e97d.png)

これで、ApacheのHTTPSサービスが停止した際にアラートが発生する設定が完了しました。

:::note warn
アラート通知先に登録したメールアドレス宛に以下のようなメールが届くと思いますので、「Confirm subscription」を押下してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/058f5d3a-47de-8015-ffc0-b23dde2a6f1d.png)
:::

SNSのサービス画面にて、以下のように「確認済み」となっていることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a08452a6-5c16-3669-9197-f3470215c83f.png)



## 検証確認

ここまでの設定が完了したので、以下のコマンドで実際に「httpd」のサービスを停止します。

```bash
[ec2-user@ip-10-0-14-203 ~]$ sudo systemctl stop httpd
[ec2-user@ip-10-0-14-203 ~]$ ps -ef | grep httpd
ec2-user  4804  4766  0 00:49 pts/0    00:00:00 grep --color=auto httpd
```

CloudWatchのサービス画面からも実際にアラーム状態になっていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/94d6fee1-ea25-23f7-3012-94be70294a42.png)

CloudWatchエージェントを使用して、ApacheのHTTPサービス監視を設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/03dbbfed-1f17-593c-2976-eec20fe9612a.png)

実際にサービスがダウンした際にアラートが発生し、メール通知が届くことを確認できましたので、今回の検証も大成功ですね！

## まとめ
本記事では、CloudWatchエージェントを使用してApacheのHTTPサービスを監視し、停止時にアラートを発生させる手順を紹介しました。

CloudWatchエージェントを使うことで、プロセスやポートの状態を監視し、異常を検知した際に即座に通知を受け取ることができます。

この設定により、サービスダウン時の迅速な対応が可能になり、システムの可用性を高めることができます。

## 参考文献

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

https://www.stylez.co.jp/aws_columns/monitoring_and_maintenance_in_aws/basics_of_aws_monitoring/

https://blog.future.ad.jp/cloudwatch-agent%E3%81%AB%E3%81%A6httpd%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B