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