share facebook facebook twitter menu hatena pocket slack

2012.04.03 TUE

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

これから増やしていこうと思っている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)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。