AWS S3(1)MacのデータをGlacierにバックアップする

iMacに保存されているデータをAmazon Glacierに定期バックアップする。

Amazon Glacierは、長期バックアップに最適なストレージで、非常に低コストであることが特徴である。費用はリージョンごとに異なり、バージニアリージョンであれば0.007USD/GB、東京リージョンであれば0.0114USD/GB、1TBのデータを保存しても月額800円程度と安価である。Glacierは、データをアーカイブとして保存するため、アップロード後にデータを改変することができない。S3ではデータの保存先にGlacierを指定することが可能で、ライフサイクル設定によりデータを定期的にGlacierにアーカイブ可能となっている。

AWS CLI のインストール

MacからAWSにアクセスするためには、コマンドラインツールであるAWS CLIの利用が便利である。AWS CLIは、pip(Pythonパッケージ管理システム)からインストールが可能である。

$ sudo pip install awscli
  Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: pyasn1, rsa, futures, jmespath, six, python-dateutil, docutils, botocore, s3transfer, colorama, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 726, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 746, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-oO8sKD-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

上記のようにsixが既にインストールされているという警告が出てインストールできない場合は、以下のコマンドでインストールを行う。

$ sudo pip install awscli --upgrade --ignore-installed six

インストール完了後は、認証情報の設定を行う。AWS Access Key IDAWS Secret Access Keyなどの認証情報は、AWSマネージメントコンソールのAWS Identity and Access Managementから設定が可能である。

$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

S3初期設定

S3の設定を行い、データを格納するバケットの生成および、Glacierへバックアップを行うライフサイクル設定をする。安価にデータをバックアップするという目的でGlacierを使用することから、今回は単価が最も安いバージニアリージョンをする。

バケットの生成

バケットを生成する。
このときAWS CLIに設定したユーザにS3へのアクセス権限がないとエラーが発生する。

$ aws s3 mb s3://backup-hoge --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (AccessDenied) occurred when calling the CreateBucket operation: Access Denied

そこで、AWSマネージメントコンソールのAWS Identity and Access Managementで、該当ユーザにAmazon S3 Full Access権限を付与する。

ポリシーのアタッチ

また、S3のバケット名はユニークである必要があるので、既に同一名称のバケットが存在する場合は、下記のようなエラーが発生するので注意が必要である。

$ aws s3 mb s3://backup-hoge  --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (BucketAlreadyExists) occurred when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

ライフサイクル設定

次にライフサイクル設定で、どの程度の頻度でGlacierへアーカイブするかを設定する。
今回は、以下の設定としている。

設定内容 JSON
即日アーカイブする “Days”: 0″
特定のディレクトリに限定することなくバケット全体をアーカイブする “Prefix”: “”
Glacierへアーカイブする “StorageClass”: “GLACIER”

このとき、「”Prefix”: null」とすると、フォーマットエラーとなる。

vi /tmp/lifecycle.json

{
    "Rules": [
        {
            "Status": "Enabled", 
            "Prefix": "", 
            "Transition": {
                "Days": 0, 
                "StorageClass": "GLACIER"
            }, 
            "ID": "backup for xxx"
        }
    ]
}

JSONが作成できたら、ライフサイクル設定の反映を行う。

aws s3api put-bucket-lifecycle --bucket backup-hoge --lifecycle file://lifecycle.json

同期処理

同期処理は以下のコマンドにより実行できる。deleteオプションによりファイル削除も同期される。また、excludeオプションによって同期対象外のファイルやフォルダを指定できるので、.DS_Storeファイルなどを指定しておくと良い。excludeオプションは、条件の数だけいくつでも追記できる。

aws s3 sync /Volumes/hoge/ s3://backup-hoge --delete --exclude '*.DS_Store'
Pocket