OSXからAmazon Glacierに写真を自動バックアップ

今まで惰性でiPhoto使って写真管理をしてきたが,そろそろ本格的な編集/加工をしたいなと思い,Lightroomに移行した(いずれVSCO Filmを使いたい).その際,バックアップも外付けHDDからAmazon Glacierに移行した.

Amazon Glacierは,Amazonの提供するクラウドストレージで,1GBあたり1円/月で使える.S3と比べて値段は1/10だが,データをダウンロードするには解凍する時間が必要になる.データを頻繁に取り出さないバックアップなどの用途に向いている.また,AWS Command Line Interfaceでファイル同期ができるので,スクリプトを少し書いて自動バックアップの設定も簡単にできる.

launchctlを使ってLightroomにぶっ込んだ写真を自動でGlacierにバックアップをする仕組みをつくった.

まず,Bucketを作成する.

$ export AWS_CONFIG_FILE=...
$ export BUCKET=...
$ aws s3 mb s3://${BUCKET}

次に,作成したBucketにファイルのLifecycleルールを設定する.対象はBucket内の全てのファイルで,ファイルが同期され次第すぐにGlacierに移行するようにする.これを実現するため以下のjsonファイルを準備する.

# lifecycle.json
{
    "Rules": [
        {
            "ID": "Rule for backup",
            "Status": "Enabled",
            "Prefix": null,
            "Transition": {
                "Days": 0,
                "StorageClass": "GLACIER"
             }
         }
    ]
}

作成したルールをBucketに適用する.

$ aws s3api put-bucket-lifecycle --bucket ${BUCKET} --lifecycle file://lifecycle.json

ファイルの同期は以下のシェルスクリプトで行う.例えば~/Photo以下を同期する.

# backup.sh

SRC=/Users/tcnksm/Photo
BUCKET=...

echo "[$(date +%Y-%m-%d-%H-%M)] Start backup to S3"
export AWS_CONFIG_FILE=...
/usr/local/bin/aws s3 sync ${SRC} s3://${BUCKET} --delete --exclude '*.DS_Store'
echo "[$(date +%Y-%m-%d-%H-%M)] End backup to S3"

上で作成したシェルスクリプトをlaunchdで定期実行させる.plist(~/Library/LaunchAgents/com.tcnksm.photo.backup.plist)は以下のようにする.一週間に一度実行する.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>      
      <key>Label</key>
      <string>com.tcnksm.photo.backup</string>
      <key>ProgramArguments</key>
      <array>
        <string>/Users/tcnksm/scripts/backup.sh</string>
      </array>
      <key>StartInterval</key>
      <integer>604800</integer>
      <key>StandardOutPath</key>
      <string>/Users/tcnksm/var/log/s3-backup.log</string>
      <key>StandardErrorPath</key>
      <string>/Users/tcnksm/var/log/s3-backup.log</string>
      <key>Debug</key>
      <true/>
    </dict>
</plist>

あとは,plistを読み込むだけ.

$ launchctl load ~/Library/LaunchAgents/com.tcnksm.photo.backup.plist

(ちなみに,launchctlコマンドの実行はiTerm.appだとlaunch_msg(): Socket is not connectedでこけるので,Terminal.appから実行する.HomebrewのCommon Issuesを参考)

今回過去の写真も含めて50GB程度アップロードしたけど,それでも月50円程度.素晴らしい.音楽,本などもぶっ込んでおこうと思う.

参考