Rcloneでs3をローカルPCにマウントしてみる

2022.05.10

ローカルファイルシステム上にクラウドストレージをマウントしてゴニョゴニョしてみたいと思い調べていたところ、Rcloneというツールを発見したので試してみます。

Rcloneはコマンドラインのプログラムとして提供されており(Goで記述された成熟したオープンソースソフトウェア)、クラウドストレージ上のファイルを管理することが可能です。

Rcloneは、UNIXコマンドのrsync、cp、mv、mount、ls、ncdu、tree、rm、catに相当する強力なクラウドコマンドを備えています。

リンクに示す特徴があり、

ファイルをクラウドストレージにバックアップする、クラウドストレージからファイルを復元する、多様なクラウドストレージをディスクとしてマウントする、ローカルからクラウドに、クラウドから別のクラウドにデータを移行する といったケースで使えそうですね。

サポートされているプロバイダーも多いです。

今回はRcloneをインストールして簡単なファイル操作を行なってみようと思います。

インストール

クイックインストール

Rcloneは単一のバイナリファイルとして提供されてます。

ダウンロードページからインストールするOSに対応するものをダウンロードします。

zipアーカイブがダウンロードされるので、選択した場所に抽出するだけです.

スクリプトを利用したインストール

Linux / macOS / BSDシステムでは、以下のコマンドを使用してインストールすることもできます

curl https://rclone.org/install.sh | sudo bash

brewによるmacOSのインストール

macOSでは、

brew install rclone

でもインストールできますが、mountがサポートされていないとのことです。 macOSでmountを使用する場合は、プリコンパイルされたバイナリをインストールするか、ソースからインストールする際に関連するオプションを有効にしてください。

curlを使用した、プリコンパイルされたバイナリからのインストール

プリコンパイルされたバイナリからインストールすることもできます。

リストは以下

https://rclone.org/downloads/#downloads-for-scripting

curl -O https://downloads.rclone.org/rclone-current-<<OS>>.zip
unzip rclone-current-<<OS>>.zip
cd rclone-*-<<OS>>
sudo mkdir -p /usr/local/bin
sudo mv rclone /usr/local/bin/

インストールできたかどうかは、

rclone -h

を実行して確認しました。

セットアップ

クラウドストレージ上のファイルを管理するためのコマンドラインプログラムであるので、それぞれのストレージに沿ったrcloneを構成する必要があります。

rclone config

を実行することで、対話型の構成セッションを起動することができます。

今回はAmazon S3を試してみたいと思います。

Amazon S3

ドキュメント: https://rclone.org/s3/#configuration

rclone configで対話型の構成セッションを起動します。

構成プロセスに関してはドキュメントを参照してその通りに進めていきましょう。

設定例

新規の接続を作成するので、nを入力します。

リモートにアクセスするための名前を入力します。

$ rclone config

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

name> s3

ストレージタイプの選択。 s3を入力します。

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon Drive
   \ (amazon cloud drive)
 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, RackCorp, SeaweedFS, and Tencent COS
   \ (s3)
~~~~
省略
~~~~
Storage> s3

プロバイダーの選択。 1を入力します。

Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Amazon Web Services (AWS) S3
   \ (AWS)
~~~~
省略
~~~~
provider>1

S3にアクセスするための権限設定を行います。 1だとシークレットキーとアクセスキーを入力します。 2だと環境設定から読み込むようです。

今回は1で試してみました。

Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
 1 / Enter AWS credentials in the next step.
   \ (false)
 2 / Get AWS credentials from the environment (env vars or IAM).
   \ (true)
env_auth>1

env_authで1を選択したので、S3にアクセスする権限を持つシークレットキーとアクセスキーを入力します

Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id> {アクセスキーを入力}
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key> {シークレットアクセスキーを入力}

AWSのリージョンを入力します。 今回は東京リージョンで試してみます。

Option region.
Region to connect to.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
   / The default endpoint - a good choice if you are unsure.
 1 | US Region, Northern Virginia, or Pacific Northwest.
   | Leave location constraint empty.
   \ (us-east-1)
~~~~
省略
~~~~
region> 14

s3エンドポイントを使用する場合は入力します。

Option endpoint.
Endpoint for S3 API.
Leave blank if using AWS to use the default endpoint for the region.
Enter a value. Press Enter to leave empty.
endpoint>

位置の制約を入力します(リージョンに一致) バケットを作成するときのみ使用する。 下記から数字を選ぶか、独自の値を入力する。

Option location_constraint.
Location constraint - must be set to match the Region.
Used when creating buckets only.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Empty for US Region, Northern Virginia, or Pacific Northwest
   \ ()
 2 / US East (Ohio) Region
   \ (us-east-2)
~~~~
省略
~~~~
location_constraint>14

バケットを作成し、オブジェクトを保存・コピーする際に使用される定型ACLを入力します。

canned-aclについて

今回はプライベートの1を入力します。

Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
   / Owner gets FULL_CONTROL.
 1 | No one else has access rights (default).
   \ (private)
   / Owner gets FULL_CONTROL.
 2 | The AllUsers group gets READ access.
   \ (public-read)
   / Owner gets FULL_CONTROL.
 3 | The AllUsers group gets READ and WRITE access.
   | Granting this on a bucket is generally not recommended.
   \ (public-read-write)
   / Owner gets FULL_CONTROL.
 4 | The AuthenticatedUsers group gets READ access.
   \ (authenticated-read)
   / Object owner gets FULL_CONTROL.
 5 | Bucket owner gets READ access.
   | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ (bucket-owner-read)
   / Both the object owner and the bucket owner get FULL_CONTROL over the object.
 6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ (bucket-owner-full-control)
acl>1

S3にオブジェクトを保存するときに使用されるサーバー側の暗号化アルゴリズムを入力します。

Option server_side_encryption.
The server-side encryption algorithm used when storing this object in S3.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / None
   \ ()
 2 / AES256
   \ (AES256)
 3 / aws:kms
   \ (aws:kms)
server_side_encryption>1

KMS IDを使用する場合は、KeyのARNを入力する必要があります

Option sse_kms_key_id.
If using KMS ID you must provide the ARN of Key.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / None
   \ ()
 2 / arn:aws:kms:*
   \ (arn:aws:kms:us-east-1:*)
sse_kms_key_id>

S3に新しいオブジェクトを格納するときに使用するストレージクラスを入力します。

Option storage_class.
The storage class to use when storing new objects in S3.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Default
   \ ()
 2 / Standard storage class
   \ (STANDARD)
 3 / Reduced redundancy storage class
   \ (REDUCED_REDUNDANCY)
 4 / Standard Infrequent Access storage class
   \ (STANDARD_IA)
 5 / One Zone Infrequent Access storage class
   \ (ONEZONE_IA)
 6 / Glacier storage class
   \ (GLACIER)
 7 / Glacier Deep Archive storage class
   \ (DEEP_ARCHIVE)
 8 / Intelligent-Tiering storage class
   \ (INTELLIGENT_TIERING)
 9 / Glacier Instant Retrieval storage class
   \ (GLACIER_IR)
storage_class>1

その他の拡張設定を行う場合はyを入力します。

Edit advanced config?
y) Yes
n) No (default)
y/n>n

完了後、以下のように設定した内容が表示されるので、OKならyを押して保存します。

--------------------
[s3]
type = s3
provider = AWS
access_key_id = 入力したアクセスキー
secret_access_key = 入力したシークレットアクセスキー
region = ap-northeast-1
location_constraint = ap-northeast-1
acl = private
bucket_acl = private
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote

コマンドを試す

設定が終わったので、実際にコマンドを実行してファイルの操作を行なってみようと思います。

全てのコマンドを確認するには、以下を参照して試してみましょう。

subcommands

パス内のすべてのディレクトリ/コンテナ/バケットを一覧表示

rclone lsd

$ rclone lsd <<設定したリモートストレージの名前>>:
          -1 2019-10-15 09:18:10        -1 <<バケット名>>
          -1 2019-12-12 15:07:02        -1 <<バケット名>>
         〜〜〜〜
                  〜〜〜〜
                  〜〜〜〜

バケット名のリストが返ってきます。

パス内のオブジェクトをサイズとパスでリストアップします

rclone ls

$ rclone ls <<設定したリモートストレージの名前>>:<<バケット名>>
                  〜〜〜〜
                  〜〜〜〜
                  〜〜〜〜
     1539 trello/projectid=5e72ff1d969171079d1a9e7c/year=2021/month=6/day=1/1622534078.000484.json
    63042 webhook.zip
    63042 アーカイブ.zip

<<設定したリモートストレージの名前>>:<<バケット名>> で指定したバケットに格納されているオブジェクト一覧が確認できます。

$ rclone ls <<設定したリモートストレージの名前>>:<<バケット名>>/1_ELwZ6txgMYAPQb_rvMGIkA.png
    61403 1_ELwZ6txgMYAPQb_rvMGIkA.png

のように、オブジェクトのパスを指定することもできます。

バケットを作成

rclone mkdir

rclone mkdir <<設定したリモートストレージの名前>>:<<新しいバケット名>>

リモートにファイルをコピー

rclone copy

rclone copy source:sourcepath <<設定したリモートストレージの名前>>:<<バケット名>>/<<prefix>>

でファイルをコピーできます。

ファイル参照

任意のファイルを連結し、標準出力に送信してくれます。

rclone cat

rclone cat <<設定したリモートストレージの名前>>:<<バケット名>>/<<prefix>>

dirとそのサブディレクトリにあるすべての.txtファイルを出力するには、次のようにします

rclone --include "*.txt" cat remote:path/to/dir

マウントしてみる

rcloneのセットアップ後、いくつかのコマンドが動作することを確認できたので、今回のやりたいことのメインであるマウントを試します。

端末はmacOSでやってみます。

Windowsの場合は、以下を参照してください。

Windowsのマウントモード

macFUSEのインストール

macOSでマウントをする場合、macFUSEが必要だったのでインストールしました。

※ macFUSEはmacOSのネイティブなファイル操作機能を拡張する

マウントの実行

rclone mount

ドキュメントによると、FUSE(Filesystem in Userspace)を使用したファイルシステムとしてマウントできるようです。

Filesystem in Userspace はUnix系コンピュータオペレーティングシステム用のソフトウェアインタフェースである。権限を持たないユーザがカーネルコードを修正することなく独自のファイルシステムを作成できる機能を提供する。 (ウィキペディア)

デフォルトではフォアグランドで実行されますが、--daemonオプションをつけるとバックグラウンドモードで実行されます。

※ Windowsでは、マウントはフォアグラウンドでのみ実行でき、フラグは無視されます。

では、実際にやってみます。

まず、ローカルのPCにマウントする空のディレクトリを作成します

$ mkdir << /path/to/local/mount >>

その後、

rclone mount <<設定したリモートストレージの名前>>:<<バケット名>> << /path/to/local/mount >> --daemon

を実行してみます。

バックグラウンドモードで実行したので、実際にマウントされているか確認してみました。

ls -la << /path/to/local/mount >>

を実行して、S3に保存しているオブジェクトの一覧が参照されているか確認します。

※ 実際のキャプチャ

ファイルの操作

ファイルの追加を行ってみました。

$ vi << /path/to/local/mount >>/test.txt

でファイルを保存します。

$ rclone ls <<設定したリモートストレージの名前>>:<<バケット名>>/test.txt
       12 test.txt

でリモートのS3にファイルがあることを確認します。

マウントの停止

バックグラウンドモードで実行した場合、マウントの停止は手動で行います。

※ バックグラウンドモードの場合、rcloneは一般的なUnixマウントプログラムとして機能

# Linux
fusermount -u /path/to/local/mount
# OS X
umount /path/to/local/mount

現状、ローカルPCにあるファイルのバックアップで使ってみようかなと考えています。

このほかにもさまざまなコマンドやオプションがあるので、今後色々と試していきたい。