rcloneを利用したストレージサービスBoxへの継続的な同期方法

はじめに

こんにちは、CCIのkssです。

社内のファイルサーバよりAWS上にあるシステムへファイルの連携を行っておりました。 ファイルサーバのリプレースにともないBoxへ移行することになりました。
そのためファイルの連携を見直す必要となりました。

その際にrcloneを使い、Boxとのシステムとのファイル連携を実施した際の話となります。

Box CLI

はじめはBoxCLIにて、実装を考えてました。 検証を行ったところ、ファイル数が多い場合時間が掛かってしまうことがわかりました。 約2,000ファイル、33GBのファイルをダウンロードするのに約127分掛かりました。

BoxCLI には、同期機能が無かったため、ダウンロード後に差分チェックなどを行う実施する必要がありそうでした。 そのため別の手段として「rclone」を利用しました。

rclone とは

BoxやS3などのクラウドストレージ上のファイルを管理するためのCLI ツールです。

Rclone is a command-line program to manage files on cloud storage. It is a feature-rich alternative to cloud vendors' web storage interfaces. Over 40 cloud storage products support rclone including S3 object stores, business & consumer file storage services, as well as standard transfer protocols. https://rclone.org/

rclone インストール

インストールについては、yumインストールで行っております。

sudo yum install rclone

Box 認証情報

Boxのアプリや認証方法については公式のドキュメントをご確認下さい。 https://ja.developer.box.com/guides/authentication/client-credentials/

今回はカスタマアプリのクライアント資格情報許可を利用して作業を行いました。 クライアントIDとクライアントシークレットを利用します。また、アクセストークンを発行するためにbox_subject_id(Enterprise ID)が必要になりますのでメモしておきます。 box_subject_idは、Box開発者コンソールから確認出来ます。

rlcone を利用する際にはBoxのアクセストークン発行。

curl -i -X POST "https://api.box.com/oauth2/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "client_id=[CLIENT_ID]" \
     -d "client_secret=[CLIENT_SECRET]" \
     -d "grant_type=client_credentials" \
     -d "box_subject_type=enterprise"  \
     -d "box_subject_id=[ENTERPRISE_ID]"

https://ja.developer.box.com/guides/authentication/client-credentials/

rclone 認証

rclone 認証情報の対話形式で登録していきます。

rclone config
name> box-remote
Storage> box
client_id> [CLIENT_SECRET]
client_secret> [CLIENT_SECRET]
box_config_file>
access_token> [ACCESS TOKEN]
box_sub_type> user
n) No (default)
y) Yes this is OK (default)

認証情報はデフォルトではユーザ毎に以下のフォルダに格納されます。 ~/.config/rclone/rclone.conf

Box 同期

rclone コマンドのsycn を使って同期を行いました。 コマンドhttps://rclone.org/commands/rclone_sync/

rclone sync source:path dest:path

オプション
--create-empty-src-dirs:同期時に空のソース ディレクトリを作成する
--progress:リアルタイムの転送状況を表示する

実際にBox から EC2へ同期を行い、実行時間の確認

rclone sync box-remote:/folder /home/ec2-user/box-sync/ --progress --create-empty-src-dirs
Transferred:       33.400 GiB / 33.400 GiB, 100%, 9.664 MiB/s, ETA 0s
Transferred:         1959 / 1959, 100%
Elapsed time:     26m34.7s

33GBのファイルが26分で初回同期することが出来ました。 また、差分同期については、約9分で完了しました。

最後に

日次にて同期処理を行うため、バッチを作成しcronにて同期を行いました。

BoxでのAPI利用については契約プランによって月当たりのAPIコール数が決まってますので、 rclone などを使ってBoxのAPIを利用する場合はお気をつけ下さい。