21 December 2014

(Amazon S3) s3fsまたはs3cmdを用いてrsync

Amazon S3にファイルのバックアップを取るコマンドラインの手法を試してみた

検証環境は
・Ubuntu 14.04LTS
・s3fs バージョン 1.78
・s3cmd バージョン 1.5.0-rc1

s3fsのインストール

s3fsはGitHubの公式ページより最新版をダウンロードする

$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
$ cd s3fs-fuse

READMEファイルのインストラクションの通りビルドし、checkinstallでdebパッケージ化してインストールする

$ ./autogen.sh
$ ./configure --prefix=/usr/local --with-openssl
$ make
$ sudo checkinstall

s3fsでファイルシステムとしてマウントする

s3fsはmountコマンドを利用できる権限でしか利用できない。fstabで一般ユーザに読み書き権限を開放しても、うまくいかなかった

まず、認証データを保存する。/etcに保存して全ユーザが使えるようにするのか~/に保存して当該ユーザのみ使えるようにするのかのどちらか

アクセス・キー : シークレット・キー という書式で格納する。また、S3のバケット毎にアクセスキーが違う場合はバケット名 : アクセス・キー : シークレット・キーとするようだ。(公式マニュアルによる)

$ echo AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY > ~/.passwd-s3fs
 又は 
$ sudo echo AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY > /etc/passwd-s3fs

他のユーザから見えないようにする

$ sudo chmod 640 /etc/passwd-s3fs
$ chmod 600 ~/.passwd-s3fs

マウント・ポイントのディレクトリを用意する

$ sudo mkdir /mnt/s3mnt
$ sudo chmod 777 /mnt/s3mnt

コマンドラインでマウントする。なお、接続がSSL経由になるようurlオプションをつけている

$ s3fs [BACKET NAME] /mnt/s3mnt -o rw,url=https://s3.amazonaws.com

fstabに記述して、ブート時にマウントさせるには

/etc/fstab
s3fs#BACKET_NAME  /mnt/s3mnt  fuse  rw,user,_netdev,url=https://s3.amazonaws.com 0 0

なお、値段のお安い『Reduced Redundancy Storage』を使う場合は-o url=https://s3.amazonaws.com,use_rrs=1のようにオプションを追加する。

rsyncでファイル同期

ローカル・ストレージと同じく、rsyncを使えば良い

$ rsync -avz FROM_DIR /mnt/s3mnt/backup_dir

s3cmdのインストール

もうひとつのツール s3cmd のファイル同期機能を使うため、s3cmdをインストールしてみる。s3toolの公式ページからソースコードをダウンロード。SourceForgeとGitHubの2箇所でソフトウエアが配布されているが、GitHubが日々修正されていく最新版が格納されている(アップデート作業中かも…)ようなので、GitHubからダウンロードしてみる

$ git clone https://github.com/s3tools/s3cmd.git
$ cd s3cmd

ドキュメントファイル INSTALL の通りにインストール作業

$ sudo checkinstall python setup.py install

初期設定を行う

$ s3cmd --configure
〜 中略 : アクセスキー等を入力する質問が幾つかある 〜
〜 全て入力が終わると、継ぎのような一覧表示がされる 〜
 
New settings:
  Access Key: [アクセス・キーが表示される]
  Secret Key: [シークレット・キーが表示される]
  Default Region: ap-northeast-1  ← 東京の設定 
  Encryption password: 
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: True
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

ディレクトリの同期(sync)を行う

$ s3cmd sync --no-delete-removed ./data_dir/ s3://my_backet/data_dir/

rsyncの-nオプション(プレビューのみ)を意味するのは、--dry-runになる

$ s3cmd sync --dry-run --no-delete-removed ./data_dir/ s3://my_backet/data_dir/

同期の動作確認で、(touch等で行う)ファイル日付のみの変更では、『変更があった』とみなされない。ファイルサイズが変更になって初めて転送されるようだ。

なお、値段のお安い『Reduced Redundancy Storage』を使う場合は--rrオプションを追加する。

s3cmdでの暗号化

s3cmd syncではGPGによる暗号化はサポートされていない。s3cmd putなら可能。公開鍵方式ではなく、単なるパスワードによる暗号化だが…

暗号化パスワードはs3cmd --configureで設定するか、直接設定ファイルの~/.s3cfgに書き込む

$ s3cmd put --dry-run --encrypt ./data_dir/test.txt s3://my_backet/data_dir/