見出し画像

「楽天クラウド オブジェクトストレージ」をファイルシステムとして直接マウントしてみた。

朴 建一
クラウドプラットフォーム技術部 クラウド基盤運用グループ

オブジェクトストレージのマウントツール

「楽天クラウド オブジェクトストレージ」は低価格、無制限で使えるデータ保全性に優れたサービスです。
次のようなインターフェースに対応しています。
・API(HTTPS)
・GUI:オブジェクトストレージポータル

オブジェクトストレージでは、データの読み書きをHTTP(RestAPI)ベースで行います。
アプリケーションからデータを読み書きする場合は、SDKを利用することも可能ですが、S3バケットをOSにマウントして使用することも期待されています。

画像1

今回はマウントツールに有名なs3fsと、GOLANGで開発されたgoofys、この2つのOpensourceを使い「楽天クラウド オブジェクトストレージ」を「楽天クラウドRed Hat OpenStack Platform」環境のインスタンス(仮想サーバー)上にマウントし、サーバーのディスクとして活用する方法をご紹介します。

環境

画像2

セキュリティキー証明書確認

「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
https://console.objectstorage.rakuten-cloud.net/
右上のUserID部分から、「セキュリティ証明書」をクリックします。

画像3

表示される画面より「アクセスキーID」と「シークレットキー」を確認しメモしておいてください。

s3fsの紹介

s3fs はFUSE(Filesystem in Userspace)(※)を利用してS3のバケットを Linux または Mac OS X 上にマウントさせるツールです
・s3fs-fuse/s3fs-fuse · GitHub: https://github.com/s3fs-fuse/s3fs-fuse

「楽天クラウド オブジェクトストレージ」をファイルシステムとして使うことができ、S3 APIを利用しなくてもファイルの入出力ができます。

※FUSE(Filesystem in Userspace)
Unix系コンピュータオペレーティングシステム用のソフトウェアインタフェースである。権限を持たないユーザーがカーネルコードを修正することなく独自のファイルシステムを作成できる機能を提供する。これは、ファイルシステムのコードをユーザー空間で実行することでなされるもので、その際FUSEモジュールは実際のカーネルインタフェースへの「橋渡し」しか提供しない。(参考:ウィキペディア - Filesystem in Userspace)

s3fsのインストール

必要パッケージをインストールします。

# yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

s3fsをインストールします。

# yum install epel-release
# yum install s3fs-fuse

Version確認します。

# s3fs --version
Amazon Simple Storage Service File System V1.87 (commit:unknown) with OpenSSL
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

まず、S3への接続に利用するパスワードファイルを作成します。

# echo "[access_key]:[secret_access_key]" > /etc/passwd-s3fs
# chmod 600 /etc/passwd-s3fs

※[access_key]:[secret_access_key]は上記「セキュリティ証明書」を参照します。

マウントするディレクトリを作成します。

# mkdir -p /s3fs

S3バケットを作成します。
「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
「新規バケット追加」をクリックし、例:「s3fs-bucket」と入力し、「作成」をクリックします。

画像4

マウントします。

# s3fs bucket[:/path] mountpoint [options]

↓記入例

# s3fs s3fs-bucket /s3fs -o allow_other,url=https://s3.jp3.objectstorage.rakuten-cloud.net,endpoint=jp3,passwd_file=/etc/passwd-s3fs

マウント確認

# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
s3fs           fuse.s3fs  256T     0  256T   0% /s3fs

アンマウントします。

# umount /s3fs

OS起動時に自動マウントするため、/etc/fstabにエントリを追加します。

# vi /etc/fstab
s3fs#[bucket_name] [mountpass] fuse nonempty,allow_other,url=[endpoint],endpoint=[region],passwd_file=[上記作成したパスワードファイル] 0 0

↓追記例

s3fs#s3fs-bucket /s3fs fuse nonempty,allow_other,url=https://s3.jp3.objectstorage.rakuten-cloud.net,endpoint=jp3,passwd_file=/etc/passwd-s3fs 0 0

# mount -a

オプションの説明

画像5

マウントを確認します。

# df -Th	
Filesystem     Type       Size  Used Avail Use% Mounted on
…
s3fs           fuse.s3fs  256T     0  256T   0% /s3fs
…

テストファイルを作成します。

touch s3fs_test.txtll
total 0
-rw-rw-rw- 1 root root 0 Nov 02 12:24 s3fs_test.txt

「楽天クラウド オブジェクトストレージ」ポータルからファイルの作成を確認します。

画像6

s3fs動作確認

ファイル作成します。

# cd /s3fs
# i=1; time while [ $i -le 500 ]
> do
> touch s3fs_test_$i > /dev/null 2>&1
> i=$((i+1))
> done
real    0m36.314s
user    0m0.634s
sys     0m1.341s

ファイル一覧表示します。

# time ls -laR /s3fs > /dev/null
real    0m0.115s
user    0m0.005s
sys     0m0.019s

ddコマンドでファイル作成します。

# cd /s3fs
# dd if=/dev/zero of=ddtest bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 17.0114 s, 61.6 MB/s

CPコマンド実行し、1Gbファイルをローカルへダウンロードします。

# time cp /s3fs/ddtest /ddtest_s3fs_download > /dev/null
real    0m11.152s
user    0m0.037s
sys     0m1.535s

CPコマンド実行し、1Gbファイルをローカルからアップロードします。

# time cp /ddtest_s3fs_download /s3fs/ddtest_upload > /dev/null
real    0m15.713s
user    0m0.022s
sys     0m1.105s

これで動作確認は完了しました。

goofysの紹介

goofysではs3fsと同じく、「楽天クラウド オブジェクトストレージ」をファイルシステムとしてマウントすることができます。パフォーマンスを優先し、ディスク上のデータキャッシュ(checkout catfs)を持たない特徴があります。
また、s3fsよりもパフォーマンスが優れているとされていますが、ファイルコピーは早い一方で、ファイルの編集ができないなど、s3fsよりもPOSIX互換性は落ちるため、使用できるコマンドは少ないです。
・GitHub - kahing/goofys: a Filey System for Amazon S3 written in Go: https://github.com/kahing/goofys

goofysのインストール

まず、関連ツールをインストールします。

# yum install golang fuse git

go 環境設定を行います。
workspace作成

# mkdir -p /usr/local/golang

環境変数設定し反映

# vi ~/.bash_profile
以下を追記
export GOROOT=/usr/lib/golang
export GOBIN=$GOROOT/bin
export GOPATH=/usr/local/golang
export PATH=$PATH:$GOROOT/bin
# source ~/.bash_profile

変数確認

go env
GOBIN="/usr/lib/golang/bin"
GOPATH="/usr/local/golang"
GOROOT="/usr/lib/golang"

goofysインストール

go get github.com/kahing/goofys
# go install github.com/kahing/goofys 

マウントするディレクトリを作成します。

# mkdir -p /goofys

S3バケットを作成します。
「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
「新規バケット追加」をクリックし、例:「goofys-bucket」と入力し、「作成」をクリックします。

画像7

マウントします。

goofys [global options] bucket[:prefix] mountpoint

↓記入例

# /root/go/bin/goofys --endpoint https://s3.jp3.objectstorage.rakuten-cloud.net goofys-bucket /goofys

マウント確認

# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
goofys-bucket  fuse      1.0P     0  1.0P   0% /goofys

アンマウントします。

# umount /goofys

OS起動時に自動マウントするため、/etc/fstabにエントリを追加します。

# vi /etc/fstab
/root/go/bin/goofys #[bucket_name] [mountpass] fuse _netdev,allow_other,--file-mode=XXXX,--dir-mode=XXXX,--endpoint=[endpoint] 0 0
↓追記例
/root/go/bin/goofys#goofys-bucket /goofys fuse _netdev,allow_other,--file-mode=0666,--dir-mode=0777,--endpoint=https://s3.jp3.objectstorage.rakuten-cloud.net 0 0
# mount -a

オプションの説明

画像8

マウントを確認します。

Filesystem     Type       Size  Used Avail Use% Mounted on
…
20201014       fuse      1.0P     0  1.0P   0% /root/mount-goofys
…

テストファイルを作成します。

# touch /goofys/goofys_test.txt
# ll
total 0
-rw-rw-rw- 1 root root 0 Oct 30 15:03 goofys_test.txt

「楽天クラウド オブジェクトストレージ」ポータルからファイルの作成を確認します。

画像10

goofys動作確認

ファイル作成します。

# cd /goofys
# i=1; time while [ $i -le 500 ]
> do
> touch goofys_test_$i > /dev/null 2>&1
> i=$((i+1))
> done
real    0m10.370s
user    0m0.590s
sys     0m1.241s

ファイル一覧表示します。

# time ls -laR /goofys > /dev/null
real    0m0.123s
user    0m0.002s
sys     0m0.030s

ddコマンドでファイル作成します。

# cd /goofys
# dd if=/dev/zero of=ddtest bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 7.27981 s, 144 MB/s

CPコマンド実行し、1Gbファイルをローカルへダウンロードします。

# time cp /goofys/ddtest /ddtest_goofys_download > /dev/null
real    0m7.033s
user    0m0.039s
sys     0m1.637s

CPコマンド実行し、1Gbファイルをろーかるからアップロードします。 

# time cp /ddtest_goofys_download /goofys/ddtest_upload > /dev/null
real    0m0.979s
user    0m0.024s
sys     0m0.953s

これで動作確認は完了しました。

まとめ

今回はS3サービスマウントツールのs3fsとgoofysについてインストール・検証を実施しました。
インストールから検証まで複雑な設定などなく設定しやすかったと思います。
また、容量を気にせずファイルシステムとして使えることは驚きでした。
ただ、s3fsとgoofys、それぞれに特徴があるため、皆さんの環境に合う方を選択してみてください。
またDBのような頻繁にランダムアクセスが行われるケースには向かないので注意が必要です。
オブジェクトストレージをサーバにマウントして使用しようと検討中の方は是非参考にしていただけると嬉しいです。

楽天クラウド:https://cloud.rakuten.co.jp/


画像10

朴 建一
インフラエンジニアとして、サーバ設計・構築を担当しています。
10年以上、クラウドやLinux、Zabbixなどを主として職務しており、現在はRakutenオブジェクトストレージ構築担当として従事しています。
韓国のジェジュ島が故郷で海が好きで、泳ぐのが好きです。
永住者になり3人家族と一緒に日本の色んなものを楽しみにしています。
趣味:食べ物(ラーメン)、キャンプ、スキー、食べ物、旅行
スキ、ありがとうございます!
2
中のひとの日常や、お客様のデジタル・トランスフォーメーションのお役に立つかもしれない?情報を発信していきます。

こちらでもピックアップされています

楽天クラウド
楽天クラウド
  • 9本

楽天クラウドのエンジニアが書くテクニカルブログ。2週間に1回のペースで更新予定。