[PR] あなたが Kindle で読みたいその本、Kindle に対応したら Twitter でお知らせします。

ローカルファイルを S3 に同期する init スクリプト

Posted on

Auto Scaling を使っているとスケールインによってインスタンスが Terminate されるので、ログファイルは Fluentd などを使ってログサーバ(もしくは S3 などのストレージ)に集約していると思います。

基本的に Fluentd を使っておけばいいのですが、

  • ログ集約にリアルタイム性を求められない(バックアップ用途など)
  • ユーザーがアップロードしたバイナリファイルを集約したい

といった場合には向いていません。

もっと簡単にローカルのファイルを S3 に同期したかったので Amazon Linux 向けの init スクリプトを書きました(最初のコミットは 2014 年ですが最近まで放置してました…)。

使い方は init スクリプトと conf ファイルを置くだけです。同期には Amazon Linux に最初からインストールされている AWS CLI ( aws s3 sync ) を使っています。複数パスにも対応しているので /var/log//var/www/ を S3 に同期といったこともできます。

init スクリプトにしていますがデーモンが起動するわけではないので、定期的に実行したい場合は Cron に登録してください。間隔はログの出力量によって変わってきますが、高頻度で同期すると S3 のリクエスト料金が増えます。

デーモンとして起動しないのになぜ init スクリプトにしたかというと、init スクリプトにしておけば シャットダウン時に自動的に同期される からです。 OS のシャットダウンプロセスで s3-sync が実行されるので、ユーザーは特に意識することなく最後のログファイルを確実に取得できます。

詳しく知りたい方は「/var/lock/subsys/ ってなに?」を読んでみてください。

まとめ

Auto Scaling 構成のプロダクション環境で 1 年以上運用してきましたが、これまで問題になったことはありません。興味のある方はぜひ試してみてください。

バグや機能要望は Pull request や Issue でどうぞ!