インフィニットループ 技術ブログ

2015年07月31日 (金)

著者 : mizuno_as

Amazon S3とGoogleドライブ間も同期できる! rcloneが超便利

こんにちは、mizuno_asです。
みなさん、バックアップ取ってますか? ファイルを消してしまった、あるいは間違ったデータで上書きしてしまったというオペレーションミスは誰でも経験があることだと思います。またハードウェアのトラブルによって、ディスクが読めなくなってしまうことも珍しくありませんよね。
バックアップにおいて大切なのは、「何を」「どのように」「どのくらいの頻度で」「どのくらいの期間」保存するのか、きちんと戦略を立てることです。一番お手軽なバックアップといえばUSBメモリなどへのコピーですが、USBメモリが壊れてしまう可能性もあります ((USBメモリは様々なストレージの中でも、記録と紛失のお手軽さは一番だと筆者は思っています。)) 。では複数のコピーを作れば安全でしょうか? いいえ、もしも地震や火災が起きてしまったらどうなるでしょう。それならばコピーしたUSBメモリを、複数の遠隔地へ毎日郵送すれば……? このように、完璧を目指したらキリがありません。手間もお金も際限なくかかってしまいます。
ところがAmazon S3のようなクラウドストレージを使うと、ディザスタリカバリも含めた様々な問題を、非常に低コストで解決できる可能性があります。GB単価は0.033ドル、容量は無制限、そしてイレブンナインと言われる耐久性。S3がデータをロストする可能性は、普通に考えて自宅が火事になる可能性よりも遥かに低そうですし、もう重要なデータは全部S3に投げとけ! という人も少なくないのではないかと思います ((最近ではNASアプライアンスの中にも、S3への自動バックアップに対応した製品が登場していますよね。)) 。
とは言うものの、この手のクラウドストレージはアクセスに専用のツールが必要であったり、少々扱いが面倒なのもまた事実です。この「単にscpとかrsyncができればそれでいいのに!」というサーバー管理者のありがちな悩みを解決してくれるかもしれないのが、さまざまなクラウドストレージ間でのrsyncを実現するフロントエンド、rcloneです。

rcloneはgo言語製のツールです。ダウンロードページからお使いのプラットフォームに合った ((バイナリが用意されているプラットフォームを見てニヤリとしてしまいますね。)) バイナリをダウンロードして、パスの通ったディレクトリに展開してください ((もちろんgo getしても構いません。)) 。筆者はOS X 64bit用のバイナリを~/binに展開しました。

クラウドストレージの設定

まずは利用するクラウドストレージにアクセスするための設定を行います。ちなみにrcloneはAmazon S3の他に、Google Cloud Storage、Googleドライブ、Dropbox、Swift、ローカルファイルシステムに対応しています。
設定ファイルは~/.rclone.confです。ここにテキストで設定をがしがし書けばよいのですが ((つまりこのファイルだけバックアップしておけばよいということですね。なお平文でアクセスキーが書かれているため、取り扱いには十分注意してください。)) 、簡単に設定を行うための対話的フロントエンドも用意されています。端末からrcloneコマンドの、configサブコマンドを実行してください。

$ rclone config

新しいリモート設定を追加しましょう。「n」を入力して、設定に任意の名前をつけます。

2015/07/30 18:42:35 Failed to load config file /Users/h-mizuno/.rclone.conf - using defaults
No remotes found - make a new one
n) New remote
q) Quit config
n/q> n             ← 新しいリモート設定を追加するので'n'を入力
name> s3           ← Amazon S3の設定なので名前を's3'とした

リモートのタイプを選択します。ここではS3の「2」を入力してください。

What type of source is it?
Choose a number from below
 1) swift
 2) s3
 3) local
 4) google cloud storage
 5) dropbox
 6) drive
type> 2            ← S3の設定なので、2番を選択

あらかじめIAMでユーザーを作成して、S3にアクセスできるポリシーをアタッチしておきましょう。ここではそのユーザーのアクセスキーとシークレットキーを入力します。

AWS Access Key ID.
access_key_id> XXXXXXXXXXXXXXXXXXXX        ← アクセスキーを入力
AWS Secret Access Key (password).
secret_access_key> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    ← シークレットキーを入力

次にAPI Endpointを選択します。東京リージョンを使いたいので「8」を入力しました。

Endpoint for S3 API.
Choose a number from below, or type in your own value
 * The default endpoint - a good choice if you are unsure.
 * US Region, Northern Virginia or Pacific Northwest.
 * Leave location constraint empty.
 1) https://s3.amazonaws.com/
 * US Region, Northern Virginia only.
 * Leave location constraint empty.
 2) https://s3-external-1.amazonaws.com
 * US West (Oregon) Region
 * Needs location constraint us-west-2.
 3) https://s3-us-west-2.amazonaws.com
 * US West (Northern California) Region
 * Needs location constraint us-west-1.
 4) https://s3-us-west-1.amazonaws.com
 * EU (Ireland) Region Region
 * Needs location constraint EU or eu-west-1.
 5) https://s3-eu-west-1.amazonaws.com
 * Asia Pacific (Singapore) Region
 * Needs location constraint ap-southeast-1.
 6) https://s3-ap-southeast-1.amazonaws.com
 * Asia Pacific (Sydney) Region
 * Needs location constraint .
 7) https://s3-ap-southeast-2.amazonaws.com
 * Asia Pacific (Tokyo) Region
 * Needs location constraint ap-northeast-1.
 8) https://s3-ap-northeast-1.amazonaws.com
 * South America (Sao Paulo) Region
 * Needs location constraint sa-east-1.
 9) https://s3-sa-east-1.amazonaws.com
endpoint> 8                             ← 東京リージョンを使うので8番を選択

Location constraintを選択します。東京リージョンを使うので、上記と同じ「8」を入力します。S3のEndpointとLocation constraintの制約についてはこちらを参照してください。

Location constraint - must be set to match the Endpoint.
Choose a number from below, or type in your own value
 * Empty for US Region, Northern Virginia or Pacific Northwest.
 1)
 * US West (Oregon) Region.
 2) us-west-2
 * US West (Northern California) Region.
 3) us-west-1
 * EU (Ireland) Region.
 4) eu-west-1
 * EU Region.
 5) EU
 * Asia Pacific (Singapore) Region.
 6) ap-southeast-1
 * Asia Pacific (Sydney) Region.
 7) ap-southeast-2
 * Asia Pacific (Tokyo) Region.
 8) ap-northeast-1
 * South America (Sao Paulo) Region.
 9) sa-east-1
location_constraint> 8                  ← 同上

内容を確認して、問題なければコミットして終了です。

Remote config
--------------------
[s3]
access_key_id = XXXXXXXXXXXXXXXXXXXX
secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
endpoint = https://s3-ap-northeast-1.amazonaws.com
location_constraint = ap-northeast-1
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y                               ← これでよければ'y'を入力
Current remotes:
Name                 Type
====                 ====
s3                   s3                ← 設定が追加された
e) Edit existing remote
n) New remote
d) Delete remote
q) Quit config
e/n/d/q> q                            ← 'q'を入力して終了

クラウドストレージを操作する

rcloneにはcopy、sync、ls、mkdir、rmdirといったサブコマンドが用意されています。Unixのコマンドラインの利用経験がある人であれば、名前を聞いただけで使い方は想像がつくと思いますし、おそらくその想像は正しいでしょう。各コマンドのより詳しい使い方についてはドキュメントを参照してください。

S3のオブジェクト一覧を表示する

lsサブコマンドでバケット内のオブジェクトの一覧が得られます。またlslサブコマンドはlsコマンドの-lオプションに似た挙動を示します。

$ rclone ls s3:(バケット名)
  3265435 hoge.jpg
  1394849 fuga.jpg
(...snip...)
$ rclone lsl s3:(バケット名)
  3265435 2012-08-16 18:01:27.000000000 hoge.jpg
  1394849 2012-05-11 01:06:43.000000000 fuga.jpg
(...snip...)

lsdサブコマンドはlsコマンドの-dオプションに似た挙動を示します。S3を相手にを使うと、バケットの一覧を得ることができます。

$ rclone lsd s3:
          -1 2015-06-24 04:06:17        -1 xxxxxx-xx-xxxxxx
          -1 2015-07-18 14:41:14        -1 xxxxxx-xx-xxxxxxx
          -1 2015-07-18 15:13:36        -1 xx.xxxxxx-xx.xxx
(...snip...)

ファイルをアップロードする

ファイルのアップロード(もしくはダウンロード)にはcopyサブコマンドを使います。cpコマンドと同じで一番目の引数がsource、二番目の引数がdestinationなので、迷うところはないでしょう。

$ rclone ./foo.jpg s3:(バケット名)
2015/07/31 12:04:32 S3 bucket xxxxxx-xx-xxxxxxx: Building file list
2015/07/31 12:04:32 S3 bucket xxxxxx-xx-xxxxxxx: Waiting for checks to finish
2015/07/31 12:04:32 S3 bucket xxxxxx-xx-xxxxxxx: Waiting for transfers to finish
Transferred:       636805 Bytes ( 359.45 kByte/s)
Errors:                 0
Checks:                 0
Transferred:            1
Elapsed time:  1.730086881s

ディレクトリを同期する

rsyncのように、ディレクトリ全体を同期するにはsyncサブコマンドを使います。syncはファイルのサイズ、タイムスタンプ、MD5チェックサムなどを確認し、変更があったファイルだけを転送します。この際、転送元で削除されているファイルはバケット上からも削除されます ((rsync –deleteと似た挙動です。)) ので注意してください。rsyncと同じことが言えますが、実際に同期する前に-nオプションと-vオプションを使い、DRY RUNしておくのがよいでしょう。
試しに$HOMEにあるPicturesフォルダーをS3に同期してみます。

$ rclone sync ~/Pictures s3:(バケット名)
2015/07/31 12:17:58 S3 bucket xxxxxx-xx-xxxxxxx: Building file list
2015/07/31 12:17:58 S3 bucket xxxxxx-xx-xxxxxxx: Waiting for checks to finish
2015/07/31 12:18:05 S3 bucket xxxxxx-xx-xxxxxxx: Waiting for transfers to finish
2015/07/31 12:18:06 Waiting for deletions to finish
Transferred:     53964045 Bytes (6019.05 kByte/s)
Errors:                 0
Checks:                 0
Transferred:           56
Elapsed time:  8.755409809s


このフォルダーの中身が

こんな感じに転送されました。

異なるクラウドストレージ間でのsync

ローカルとクラウド間の転送だけでなく、複数の異なるアカウントおよびサービス間での転送も可能なのがrcloneのメリットです。ここでは例としてGoogleドライブを追加して、S3からGoogleドライブに同期を行ってみましょう。
Googleドライブの設定の追加も、S3の時と基本的には同じです。認証の部分に少々差異がありますが、実際にconfigを実行してコメントを読めば理解できるでしょう。client_idとclient_secretは空欄のままで構いません。表示されたURLをブラウザから開き、入手したverification codeを入力するだけです。


mkdirサブコマンドで、Googleドライブ上にフォルダーを作成しておきます。

$ rclone mkdir google:photo


あとはsyncサブコマンドで、S3バケットから今作成したGoogleドライブ上のフォルダーへ同期をかけるだけです。

$ rclone sync s3:(バケット名) google:photo
2015/07/31 12:25:51 Google drive root 'photo': Building file list
2015/07/31 12:25:51 Google drive root 'photo': Waiting for checks to finish
2015/07/31 12:26:34 Google drive root 'photo': Waiting for transfers to finish
2015/07/31 12:26:39 Waiting for deletions to finish
Transferred:     53964045 Bytes (1082.38 kByte/s)
Errors:                 0
Checks:                 0
Transferred:           56
Elapsed time:  48.688520595s


無事に同期できたようです!

おわりに

rcloneは今回試しに使ってみたのですが、サーバーのバックアップをクラウドストレージに同期したい時、複数のクラウドストレージを使い分けなければならない時など、サービスごとの面倒な部分をうまく吸収してくれそうで、非常に好感触でした。
筆者はownCloudを自前でホストしていることもあり、S3やGoogleドライブはあまり使っていなかったのですが、これからはAWSとGoogleにお手軽に丸投げしちゃおうかな、なんて考えています。みなさんもいかがでしょうか?

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!