この記事は公開されてから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の「ログ」 を開きます。
- 対象のロググループを指定します。
- 必要に応じロググループ単位でログ保持期間の設定も可能です。
- 確認対象のログストリームを指定します。
- 今回ログストリーム名は「インスタンスID+ログ種類」としたので、インスタンスIDで絞り込んでいます。
-
日時指定で該当ログが確認できます。
- フィルタによる部分一致検索が可能です。
まとめ
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、是非お試しください。