2012年4月2日月曜日

EC2インスタンス停止/終了時にログなどをS3に保存(CentOS 6.2)

スズキです。

これから増やしていこうと思っているCDPネタです。

今回は「Web Storage Archiveパターン」です。


このパターンは、ログやバックアップを定期的にS3にアーカイブしましょう、
というものです。

普通に、"cron"などで定期的に"s3cmd"などを利用してS3に該当ファイルを
アップロードしればいいのですが、注意点として、"Auto Scaling"を利用している場合は、
EC2のシャットダウン時にも該当ログをS3に保存する処理も必要となります。

なぜなら、"Auto Scaling"は設定次第では負荷が減少すると自動的に
EC2インスタンスを終了します。その場合、前回のS3へのアーカイブから、
インスタンス終了までのログやバックアップが消えてしまうことになります。

ということで、EC2インスタンス終了時にもS3にファイルをアップロードする
仕組みを考えてみます。

今回はS3へのアップロードにs3cmdを利用するので、下記のように準備をしておきます。
# s3cmd --configure
# mv /root/.s3cfg /root/backup2s3.cfg
"s3cmd"に関しては、下記の通り本ブログでもいろいろと紹介しています。
"s3cmd"のまとめ
次に、S3へのアーカイブ用のシェルスクリプトとして、例えば下記のようなものを
用意します。
# cat /root/backup2s3.sh
#!/bin/sh
echo `date` - BEGIN
s3cmd -c /root/backup2s3.cfg put /var/log/messages
s3://www.suz-lab.com/`date '+%Y%m%d%H%M%S'`.log
echo `date` - END
そして、ここがポイントですが、下記のような"rcスクリプト"を用意します。
("CentOS 6.2"を前提としています)
# cat /etc/init.d/backup2s3
#!/bin/bash
#
# backup2s3        Backup to S3.
#
# chkconfig: 2345 99 10
# description: Backup to S3

# Source function library.
. /etc/init.d/functions

prog=backup2s3
exec=/root/${prog}.sh
log=/root/${prog}.log
lock=/var/lock/subsys/$prog

# Source config
if [ -f /etc/sysconfig/$prog ] ; then
   . /etc/sysconfig/$prog
fi

case "$1" in
 start)
       touch $lock
       ;;
 stop)
       $exec >> $log 2>&1
       rm -f $lock
       ;;
 restart)
       ;;
 *)
       echo $"Usage: $0 {start|stop}"
       exit 2
esac

exit $?
"start"では実質何もせず、"/var/lock/subsys/backup2s3"を置くだけで、
"stop"で上記のS3にアップロードするスクリプトを実行しています。

ちなみにシャットダウン/リブート時に"stop"が実行されるサービスは、
"/var/lock/subsys/"以下にファイルが置いてあるものとなります。
("/etc/rc(0|6).d/S00killall"を読むとわかります)

最後に、下記のように自動起動化して、サービスを開始(何もしないけど)すれば
シャットダウン/リブート時に指定したファイルがS3にアップロードされます。
# chkconfig --add backup2s3
# chkconfig backup2s3 on
# /etc/init.d/backup2s3 start
"/etc/init.d/halt"に記述してもシャットダウン/リブート時にスクリプトを
実行できるのですが、その場合、先にネットワークが切られてしまい、
S3へのアップロードができなくなってしまいました。(かなりハマりました...)

ちなみに「Scheduled Autoscalingパターン」でも"rcスクリプト"でバッチ処理の起動と
終了を行うことになると思うので、参考になると思います。
--------
http://www.suz-lab.com

0 コメント: