AWSでRuby On Railsアプリのログローテーションを設定するやり方
AWSは本当に便利で素晴らしくて未来的なクラウドサーバーシステムです。ログローテーションも簡単に行うことができます。
まだAWSでセキュアな環境を構築できてないという方は以下の記事をご参考にしてみてください。
ログローテーションを設定していないとどうなる?
自分もついこの間(2018年の仕事納めの日)、アクセスが集中してサーバーがダウンしてしまったのですが、
これはアクセスの集中が根本的な原因ではありませんでした。
年末のアクセス増加によってログが一気に増え、結果データ容量がなくなってしまったのです。
もちろんログ・ファイルを消せば良いのですが、定期的に確認しなければならないのはめんどくさいですし、なにかあった時にログを確認しなければいけないですよね。そこでログローテーションがソリューションになります。
ログローテーションとは?
自動で一定の期間のログ・ファイルを日毎に残し、期間外のログ・ファイルを削除することです。
AWSであれば、これをとても簡単に行うことができます。
AWSでログローテーションを設定する方法
production環境で説明していきます。
production.logのログローテーション
config/environments/production.rbに
config.logger = Logger.new("log/production.log", 'weekly')
の一行を追加します。これでproduction.logは一週間より前のものは切り捨てるように変更できました。
Unicornのログローテーション
/etc/logrotate.d配下に「unicorn」というファイルを作成して、以下を記述します。
/var/www/rails/mystore/shared/log/unicorn.*.log {
daily # ログローテーションを毎日に行う
missingok # ログファイルが存在しなくてもエラーを出さずに処理を続行
rotate 3 # 3世代ログを残す
notifempty # ログファイルが空ならローテーションしない
create 0640 myuser mygroup # パーミッション user group
# unicorn masterプロセスに、USR1シグナルを送る
lastaction
pid=/var/www/rails/contents-store/shared/tmp/pids/unicorn.pid
test -s $pid && kill -USR1 "$(cat $pid)"
endscript
}
AWSの環境によって違いがあると思うので、
- /var/www/rails/mystore/shared/log/unicorn.*.log
- pid=/var/www/rails/contents-store/shared/tmp/pids/unicorn.pid
- create 0640 myuser mygroup
の3行は各自変更してください。
Nginxのログローテーション
/etc/logrotate.d/nginxを作成して、以下を記述
/var/log/nginx/*log {
create 0644 myuser mygroup
daily
rotate 3
missingok
notifempty
compress
sharedscripts
postrotate
/etc/init.d/nginx reopen_logs
endscript
}
Sidekiqのログローテーション
/etc/logrotate.d/sidekiqを作成して以下を記述
/var/www/rails/mystore/shared/log/sidekiq.log {
daily
missingok
rotate 3
size 10M
dateext
notifempty
copytruncate
compress
delaycompress
lastaction
unicorn_pid=/var/www/rails/mystore/shared/tmp/pids/unicorn.pid
test -s $unicorn_pid && kill -USR1 "$(cat $unicorn_pid)"
sidekiq_pid=/var/www/rails/mystore/shared/tmp/pids/sidekiq-0.pid
test -s $sidekiq_pid && kill -USR2 "$(cat $sidekiq_pid)"
endscript
}
Redisのログローテーション
/etc/logrotate.d/redisを作成して以下を記述
/var/log/redis/*.log {
daily
missingok
rotate 3
compress
delaycompress
notifempty
create 0640 myuser mygroup
}
ログローテーションを反映させるコマンド
最後に以下のコマンドを叩いて、ログローテーションを反映させます。
$ logrotate -d /etc/logrotate.conf
まとめ
堀江貴文さんがライブドアの前の会社で事業をしていた頃は、オンプレミスのサーバーが主流で数十件のアクセスが集中しただけで簡単にサーバーが落ちてしまっていたそうです。当時のエンジニアのストレスが大きかったことは容易に想像できます。
でもいまは優秀なクラウドサーバーがあります。AWSで盤石な環境を構築していれば、よっぽどのことがない限りサーバーが落ちたりすることはありません。今回紹介したログローテーションのように設定は必要ですが。
AWSではCloud9というブラウザ上で開発できるサービスや、Amazon Machine Learningという機械学習のモデルを早く簡単に構築できるサービスなど、エンジニアにとって快適な環境がどんどん提供されていってます。
AWSの情報はいち早くキャッチアップしたいところです。