
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のメニューがあります!

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:::*"
      ]
    }
  ]
}
メニューから選ぶこともできますね。

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

セットアップ
必要なエージェントをダウンロードしてインストールします。
$ 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"
            }
        ]
    }
}
ログを見る
どのログを見るか選択します。

インスタンスを選択

ログ見れたよ!

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

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

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

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

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

閾値を設定します。

アラーム設定完了

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

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












