CloudWatch Logsを使って500系のレスポンスを検知する方法

EC2上で動いているWebサーバが500系のレスポンスを返した時に、メールで通知する方法を紹介します。メール送信を実現するために、この記事ではCloudWatchを使っています。また、WebサーバはNginxの例を紹介しています。

メール送信の方法

前述の通り、メールの送信にはCloudWatchを利用します。このCloudWatchを使うとEC2などの特定の条件で、メールの送信などをすることができます。

今回メールを送りたい「特定の条件」は、「Webサーバが500系のレスポンスを返した」です。この「Webサーバが500系のレスポンスを返した」をCloudWatchが検知できるように、CloudWatch Logsを利用します。

CloudWatch Logsを使う準備

EC2からCloudWatch Logsにアクセスログを送るために、awslogsというパッケージをインストールします。(Quick Start: Install and Configure the CloudWatch Logs Agent on an Existing EC2 Instance

Roleの設定

EC2インスタンスがCloudWatch Logsに書き込めるようにします。これは、EC2インスタンスが設定されているRoleに、CloudWatchLogsFullAccessを追加すれば設定完了します。

  1. Rolesで、Policyを追加するRoleを選択します。
  2. 「Attach Policy」をクリックします。
  3. リストにある「CloudWatchLogsFullAccess」にチェックを入れて「Attach Policy」をクリックします。

Policyを追加

※EC2インスタンスにRoleを設定する方法については、WordPressの記事や画像をS3にバックアップする方法の「Policyの設定手順」が参考になれば幸いです。

awslogsのインストール

EC2にログインして以下のコマンドを実行します。

$ sudo yum install -y awslogs

awslogsの設定変更

awslogsをインストールすると、/etc/awslogs/下に2つのファイルが作成されています。

  • awscli.conf
  • awslogs.conf

まずはawscli.confを開いてregionを変更します。

[default]
# デフォルトのregionを削除します。
# region = us-east-1
region = ap-northeast-1

次にawslogs.confを開きます。そして、ファイルの一番下に設定を追加し、NginxのログをCloudWatch Logsに送るようにします。ちなみに、CloudWatch上にはlog_group_nameで設定した名前が表示されるので、ここを「どのサービスのログか」を識別できるような名前にしておきます。

[/var/log/nginx/access.log]
datetime_format = %b %d %H:%M:%S 
file = /var/log/nginx/access.log*
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = RS_Access_Log
time_zone = LOCAL

awslogs.confにデフォルトで記述されている「[/var/log/messages]」の設定は、500系エラー検知では使いません。念のためバックアップ(cp awslogs.conf awslogs.conf.default)を取ってから削除します。

awslogsの起動

awslogsを起動します。また、chkconfigにも登録し、EC2起動時にawslogsが起動するようにしておきます。

$ sudo /etc/init.d/awslogs start
$ sudo chkconfig awslogs on

以上で、NginxのログがCloudWatch Logsに送られるようになりました。

Metric Filterの作成

CloudWatchが500系エラー発生を検知できるように、CloudWatch Logを利用したMetric Filterを作成します。

  1. Log Groupsを開きます。
  2. 「0 filters」をクリックします。
  3. 「Add Metric Filter」をクリックします。
  4. 「Filter Pattern」に「[ip, dummy1, uid, timestamp, request, status_code = 5*, bytes, referer, user_agent]」を入力し、「Assign Metric」をクリックします。
  5. 「Filter Name」と「Metric Namespace」を入力し、「Metric Name」に「HttpStatusCode5xx」と入力して「Create Filter」をクリックします。
フィルタの内容

Filter Patterh:
[ip, dummy1, uid, timestamp, request, status_code = 5*, bytes, referer, user_agent]

Filter Name:
Http Status Code 5xx Red

Metric Name:
HttpStatusCode5xx

Metric Value:
1

フィルタの作成

Alarmの作成

500系エラーを検知するためのMetricを作成したら、最後にCloudWatchでメールを送信するように設定します。

  1. Metric Filterの作成を完了した画面で、「Create Alarm」をクリックします。
  2. 「Name」などを入力し、「Statistic」に「Sum」を選択して「Create Alarm」をクリックします。
  3. 「I will do later」をクリックします。
  4. 入力した宛先にメールが送信されるので、「Confirm subscription」をクリックします。

以上で、Nginxで500系のレスポンスを返したときに、メールが送信されるようになります。

アラームの作成

その他CloudWatch Logsの設定

Expiresの設定

古いログが自動的に消えるように、有効期限を設定しておくといいでしょう。設定は、Log Groupsの「Naver Expire」をクリックし、保存期間を選択するだけです。

INSUFFICIENT DATAになるのを解消する

この記事の設定方法だと、作成したAlarmは正常のときにINSUFFICIENT DATAになっています。これを正常のときはOKにするためには、200系のMetric Filterを追加します。

フィルタの内容

Filter Patterh:
[ip, dummy1, uid, timestamp, request, status_code = 2*, bytes, referer, user_agent]

Filter Name:
Http Status Code 5xx Green

Metric Name:
HttpStatusCode5xx

Metric Value:
0

注意点は、Metric Nameに「HttpStatusCode5xx」と、2xxではなく5xxと入力することです。そして、Metric Valueを0とすることで、HttpStatusCode5xxをINSUFFICIENT DATAとならないようにします。

INSUFFICIENT DATAの解消

備考

ELB Metricについて

※ELB(Elastic Load Balancing)を使っている場合は、ELB MetricsのHTTPCode_Backend_5XXを利用できます。これを使うと、CloudWatch Logsの設定をしなくても、500系のレスポンス発生時にメールを送信できます。

この記事が役に立った場合、シェアしていただけると励みになります!!