ちょっと話題の記事

Amazon CloudWatch Logsによるログの収集とフィルタとアラーム設定

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Summit NYCが始まりました!

オランダ負けて残念だったね〜、で始まりました、AWS Summit NYCです!そして、早速新機能の発表です!その名もCloudWatch Logsです。

CloudWatch Logsとは?

CloudWatch Logsは、独自のアプリケーションやAWSサービスのログを収集して解析する機能です。EC2にエージェントをインストールしてログを飛ばす事ができます!この仕組みは、Amazon Kinesisの機能を使って実現しているようです。

主な機能は以下の2つです。

  • アプリケーションとシステムのログをリアルタイムにモニタリングすること
  • ログデータのアーカイブ

CloudWatch Logsのコンセプト

CloudWatch Logsの全体像を理解するためにコンセプトとなるキーワードを並べてみます。

  • ログイベント:ログイベントは、監視されているアプリケーションやリソースによって記録された活動記録です。イベントが発生したタイムスタンプ、未加工のメッセージの2つのプロパティが含まれていて、UTF-8でエンコードする必要があります。
  • ログストリーム:ログストリームは、同じソースを共有するログイベントのシーケンスです。例えば、特定のホストのApacheのログに関連付けることができます。例えば、2ヶ月間のログストリームを保持しながら、今日のログストリームを作成するなどです。ログストリームに2ヶ月間なにも送信しなければ、そのログストリームは自動的に削除されます。
  • ロググループ:ロググループは、同一の保持、監視、アクセス制御設定を共有するログストリームのグループ定義です。各ログ·ストリームは、1ロググループに属している必要があります。 例)MyWebsite.com/Apache/access_log とか MyWebsite.com/Apache/error_log
  • メトリックフィルタ:メトリックフィルタは、取得イベントから観察するメトリックを抽出し、CloudWatchのメトリックのデータポイントにそれらを変換する方法を表現することができます。メトリックフィルタはロググループを記録するように割り当てられ、ロググループに割り当てられたすべてのフィルタは、それらのログストリームに適用されます。
  • 保存期間の設定:保存期間の設定は、長いログイベントがCloudWatchのログに保管される方法を指定するために使用することができます。期限切れのログイベントは自動的に削除されます。メトリックフィルタのように、保存期間の設定はまた、グループを記録するように割り当てられ、ロググループに割り当てられた保存期間は、それらのログストリームに適用されます。

CloudWatch Logsを使ってみよう

管理コンソールから見てみよう

CloudWatchの画面にLogsのメニューがあります!

screenshot 2014-07-10 23.10.54

CloudWatch Logs Agent

ログを収集するためにエージェントをインストールしてみましょう。インストールにあたって必要な環境は以下の通りです。

  • US East (Northern Virginia) Region
  • Python 2.6.5 以上
  • Amazon Linux version 2014.03.02 以上, Ubuntu Server version 14.04 以上

CloudWatch Logs AgentにIAMロールを設定する

以下のようにIAMロールを設定しましょう。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:*",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:logs:us-east-1:*:*",
        "arn:aws:s3:::*"
      ]
    }
  ]
}

メニューから選ぶこともできますね。

screenshot 2014-07-10 23.53.14

インスタンス起動するときにIAM Roleの設定を忘れずに。もし、既に起動中のインスタンスにセットアップするのであれば、エージェントインストール後にアクセスキーとシークレットキーを入力する必要がありますが、セキュリティの観点からできればIAM Roleが良いと思います。

screenshot 2014-07-10 23.58.05

セットアップ

必要なエージェントをダウンロードしてインストールします。

$ wget https://s3.amazonaws.com/aws-cloudwatch/downloads/awslogs-agent-setup-v1.0.py
$ sudo python ./awslogs-agent-setup-v1.0.py --region us-east-1

Launching interactive setup of CloudWatch Logs agent ... 

Step 1 of 5: Installing pip ...DONE

Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE

Step 3 of 5: Configuring AWS CLI ... 
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: 

Step 4 of 5: Configuring the CloudWatch Logs Agent ... 
Path of log file to upload [/var/log/messages]: 
Destination Log Group name [/var/log/messages]: 

Choose Log Stream name:
  1. Use EC2 instance id.
  2. Use hostname.
  3. Custom.
Enter choice [1]: 1

Choose Log Event timestamp format:
  1. %b %d %H:%M:%S    (Dec 31 23:59:59)
  2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
  3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
  4. Custom
Enter choice [1]: 3

Choose initial position of upload:
  1. From start of file.
  2. From end of file.
Enter choice [1]: 1
More log files to configure? [Y]: N

Step 5 of 5: Setting up agent as a daemon ...DONE


------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo ./awslogs-agent-setup.py --region us-east-1 --only-generate-config'
------------------------------------------------------

ステータスの確認

$ sudo service awslogs status
 (pid  1918) is running...

エージェントの開始

$ sudo service awslogs start

エージェントの停止

$ sudo service awslogs stop

AWS CloudFormationで設定する

CloudFormationでインストール設定することもできますね!

"WebServerLogGroup": {
    "Type": "AWS::Logs::LogGroup",
    "Properties": {
        "RetentionInDays": 7
    }
},

"404MetricFilter": {
    "Type": "AWS::Logs::MetricFilter",
    "Properties": {
        "LogGroupName": {
            Ref": "WebServerLogGroup"
        },
        "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code = 404, size, ...]",
        "MetricTransformations": [
            {
                "MetricValue": "1",
                "MetricNamespace": "test/404s",
                "MetricName": "test404Count"
            }
        ]
    }
}

ログを見る

どのログを見るか選択します。

screenshot 2014-07-11 0.02.11

インスタンスを選択

screenshot 2014-07-11 0.02.19

ログ見れたよ!

screenshot 2014-07-11 0.02.27

ログの有効期限を設定することもできますね。

screenshot 2014-07-11 0.12.54

ログをフィルタする

ログフィルタを作成してみましょう。

screenshot 2014-07-11 0.08.55

フィルタのお試しもできます。ここではWarningを設定しました。

screenshot 2014-07-11 0.09.13

名前を付けて保存します。

screenshot 2014-07-11 0.09.39

ログフィルタにアラーム設定

フィルタにアラームを設定しましょう。

screenshot 2014-07-11 0.09.58

閾値を設定します。

screenshot 2014-07-11 0.11.06

アラーム設定完了

screenshot 2014-07-11 0.12.38

アラームからメール通知の確認をして、実際に取得できましたね!

screenshot_2014-07-11_0_28_25

まとめ

Amazon CloudWatch Logsスゴイです!!独自アプリケーションのログを監視して、フィルタで設定した文字列にヒットして、アラームで閾値設定して、ある値を超えたらメールを飛ばすとか、何かプログラムを起動するとか設定できてしまいます。AWSのAPIと独自アプリの融合も容易になります。ベストプラクティスを早く見つけたいですね。

参考資料

Amazon CloudWatch Developer Guide - Monitoring System, Application, and Custom Log Files