読者です 読者をやめる 読者になる 読者になる

ほとラボ

It works!

Amazon Glacier と AWS CLI 1.0 で格安バックアップ環境を作る

Amazon Glacier 使ってバックアップ環境つくりたいなー
でも rsync 的な使い方したいけどどうやってやったらいいかわからないなー

と思っていたら、先日 AWS CLI 1.0 がリリースされて新しくsyncコマンドが使えるようになったので、これはチャンスと思い手を出してみた次第。

AWSまわりを軽く説明

知ってる人は読まなくていいです。

Amazon S3

Amazonクラウドストレージ。
Dropboxのバックエンドなんかにも使われている、Web開発者にはお馴染みのアレ。

特筆すべきは 99.999999999%(イレブン・ナイン) の堅牢性。
なんだかよくわからないけどめっちゃ9が並んでるから多分すごい(小並感

Amazon Glacier

同じく、Amazonクラウドストレージ。

価格が 1GBあたり1円/月(S3の約10分の1) とかなり安いが、データをダウンロードする際に解凍する時間(4時間くらい)が必要。 データを頻繁に取り出したりしないバックアップなどの用途に向いている。

S3に保存したデータを自動でGlacierに転送する機能もあるので、S3と同じ感覚で使える。

AWS CLI(Command Line Interface)

AWSをコマンドから操作できるツール。
Amazon公式。

先日ついに正式版(1.0)がリリースされ、新しいS3コマンドsyncなども使えるようになった。

Amazon Glacierを使えるようにする

このへんはよそさまのブログを参照。
ググったらたくさん出てくる。

1GB/1円のAmazon Glacierを個人でも活用する方法 - ku-sukeのブログ

まぁ だいたい

  • AWSのユーザ登録をする(要クレカ)
  • S3のバケットを作る
  • Glacierへの転送オプションを設定する

みたいな流れ。

簡単にバックアップできるようにする

Mac向け。
Linuxもだいたい同じなはず。
Windowsは知らないです。

やりたいこと

  • スクリプト叩くだけでバックアップできる
  • 差分だけ送るようにして毎回のバックアップに時間をかけない
  • バックアップしなくてもいいファイル(.DS_Storeとか)は送らない

要するに、普通のサーバでrsyncを使って出来たことをAWSでもできるようにしたい。

AWS CLIをインストール

インストール方法はいろいろあるが、今回はpipでインストール。

$ pip install awscli

続いて、.bash_profile にあれこれ設定

export PATH=$PATH:/usr/local/share/python

export AWS_ACCESS_KEY_ID=AVADAKEDAVRA
export AWS_SECRET_ACCESS_KEY=abababababababababababababababa

complete -C aws_completer aws

最初、パスが通っていなくて地味に詰まったorz
普段pipとか使わないからこうなる...

あとは自分のアクセスキーとシークレットキーの設定と、サブコマンドの入力補完をしてくれる設定。

インストールできたか確認

$ aws --version
aws-cli/1.0.0 Python/2.7.3 Darwin/12.4.0

おぅけーい。

シェルスクリプトを書く

#!/bin/sh

source='~/Movies'       # バックアップ元
bucket='hoto.backup'    # 保存するS3のバケット名
dir='Movies'            # 保存するフォルダ
region='ap-northeast-1' # バケットのリージョン

# バックアップしないファイル
f=('*.DS_Store' '*.tmp' '*.swp')

params="$source s3://$bucket/$dir --region $region --delete"
e='--exclude'

aws s3 sync $params $e "${f[0]}" $e "${f[1]}" $e "${f[2]}"

なんかごちゃごちゃしてるけど、つまりは

$ aws s3 sync ~/Movies s3://hoto.backup/Movies --region ap-northeast-1 --delete --exclude "*.DS_Store" --exclude "*.tmp" --exclude "*.swp"

こういうコマンドを実行したいわけだ。

それにしても汚いスクリプトだな(;-_-)
除外ファイルを指定するあたり、もっと綺麗な書き方できるなら教えて下さい...

完成(゚∀゚)

あとはバックアップしたいときにスクリプトを叩くなり、 cronで定期的に叩くなりすればよし。

今回は50GBくらいバックアップとったけど、それでも月50円くらいで済む(はず)。
今まで月980円のVPSにバックアップしてたので、それに比べるとなんとコスパの良いことか。

AWS万歳\(^o^)/