これから増やしていこうと思っているCDP(Cloud Design Pattern)ネタになります。

今回は「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スクリプトでバッチ処理の起動と終了を行うことになると思うので、参考になると思います。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら