#初めに
CloudWatch Logsにて、特定のエラーログを取得したいケースは多いかと思います。
今回はWebサーバにて4xx台のレスポンスが返ってきた際に、CloudWatch Logsで検知してメール送信するための方法を備忘録として纏めていきたいと思います。
#前提
・事前にEC2(Amazon Linux 2)を作成済み
・EC2にnginxをインストール済み
#実装
###①CloudWatch Logsエージェントの設定
EC2にログインし、CloudWatch Logsエージェントをインストールします。
# yum install -y awslogs
次にCloudWatch Logsエージェントが出力する先のリージョンを指定します。
/etc/awslogs/awscli.confに設定されているリージョンを、デフォルトのus-east-1からap-northeast-1に変更します。
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
続いてCloudWatch Logsエージェントの設定ファイルである/etc/awslogs/awslogs.confの設定を行います。
今回はnginxのaccess.logに出力されるログを収集する必要があるので、その設定を行います。
以下設定値を、ファイルの末尾に追記します。
~~~省略~~~
[Nginx_AccessLog]
log_group_name = /var/log/nginx/access.log
log_stream_name = {instance_id}_accesslog
file = /var/log/nginx/access.log
datetime_format = %b %d %H:%M:%S
initial_positon = start_of_file
buffer_duration = 5000
最後にCloudWatch Logsエージェントの起動を行います。
systemctlでstartを行い、status確認でエラー無く起動されていれば、エージェントの設定は完了です。
# systemctl start awslogsd
# systemctl status awslogsd
● awslogsd.service - awslogs daemon
Loaded: loaded (/usr/lib/systemd/system/awslogsd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2022-02-11 11:35:42 UTC; 22s ago
Main PID: 3895 (aws)
CGroup: /system.slice/awslogsd.service
mq3895 /usr/bin/python2 -s /usr/bin/aws logs push --config-file /e...
Feb 11 11:35:42 ip-10-0-0-219.ap-northeast-1.compute.internal systemd[1]: Sta...
Hint: Some lines were ellipsized, use -l to show in full.
###②IAMロールの割り当て
続いてCloudWatch LogsエージェントがCloudWatch Logsにログを連携可能とするための権限割り当てを行っていきます。
IAMロールの作成画面にて[一般的なユースケース]から[EC2]を選択し、[次へ]をクリックします。
許可ポリシーの設定画面にて、[CloudWatchLogsFullAccess]ポリシーを選択し、[次へ]をクリックします。
ロール名を入力し、画面下部の[ロールの作成]をクリックします。
(今回は「nginx-Access-Log-Policy」という名前にしました)
[ロール nginx-Access-Log が作成されました]と出力されれば、作成は成功です。
あとはこのロールを、CloudWatch Logsエージェントをインストールしたインスタンスにアタッチします。
EC2のコンソール画面から対象EC2を選択し、[アクション]>[セキュリティ]>[IAMロールを変更]をクリックし、アタッチを行います。
これにより、CloudWatch Logsのロググループに今回設定したロググループが表示されるようになります。
###③メトリクスフィルターの設定
nginxのアクセスログをCloudWatch Logsで取得するところまでは出来たので、今回の対象のエラーコードである4xxのみをフィルターする設定を行っていきます。
CloudWatch Logsの画面から、作成した「/var/log/nginx/access.log」のロググループを選択し、「メトリクスフィルターを作成」をクリックします。
フィルターパターン[host, logName, user, timestamp, request, statusCode=4*, size]を指定し、[Next]をクリックします。
フィルター名、メトリクス名前空間、メトリクス名、メトリクス値、デフォルト値をそれぞれ入力し、画面下部の[Next]をクリックします。
設定内容を確認し、[メトリクスフィルターを作成]をクリックします。
メトリクスフィルター画面で、作成したメトリクスフィルターが表示されていれば設定は完了です。
###④CloudWatch Alarmの作成
最後に、フィルターして拾ってきたログをメールに通知するための設定を行います。
CloudWatch Logsの画面から、[アラームの作成]をクリックします。
[メトリクスの選択]>[③で設定した名前空間]>[ディメンションなしのメトリクス]をクリックし、作成したメトリクスフィルターにチェックを入れます。
そして[メトリクスの選択]をクリックします。
次にメトリクスの条件を指定します。
今回はメトリクス名を「Nginx-4xx-Error-Metrics」とし、1分間の間に1回以上の4xxエラーを検知した場合にトリガーされるように設定します。
そして画面下部の[次へ]をクリックします。
続いてアクションの設定を行います。
アラーム状態トリガーは[アラーム状態]を選択します。
そして今回は「nginx-4xx-Topic」という名前のSNSトピックを新たに作成してアラームの送信先のEメールエンドポイントを設定し、画面下部の[次へ]をクリックします。
アラーム名を入力し、[次へ]をクリックします。
(今回は「nginx-4xxError-Alarm」としました)
プレビューにて設定を確認し、問題なければ[アラームの作成]をクリックします。
「アラームnginx-4xxError-Alarmが正常に作成されました。」と表示されれば、作成は完了です。
また、アクションの設定で作成したSNSトピックの送信先のメールアドレス宛にサブスクリプションを承認するためのメールが届いているので、Confirmを行います。
Confirmされると以下のメッセージが表示されます。
これにて全ての設定は完了になります。
#検証
作成したEC2のパブリック IPv4 DNSをブラウザのアドレスバーに入力し、存在しないページを末尾に追加して404エラーを意図的に発生させてみます。
暫くすると、404エラーを通知するメールがちゃんと届くことを確認できました。
#最後に
以上、今回は4xx Client Error (クライアントエラー)をCloudWatchLogsで検知してメール送信する方法を纏めてみました。
こんなにシンプルにエラーログの通知が行えるは凄いですね。