4万枚、400GBの写真を自動バックアップ。年6ドル。

概要

  • 写真のバックアップを安く、しっかりと取りたいと10年ぐらい前からぼんやりと考えていました。
  • ある程度妥協をしつつ、ある程度まともなバックアップ方法を設計したので共有します。
  • ファイルサーバをLinuxにしたことで柔軟なワークフローを構築できました。
  • プロの場合は、この記事に書いてあるバックアップの期間の記述である、年を月、月を日に置き換えて実行してもらうのが良いです。

ユースケース整理

私の写真の使い方をまとめておきます。

  • 月に1回ぐらい、デジタル一眼レフカメラでRaw画像で撮影。データはメディアに保存。
  • Lightroom経由でローカルPCに転送。レタッチ。現像。
    • 良さそうな写真は現像してGoogle PhotoやFacebookなどにアップロードして共有。
  • Lightroomからファイルサーバのディレクトリをマウントして、Rawファイルをファイルサーバーに移動
  • たまに、写真のデータを参照したい時があるので、リモートアクセスしてファイルサーバにログインして常にAvailableにしたいです。

ファイルサーバーは、Raid1 3台 + ホットスペアで構成されているのでディスク障害に対しては安全だけど、火事や地震リスクを考えると地理的に遠い場所に保管しておきたいです。

現状調査

matsu@dell ~/d/lightroom> find . |wc -l
41176
matsu@dell ~/d/lightroom> du -hs
413G    .

データは4万1,176枚、413GB

ストレージ料金比較

  • Google One
    • ¥13,000 / yearかかります
  • AWS S3
    • S3にstandardで保存すると$10/monthほどです。年に$120, 10年で$1200ドル。
  • AWS S3 Glacier Deep Archive
    • 400GBだと$0.5/monthぐらい、年に$6、月に$0.5、10年で$60。
  • Prime Photo
    • Raw画像の保管が容量制限無料で利用できるので良いです。CLIからもファイルを転送できるのでいい感じなのですが、いかんせん復元の際にディレクトリ構造を維持できなかったりして復元したときが面倒そう。
    • API、CLIでアクセスできなさそうなので、1つ別のストレージアグリゲーションサービスを経由しての利用になるので面倒。

選定先のストレージは2nd tierのバックアップストレージなので、Availabilityを犠牲にしても安さと利便性が重要です。なので、GlacierのDeep Archiveが良さそうです。

注意しないといけないのは、GlacierへのPutやGetのオペレーションごとに課金される点です。また、バックアップの際はS3のインターフェイスと同じで簡単に行なえますが、取り出すときにはファイルごとにアーカイブの取り出しをいわなければ行けないので、やや面倒なコマンドを打っていかなければ行けないです。例えば40,000ファイルを復元したければ、40,000回オペレーションが必要になります。$0.05 per 1,000 requestsなので$2かかります。なので、ある程度の塊にして置いたほうが取り出すときに楽そうです。

S3のリージョンは、地理的リスクをヘッジするために海外を選びます。今回は、N. Virginiaにしました。

Lightroomのファイルを管理するディレクトリは年、月、日の階層でファイルを保存してくれているので固めやすいです。

上記を踏まえての構成図

my photo workflow plan
my photo workflow plan

運用案

  • 1年分の写真を固めて、1ファイルにしてGlacier Deep Archiveに入れる。
  • しかし、当年分はアーカイブとして固められないので、当年は、月に1回s3にRaw画像のファイルをsyncする。
  • 年が明けたら、去年分の全ファイルを固めてGlacier Deep Archiveに入れる。

実装

まず、過去分の写真を1年ごとに固めて、Glacierに入れます。S3のPUTは無料なので容量に気にせずに気軽にPUTできます。

rawファイルを含んでいるので、ただのtarではなく、圧縮をかける必要があります。本来なら解凍する事は無いはずなので圧縮率を最高にしても良いですが、保管コストは安いのでbzip2をデフォルトで使います。

普通にbzip2を使うとシングルコアしか使われず、CPUがボトルネックになります。そこで、pbzip2を使ってマルチコアで圧縮します。bzip2で圧縮しても10%弱しか容量は減らないので、tarで固めるだけで良かった気がします。

pbzip2で圧縮中
#!/bin/bash

set -eu

cd <data directory>

for YEAR in `seq 2003 2018`; do
  tar -I pbzip2 -vcf $YEAR.tar.bz2 $YEAR
  aws s3 mv  --storage-class DEEP_ARCHIVE $YEAR.tar.bz2  s3://<bucket name>/lightroom/
done
転送中

毎月実行

crontab例

0 5 1 * *  bash /path/to/backup_monthly.sh >> /var/tmp/backup.log
#!/bin/bash

set +eu

cd <data directory>

YEAR=`date +%Y`
echo aws s3 sync ${YEAR}/  s3://<bucket name>/lightroom/${YEAR}/

毎年実行

年が明けて、早めの段階で去年の写真をまるごと固めてGlacierに入れます。そして、去年のs3 syncで毎月とっていたバックアップファイルを消します。

crontab 例

0 6 1 2 *  bash /path/to/backup_yearly.sh >> /var/tmp/backup.log
#!/bin/bash

set +eu

cd <data directory>

LAST_YEAR=`date --date=last\ year +%Y`

# archive last year
tar -I pbzip2 -vcf $LAST_YEAR.tar.bz2 $LAST_YEAR
aws s3 mv  --storage-class DEEP_ARCHIVE $LAST_YEAR.tar.bz2  s3://<bucket name>/lightroom/


# delete last year
aws s3 rm s3://<bucket name>/lightroom/${LAST_YEAR} --recursive

気になるお値段

  • バックアップ
    • S3への転送は無料。
  • 運用
    • $6/400GB/年
  • 取り出し
    • 取り出し料が標準(数時間)で$4ドル/400GB
    • 転送量が$8/400GB。
    • (のはず。課金体系が結構変わるのでもしかしたら間違っているかも。)

まとめ

  • 大事なファイルは固めてGlacier DeepArchiveにぶち込むのが安くて良いです。

コメントを残す