はじめに
CloudWatch Agentを使用してログを収集し、エラーが発生した場合には通知を行いたいというユースケースが以前にもあって、やり方を忘れかけていたので備忘録として記事に残そうと思います。(最近AWSに触れていなかったせいもあり。。)
この記事では、EC2上のサンプルログをCloudWatch Logsに収集し、SNSを使用してエラーが発生した場合にメールを送信する方法を記載します。
手順
画像挿入
主に以下のような手順で実施していきます。
- EC2インスタンスにCloudWatch Agentをインストールし、設定ファイルを作成。
- CloudWatch Logsにロググループを作成し、設定ファイルで指定したログストリームにログを送信するように設定。
- SNSトピックを作成し、通知先のメールアドレスを設定。
- CloudWatch Alarmを設定し、SNSトピックを通知先に設定。
EC2インスタンスの設定
IAM Roleの作成
まずはじめにEC2インスタンスからCloudWatchにログを収集するためのRoleを作成する必要があります。「CloudWatchAgentServerPolicy」をアタッチしたRoleを作成します。IAMコンソール上から作成可能なので細かい手順は飛ばします。
以下のようなRoleができればOKです。
CloudWatch Agentのインストールと設定ファイルの作成
今回はamazon linuxのインスタンスを利用しますので手順は別OSを利用する場合はインストール方などは異なりますが、ドキュメントに記載してあるのでそれ通り行えば問題ないです。
CloudWatch Agentのインストール
以下のコマンドでインストールを行います。
$ sudo yum install amazon-cloudwatch-agent -y
設定ファイルの作成
今回はsample.log、sample_2.log(自分で作成した)の2つを同じSampleグループになるように設定しました。シスログを送ろうとしたのですが、amazon linux2023ではsystemd-journaldで管理しているぽいので/var/log/messages
などがなかったです。。今回の目的とはずれてしまうので適当なlogを指定して試すことにしました。
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/home/ec2-user/sample.log",
"log_group_name": "Sample",
"log_stream_name": "sample.log",
"timezone": "UTC"
},
{
"file_path": "/home/ec2-user/sample_2.log",
"log_group_name": "Sample",
"log_stream_name": "sample_2.log",
"timezone": "UTC"
}
]
}
},
"log_stream_name": "sample"
}
}
起動
上記で作成したjsonファイルを指定してCloudWatch Agentを起動します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:configuration-file-path
$ sudo sysytemctl status amazon-cloudwatch-agent
CloudWatch上にロググループが作成されているかの確認
CloudWatchコンソール上でロググループが作成されログが収集できたかの確認を行います。
どうやら無事にログを収集できたようです。
SNSの設定
トピックの作成
下記画像のようにトピックを作成します。(動作確認したいだけなのでオプションは基本的にデフォルトにしました。)
サブスクリプションの作成
今回のケースはEmailで通知を行いたいのでプロトコルはEメールを選択します。エンドポイントに送信あてのメールアドレスを記載し、作成します。
※サブスクリプション作成後にメールが届くのでメール内の「Confirm subscription」リンクを押すことで正式に登録されます。
CloudWatch Alarmの設定
メトリクスフィルターの作成
今回はsample.logにERROR文字列が書き込まれた際に通知が来る設定にします。
アラームの作成
最後にアラームの作成を行います。ERROR文字列が1つでもあればアラームが発生するように設定します。通知先は先程作成したSNSトピックを設定し、完了です。
メールの確認
今回はsample.logという自身で作成したlogファイルを元に行っているので、こちらのファイルに適当にERRORと記載して実際にアラーム状態となり、SNSからメールが届くかの確認を行います。
無事にメールが届きました。
まとめ
メールに細かいエラーの内容を表示させたいとかそういう要件がある場合はlambdaを使ったりしないとだめですが、エラーを通知するだけなら簡単にできそうです。