フリーキーズ | 独学プログラミング

rcloneを使ってCloudflare R2オブジェクトを同期させる

最終更新日

最近、Google Cloud StorageやAWS S3よりもCloudflare R2(以下、R2)を自社のプロジェクトで採用することが増えました。
やはりCDNとして確固たる地位を築いたCloudflareが提供するクラウドストレージということで、期待値が大きいからです。

このコンテンツでは、R2へファイルをバックアップなどの目的で同期させたいときに使えるrcloneについて紹介します。

rcloneとは

rcloneは、簡単に説明するとscprsyncの強化版です。以下のような特徴があります。

  • クラウドストレージ含む多くのファイルストレージに対応
  • サブコマンドがとても多く、様々なニーズに対応可能(差分取れるのが便利)
  • ローカルディレクトリにマウントできるのでfuseのようにも使える
  • 実はGUIもある(rclone rcd --rc-web-gui

rcloneインストール

今回はM1 Macにインストールしていきます。
公式サイトでは、zipでも提供していますが、インストールスクリプトをダウンロードして実行していきます。

sudo -v ; curl https://rclone.org/install.sh | sudo bash
$ sudo -v ; curl https://rclone.org/install.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4707  100  4707    0     0   5181      0 --:--:-- --:--:-- --:--:--  5195
Archive:  rclone-current-osx-arm64.zip
   creating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/git-log.txt  [text]
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/rclone  [binary]
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/rclone.1  [text]
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/README.html  [text]
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.64.2-osx-arm64/README.txt  [text]

rclone v1.64.2 has successfully installed.
Now run "rclone config" for setup. Check https://rclone.org/docs/ for more details.

インストールが成功したので、実行できるか確認します。

$ rclone version
rclone v1.64.2
- os/version: darwin 13.6 (64 bit)
- os/kernel: 22.6.0 (arm64)
- os/type: darwin
- os/arch: arm64 (ARMv8 compatible)
- go/version: go1.21.3
- go/linking: dynamic
- go/tags: cmount

rcloneのR2用設定

まず、事前準備としてCloudflareへログインしてR2の画面へ行きます。
R2の画面にManage R2 API Tokensというリンクがあるので、そこへ移動しましょう。続いて、Create API Tokenを押下します。

R2画面①

R2画面①

API Tokenの設定画面に移ったら、任意の名称をつけ、権限とTTL(+オプションでIP制限)を設定します。

R2画面②

R2画面②

R2画面③

R2画面③

すべてが終わったら以下のようにTokenやAccess Keyが入手できます。

R2画面④

R2画面④

rcloneの初期設定

上記の事前準備が完了したら、rcloneを設定していきましょう。通常であれば、rclone configコマンドから設定していくのですが、今回はR2用の設定ファイルを作っていきましょう。

~/.config/rclone/rclone.confファイルを作成して、以下のように書きます。

[r2demo]
type = s3
provider = Cloudflare
access_key_id = [ここにAccess Key]
secret_access_key = [ここにSecret Access Key]
endpoint = https://[ここに自身のCloudflare Account ID].r2.cloudflarestorage.com
acl = private

設定ファイルを作成したら、以下のコマンドで確認しましょう。

rclone config file

以下のように出れば成功です。

$ rclone config file
Configuration file is stored at:
/Users/xxxx/.config/rclone/rclone.conf

rcloneを使ってみる

あらかじめdemo-bucketという名称でバケットを作成している前提で進めます。
以下のコマンドを打ってみましょう。

rclone tree r2demo:

このようにすると、自身のアカウントのすべてのバケットと、その配下にあるファイル一覧が表示されます。
最後のコロンを忘れないように注意してください。(ローカルディレクトリとして認識されてしまいます)

バケットを指定する場合は以下です。

rclone tree r2demo:demo-bucket

何も入っていないバケットだと以下のように表示されます。

$ rclone tree r2demo:demo-bucket
/

0 directories, 0 files

特定のディレクトリの中身をすべてアップロードするには以下のコマンドを実行します。

rclone copy [アップロードするディレクトリ] r2demo:demo-bucket

今回は以下のディレクトリを同期します。

$ tree
.
└── demodir
    └── demodir2
        ├── test1.webp
        └── test2.webp

アップロードが完了すると、一覧は以下のように表示され、R2へアップロードされていることが確認できます。

$ rclone tree r2demo:demo-bucket
/
└── demodir
    └── demodir2
        ├── test1.webp
        └── test2.webp

2 directories, 2 files

なお、この後に新しいファイルを含めてアップロードしても、既存オブジェクトのModified(更新日時)は変更されません。変更された内容のみがアップロードされます。

rcloneはscp, rsyncの強化版

従来、ファイルを転送する場合はscprsyncコマンドを使ってきました。SFTPソフトやawscligsutilといったIaaS特有のコマンドの場合もあります。
rcloneは多くのクラウドストレージに対応している上に、rsyncのような差分対応やディレクトリへ直接マウントも可能です。

かなり優秀なOSSなので、クラウドストレージを多用する人はぜひ導入してみてください。