はじめに
AWSでサービス監視を実装して、サービスの正常性を監視してみました。
前提条件
- EC2インスタンスが構築されていること(今回はAmazon Linux2を使用します)
- パブリックサブネットへ接続するインターネットゲートウェイはアタッチ済みであること
- サービスの正常性を確認する対象はApache(httpd)とします
- CloudWatchエージェントが導入済みであること。
(入れていない場合は、導入方法も別で記載していますのでご確認ください)
【導入手順】 AWSでCloudWatchエージェントを入れてみた
構成図
今回は「httpdを監視して、プロセス数が0になったらEC2インスタンスを再起動する」という実装にします。
大まかな流れとしては
- サービス監視用のCloudWatch Agentの設定ファイルを作成する
- 設定ファイルをSSMで反映する
- CloudWatch上でhttpdのプロセスが取れているか確認する
- httpdプロセス用のCloudWatchアラームを作成する
- Apache停止を行ってアラームが発砲されているか確認する
- EC2インスタンスが再起動していることを確認する
実際にやってみた
サービス監視用のCloudWatchエージェントの設定ファイルを作成
特定のプロセスを監視するための設定ファイルを作成します。設定ファイルはSSMのパラメータストアに格納します。
SSMからパラメータストアへ移動しパラメータの作成をクリックします。
パラメータの詳細は以下の通りで記述していきます。
名前:後で使用するので判別しやすい名前にしておくと良いです
説明:説明文を入力する
利用枠:標準
タイプ:文字列
データ型:text
値:{
"metrics": {
"metrics_collected": {
"procstat": [
{
"exe": "httpd",
"measurement": [
"pid_count"
],
"metrics_collection_interval": 60
}
]
}
}
}
値について簡単に説明します。
・exe :プロセス名を記述します。今回はhttpdを監視するので"httpd"を記述する
Linuxサーバで設定する"exe"セクションでは、指定した文字列に対して全て正規表現で読み取りますので、ワイルドカードを使用して複数のプロセスを指定することも可能です。
・pid_count :プロセスが起動している数。今回はhttpdのプロセス数を読み取ります。
・metrics_collection_interval :対象のメトリクスを収集する間隔を指定します。httpdプロセスを収集する間隔はデフォルトの"60秒"としておきます。(ちなみにこのセクションは省略可能です)
※exeの設定の仕方について、公式ドキュメントに記載されています。
exe以外の方法もありますので、要求内容に合わせて設定ください。
procstat プラグインでプロセスメトリクスを収集する
設定ファイルを反映する
設定したファイルをCloudWatchエージェントに反映していきます。
SSMから"Run Command"を選択してコマンドパラメータは以下の通り入力します。
・Action:Configure(Append) 既に反映されているパラメータが存在するのでそれに追記します
・Mode:ec3
・Optional Configuration Source:ssm
・Optional Configuration Location:httpd-proc-collector 先ほど作成した設定ファイル名を入力
・Optional Open Telemetry Collector Configuration Source:ssm
・Optional Open Telemetry Collector Configuration Location:未記入
・Optional Restart:yes
ターゲットと出力のインスタンスIDをクリックして中身を確認しましょう。
「Output」と「Error]でログを確認します。
「Output」
****** processing amazon-cloudwatch-agent ******
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source ssm:httpd-proc-collector --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config append
Region: ap-northeast-1
credsConfig: map[]
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_httpd-proc-collector.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config append
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.
Valid Json input schema.
I! Detecting run_as_user...
No csm configuration found.
No log configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
「Error」
2021/07/24 14:52:44 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json ...
2021/07/24 14:52:44 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_AmazonCloudWatch-linux ...
2021/07/24 14:52:44 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_httpd-proc-collector.tmp ...
Redirecting to /bin/systemctl stop amazon-cloudwatch-agent.service
Redirecting to /bin/systemctl restart amazon-cloudwatch-agent.service
サービスを再起動したログみたいなのでエラー出力ではありませんね。
設定ファイルの読み込みも成功しているのでこのまま先へ進めます。
CloudWatchのメトリクスを確認
CloudWatch画面に移動して「メトリクス」をみてみましょう。
「CWAgent」から「ImageId,InstanceId,InstanceType,exe,pid_finder」というディメンションがありその中に対象のメトリクスが存在しています。
対象のメトリクスが取れていますね。
プロセスが7つあるみたいです。念のためサーバへログインして確認してみましょう。
[ec2-user@ip-10-0-1-10 ~]$ ps -ef | grep httpd
root 2798 1 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2829 2798 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2830 2798 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2831 2798 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2832 2798 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2833 2798 0 00:30 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3184 2798 0 00:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
ec2-user 3368 3343 0 00:43 pts/1 00:00:00 grep --color=auto httpd
[ec2-user@ip-10-0-1-10 ~]$
最下行の"ec2-user"が起動しているもの以外がhttpdプロセスで合計7つで合っていますね。
アラームを発泡させてみる
まずアラームを作成する
CloudWatchの「アラーム」へ移動し、「メトリクスの選択」をクリックしましょう。
そして、先ほど確認したメトリクスにチェックを入れて「メトリクスの選択」をクリック。
「メトリクスと条件の指定」では以下の条件で入力します。
期間のデフォルトは"5分"なので、今回は検証するためで短い間隔で実施します。
「条件」
・しきい値の種類:静的
・アラーム条件:より低い
・しきい値:1
・アラームを実行するデータポイント:1/1
・欠落データの処理:欠落データを不正(しきい値を超えている)として処理
「通知」
・アラーム状態のトリガー:アラーム状態
・SNSトピックの選択:お使いのアカウントに合わせて設定ください
(今回は既存のSNSトピックを使っています。エンドポイントは自分のメールアドレスです。)
「EC2アクション」
・アラーム状態トリガー:アラーム状態
・アクション:このインスタンスの再起動
今回の要件はプロセスが停止した時にアラームが発生してEC2が再起動するかを確認することでしたので
上記のようにします。
最終確認画面が出るので、問題がなければアラームを作成しましょう。
アラームが作成されて正常値確認ができていますね。
プロセスを停止してみる
まずはサーバへログインし、httpdを停止しましょう。
[root@ip-10-0-1-10 ~]# systemctl stop httpd.service
[root@ip-10-0-1-10 ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sun 2021-07-25 01:20:42 UTC; 5s ago
Docs: man:httpd.service(8)
Process: 2798 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 2798 (code=exited, status=0/SUCCESS)
Status: "Total requests: 1; Idle/Busy workers 100/0;Requests/sec: 0.000335; Bytes served/sec: 1 B/sec"
Jul 25 00:30:49 ip-10-0-1-10.ap-northeast-1.compute.internal systemd[1]: Star...
Jul 25 00:30:49 ip-10-0-1-10.ap-northeast-1.compute.internal systemd[1]: Star...
Jul 25 01:20:41 ip-10-0-1-10.ap-northeast-1.compute.internal systemd[1]: Stop...
Jul 25 01:20:42 ip-10-0-1-10.ap-northeast-1.compute.internal systemd[1]: Stop...
Hint: Some lines were ellipsized, use -l to show in full.
[root@ip-10-0-1-10 ~]#
[root@ip-10-0-1-10 ~]# ps -ef | grep httpd
root 3970 3923 0 01:21 pts/2 00:00:00 grep --color=auto httpd
[root@ip-10-0-1-10 ~]#
アラームを確認する
アラーム発生直後は、インスタンスへのSSH接続が切れていますので、再起動が成功していますね。
[root@ip-10-0-1-10 ~]# date
Sun Jul 25 01:22:21 UTC 2021
[root@ip-10-0-1-10 ~]# Connection to 54.95.39.151 closed by remote host.
Connection to 54.95.39.151 closed.