AWS の ElasticBeanstalk でログファイルを CloudWatch に転送する

SpringBootで作成したWebアプリケーションをElasticBeanstalkで運用していてAutoScalingなどでEC2が削除されると、EC2上に保存されているログファイルも当然削除されてしまう。
削除される前にログファイルをどこかに保存したいと思うのですが、その一つの方法としてCloudWatchに転送することにする。

ElasticBeanstalkにはCloudWatchにログファイルを連携する機能がありますが、今回はアプリケーション独自のログを連携したいのでこの機能(CloudWatch Logs へのインスタンスログのストリーミング)は使いません。

アプリケーションから出力した独自ログとapacheのログを転送することにします。
CloudWatchへの転送にはawslogsを使用します。
awslogsのインストールなどEC2への操作などはデプロイするWebアプリケーション内に設定ファイルとして追加します。
具体的には、アプリケーションの src/main/webapp/.ebextensions 以下に配置します。

.ebextensions 以下にconfigファイルを配置しますが、awslogsを使う場合は以下のような内容です。

packages:
  yum:
    awslogs: []
container_commands:
  1-cp-awscli_conf:
    command: cp -rf .ebextensions/awscli.conf /etc/awslogs/awscli.conf
  2-cp-awslogs_conf:
    command: cp -rf .ebextensions/awslogs.conf /etc/awslogs/awslogs.conf
  3-chkconfig-awslogs:
    command: /sbin/chkconfig awslogs on
  4-restert-awslogs:
    command: /sbin/service awslogs status; if [ $? -eq 0 ]; then /sbin/service awslogs restart; else /sbin/service awslogs start ; fi;

awslogsの設定ファイルも予め用意しておいて、そのファイルコピーします。
最終的なファイル構成はこんな感じです。

awscli.conf、awslogs.conf の内容も参考までに。

awscli.conf

[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1

awslogs.conf

[general]
state_file = /var/lib/awslogs/agent-state

[/var/log/httpd/access_log]
log_group_name = sample_app
log_stream_name = {instance_id}_httpd
file = /var/log/httpd/access_log
datetime_format = %d/%b/%Y:%H:%M:%S
initial_position = start_of_file
buffer_duration = 5000

[/var/log/tomcat8/sample_app.log]
log_group_name = sample_app
log_stream_name = {instance_id}_app
file = /var/log/tomcat8/sample_app.log
datetime_format = %Y-%m-%d %H:%M:%S.
initial_position = start_of_file
buffer_duration = 5000

もちろんログのファイル名や、日付けフォーマットなどを合わせる必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA