WEBサイトのファイルをS3へ自動でバックアップする

Amazon Web Services

Sublime TextやAtome、Notepad++を使っていると、FTP接続して直接サーバー上のファイルを編集できるので、自宅のデスクトップPCやノートPCでちょっと編集することが簡単になってきました
ローカルにファイルを同期しなくてもできるので、「Aのサイトのスタイルシートを編集したい」「Bのサイトをスタイルシートを変更したい」というのがすぐにできちゃいます

しかし、サーバ側のファイルを直接編集しているのでローカルのファイルが最新である保障がなくなってしまい、サーバに障害が発生してまうと一大事!
Gitを使えばサイト自体のファイルはある程度復元可能ですが、コミットしていなければ・・・
バーチャルホストで運用していて、他のサイト同士で処理を統一するためのファイル(function.phpなど)をサーバー上の別の場所へ保存している場合もバックアップしておきたいものです

さらに、サーバ上でバックアップファイルを作成していてもバックアップファイルをダウンロードしていなければ元も子もないので、バックアップファイルは別の場所に保管しておきたいですよね。自動で

ということで、AWSのS3をバックアップ用のストレージとして利用してみます
S3は保存容量と転送容量に対して課金されますが、保存すること自体の金額はかなり安いです(1GBあたり3.729円)
保存したデータをダウンロードするときはちょっと高くなります(1GBあたり15.82円)

合計20GBのデータを保存しても、約80円
全ファイルの復元が必要になってダウンロードしたとしても、約300円

データを復旧できると考えれば安いものではないでしょうか
サーバにプログラムを仕込んでおけば自動でバックアップしてくれるので気を煩わす必要もありません

バックアップファイルを保存する場所を準備

既存のフォルダから直接ファイルをS3に送ってもいいですが、コマンドを間違えるとファイルを消してしまう可能性があるので、一旦別の場所にファイルをコピーします
※ファイルが2重で存在することになるのでサーバ自体の空き容量に気をつけてください

AWS コマンドラインインターフェイスの準備

AWSをコマンドラインで操作するためにAWSから提供されているツールを使用します

・概要
 https://aws.amazon.com/jp/cli/

・インストール方法
 http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

S3バケットの準備

GUI画面で作れるので難しくありません
ここでは『hoge-web-bk』としたとします

・バケットの作成方法の説明
 http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/gsg/CreatingABucket.html

シェルスクリプトファイルの作成

準備は整ったので、あとはシェルスクリプトを作ってサーバに作業させるだけです

バックアップの要件として
・いつバックアップが作成されたかS3側で分かりやすくしたい
を考えました

自動でやっている分、いつS3へ保存されたのか目視で分かるほうが緊急対応の時に判別しやすくなるので戻り作業が減ります
S3バケットに保存する際のフォルダ名に日時を設定することにしました

cronを使って毎日バックアップを保存する設定にしています
毎朝4時に設定したとすると、バックアップで作成されるディレクトリ名は『2016102804』と日付の後に時間がついてS3へ保存されます

1ヶ月経過したらS3から削除するようにしていますので、10月28日に実施すると09月28日のデータがS3から削除されることになり、S3には1ヶ月分のデータが日付ごとにアップロードされていることになります

この設定はバックアップの必要性・データ容量を考慮して変更してください
容量が大きければS3のデータ保存利用料が増えていきます
画像ファイルを遠隔で修正することは少ないので、拡張子を指定して、画像ファイルは月次バックアップ
htmlやphp,css,jsファイル等は編集の頻度が高いので日時バックアップにするなど工夫次第でAWSからの課金量も抑えられます

ファイルを圧縮せずにS3へアップロードしていますが、特定のファイルだけ取得したくても圧縮ファイルのダウンロードが必要となるので、ダウンロードの際に発生する課金を考えたら個別の方がいいかなという理由です

cronの設定

バックアップ用のシェルスクリプトが出来上がりましたのでcronに設定を入れます

cronでの実行権限を与えます

cronに設定を追加します

あとは正常にバックアップされているか、料金が想像以上に発生していないかをしばらく注意してみましょう

全てのデータのバックアップは不要ということで更新されたファイルだけ随時バックアップしておきたい場合は、コピーの仕方を変更するだけで1時間ごとに変更があったファイルをS3へ保存していくなども可能です