4万枚400GBの写真を自動で安全にバックアップ。AWS Glacierで6ドル/年

AWS

概要

  • 写真のバックアップを安価で安全に保存したいと10年ぐらい前からぼんやりと考えていました。
  • この記事では、やっと満足の行くバックアップ方法を実現したので共有します。
  • ファイルサーバをLinuxにしたことで柔軟なワークフローを構築できました。
  • プロ写真家の場合は、この記事に書いてあるバックアップの期間の単位を1段階粒度を細かくして設定するとより頻度を高められて安全になると思います。

私の写真ファイル保存ワークフロー

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

  • 月に1回ぐらい、デジタル一眼レフカメラでRaw画像で撮影。データはカメラに挿入しているXDカードに保存。
  • XDカードからLightroom経由でローカルPCに転送し、レタッチ、現像。
    • 良さそうな写真は現像してGoogle Photo, Facebook, iCloudなどにアップロードして共有。
  • Lightroomからファイルサーバのディレクトリをsmbまたはsshfsでマウントして、Rawファイルをファイルサーバに移動
  • 過去の写真が見たくなったら、ファイルサーバをマウントしてLightroomから参照する。

このワークフローで問題になるのは、ファイルサーバ自体がリスクヘッジされていないのでサーバ自体の物理セキュリティ(火事や地震など)が確保されていないことです。このファイルを地理的に遠い場所に安全に保管しておきたいです。

現状のファイルの傾向分析

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

4万1,176枚、413GB

ストレージ料金比較

オンラインストレージにてファイルを400GBを保存する場合で試算してみます。

  • 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。
    • 保管と復元がAPIやCLI経由。
    • 復元に時間を要する。(だから安い)
  • 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にぶち込むのが安くて良いです。

1年運用してみた実績

2021年1月の利用料です。64 cents/monthとなり、年間は840円ほどになります。大体予想通りです。

データ容量は450GBに増えました。1年で50GBぐらい増えた計算です。

S3 Glacierには長期保存用の写真、S3のstandardには、Glacierへ保存する前のデータです。

コメント