[Elastic Beanstalk] CloudwatchLogsでsyslog、eb関連ログを集約管理してみた

Elastic Beanstalk

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

はじめに

AWSチームの鈴木です。

Elastic Beanstalk環境のAmazonLinux、syslogと、Beanstalk関係のログ集約環境としてClouwatchLogsを利用する機会がありましたので、その内容を紹介します。

実行環境

プラットフォーム

  • 64bit Amazon Linux 2015.03 v2.0.0 : PHP 5.6
  • 64bit Amazon Linux 2015.03 v2.0.0 : Ruby 2.2 (Passenger Standalone)
  • 64bit Amazon Linux 2015.03 v2.0.0 : Node.js

ログ取得対象

システムログ

  • /var/log/messages

Elastic Beanstalkログ

  • /var/log/eb-activity.log
  • /var/log/eb-cfn-init.log
  • /var/log/eb-commandprocessor.log
  • /var/log/eb-publish-logs.log
  • /var/log/eb-version-deployment.log

事前調査

CloudwatchLogsでログの日時情報を正しく扱うため、 収集対象となるログの日時出力フォーマットを確認して、 CloudwatchLogsエージェント設定(awslogs.conf)の「datetime_format」として反映します。

Syslog

対象

  • /var/log/messages

サンプル

Aug  3 11:55:07 ip-10-37-20-148 kernel: imklog 5.8.10, log source = /proc/kmsg started.

フォーマット確認

  • Dateコマンドで検証します。
$ export LANG=c
$ date "+%b %d %H:%M:%S"
Sep 05 05:58:41
  • datetime_formatの反映値
datetime_format = %b %d %H:%M:%S

ISO8601(T区切り)

対象

  • eb-activity.log
  • eb-cfn-init.log
  • eb-commandprocessor.log

サンプル

[2015-08-21T10:12:52.231Z] INFO  [1398]  - [Initialization] : Starting activity...
[2015-08-21T10:12:52.236Z] INFO  [1398]  - [Initialization/AddonsBefore] : Starting activity...

フォーマット確認

  • Dateコマンドで検証します。
  • LinuxのDateコマンドでは、3桁のミリ秒は「%3N」となります。
$ export LANG=c
$ date "+[%Y-%m-%dT%H:%M:%S.%3NZ]"
[2015-09-05T06:06:24.065Z]
  • datetime_formatの反映値
datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ]

ISO8601(半角スペース区切)

対象

  • eb-publish-logs.log
  • eb-version-deployment.log
  • eb-tools.log

サンプル

2015-08-03 11:57:44,084 [INFO] (1776 MainThread) [tools.py-108] [root tools get_metadata] Calling CFN for metadata of resource "AWSEBAutoScalingGroup"

フォーマット確認

$ export LANG=c
$ date "+%Y-%m-%d %H:%M:%S,%3N"
2015-09-05 06:20:56,981
  • datetime_formatの反映値
datetime_format = %Y-%m-%d %H:%M:%S,%3N

設定方法

  • 「.ebextensions」以下のconfigファイルとして設定します。
  • awslogs (cloudwatchlogsのログ収集エージェント)は、AmazonLinuxのリポジトリよりyumでインストールします。
  • cloudwatchlogsのログ送付先は、東京リージョン(ap-northeast-1)を利用します。
  • cloudwatchlogsのロググループは、ebの環境名+ログ種別としました。
  • cloudwatchlogsのログストリームは、インスタンスID+ログ名を指定しました。

設定例

  • 「.ebextensions/00.cloudwatchlogs.config」
packages:
  yum:
    awslogs: []
files:
  "/etc/awslogs/awscli.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [plugins]
      cwlogs = cwlogs
      [default]
      region = ap-northeast-1
  "/etc/awslogs/awslogs.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [general]
      state_file = /var/lib/awslogs/agent-state
      [/var/log/messages]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "syslog"]]}`
      log_stream_name = {instance_id}_messages
      file = /var/log/messages
      datetime_format = %b %d %H:%M:%S
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-activity.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-activity.log
      file = /var/log/eb-activity.log
      datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ]
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-cfn-init.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-cfn-init.log
      file = /var/log/eb-cfn-init.log
      datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ]
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-commandprocessor.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-commandprocessor.log
      file = /var/log/eb-commandprocessor.log
      datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ]
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-publish-logs.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-publish-logs.log
      file = /var/log/eb-publish-logs.log
      datetime_format = %Y-%m-%d %H:%M:%S,%3N
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-version-deployment.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-version-deployment.log
      file = /var/log/eb-version-deployment.log
      datetime_format = %Y-%m-%d %H:%M:%S,%3N
      initial_position = start_of_file
      buffer_duration = 5000
      [/var/log/eb-tools.log]
      log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}`
      log_stream_name = {instance_id}_eb-tools.log
      file = /var/log/eb-tools.log
      datetime_format = %Y-%m-%d %H:%M:%S,%3N
      initial_position = start_of_file
      buffer_duration = 5000
commands:
  "01":
    command: chkconfig awslogs on
  "02":
    command: service awslogs status; if [ $? -eq 0 ]; then service awslogs restart; else service awslogs start ; fi;

ログ確認

  • AWSコンソールCloudWatchの「ログ」 を開きます。

eb-log2cloudwatchlogs-01

  • 対象のロググループを指定します。
  • 必要に応じロググループ単位でログ保持期間の設定も可能です。

eb-log2cloudwatchlogs-02

  • 確認対象のログストリームを指定します。
  • 今回ログストリーム名は「インスタンスID+ログ種類」としたので、インスタンスIDで絞り込んでいます。 eb-log2cloudwatchlogs-03

  • 日時指定で該当ログが確認できます。

  • フィルタによる部分一致検索が可能です。 eb-log2cloudwatchlogs-04

まとめ

Elastic Beanstalk標準でもログ管理機能が提供されていますが、 ログ調査の為にインスタンスへのSSH(リモート)接続が必要となったり、 OS障害などでオートスケールが発動した場合には、S3へのアーカイブされる前のログが インスタンス毎消失してしまうこともありました。

CloudWatchLogsには以下の様な投入できるログ上限が存在しますが、 インスタンス毎にログストリームを設けるといった利用で回避する事で、相当規模のログも扱う事が可能です。

CloudWatch の制限より * 最大イベントサイズは 256 KB です。 * PutLogEvents の最大バッチサイズは 1 MB です。 * PutLogEvents リクエストの最大レートはログストリームごとに 1 秒あたり 5 リクエストです。

CloudWatchLogs、受信データは 5 GB まで、データアーカイブは 5GB まで無料。 無料枠を超過した後も、受信データ1GB毎に$0.76、アーカイブは1GBあたり$0.033と、 廉価な利用が可能なサービスです。

この様に簡単にBeanstalk環境でログ集中管理を実現できるCloudWatchLogs、是非お試しください。

AWS Cloud Roadshow 2017 福岡