Last Updated on 2013年5月4日 by かんりにん
EC2インスタンスにS3のバケットをファイルシステムとしてマウントし、ファイル転送などを試してみる。
実際に使ってみた感じではmountコマンドと同様に利用でき、扱いやすそう。
-参考ページ:お世話になっております。
s3fs
作業docs
ためしに使ったEC2インスタンスがRHEL6系で、fuseが古かったのでs3fsも古いバージョンを使っている。
0)fuseインストール
# yum install fuse fuse-devel
1)事前準備
gcc-c++やら開発環境やら足りないものをインストール。
# yum install gcc-c++ curl-devel libxml2-devel
2)s3fsインストール
redhad6.*系のRPM版fuseは2.8.3、これに対してs3fsは1.19まではfuse-2.8.3でコンパイル可能、これより新しいの1.25以降はfuse-2.8.4を必要とするので要注意。
今回は検証のためfuse-2.8.3+s3fs-1.19の組み合わせで、とりあえず入れるだけ入れてみた。
$ cd /home/awsuser $ mkdir src $ cd src/ $ wget https://s3fs.googlecode.com/files/s3fs-1.19.tar.gz $ tar zxvf s3fs-1.19.tar.gz $ cd s3fs-1.19 $ ./configure $ make $ su -c "make install" # ll /usr/local/bin/s3fs -rwxr-xr-x 1 root root 1109284 3月 25 06:03 2013 /usr/local/bin/s3fs
3)環境設定
s3ストレージをマウントするためのAWSのアクセスキー、シークレットキーを記載するファイルを作成。/etc/passwd-s3fsというファイルを作成し、中にアクセスキーとシークレットキーを入力しておく。
※rootで作業。
$ su - # touch /etc/passwd-s3fs # vi /etc/passwd-s3fs
[編集内容]
{AWSAccessKeyId}:{AWSSecretKey}
アクセスキー、シークレットキーをセミコロンで区切ってそのまま記入しておく。
[記入例]
ABCDEFGHIJKLMNOPQ12345:AWSSECRETKEY123:abcde!"#$%&12345 ←こんなかんじ。
編集したら、パーミッションを600にしておく。
# chmod 600 /etc/passwd-s3fs
パーミッションの変更を忘れると、s3fs実行時に以下のメッセージが出て叱られる。
s3fs: credentials file /etc/passwd-s3fs should not have others permissions
ちなみにpasswd-s3fsファイルを作成し忘れた場合も同様に叱られる。
4)マウント
コマンド”s3fs”でマウントを実行。使い方はmountコマンドと同じ感じで。
[マウントポイント作成]
# mkdir -p /mnt/s3
[マウント実行]
# s3fs db-backup /mnt/s3 -o default_acl=public-read
[マウント確認]
# mount /dev/xvde1 on / type ext4 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) s3fs on /mnt/s3 type fuse.s3fs (rw,nosuid,nodev)
[マウント解除]
マウントを解除するときはfusermountを使用する。
# fusermount -zu /mnt/s3
[マウント解除を確認]
# mount /dev/xvde1 on / type ext4 (rw) none on /proc type proc (rw) none on /sys type sysfs (rw) none on /dev/pts type devpts (rw,gid=5,mode=620) none on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
マウントポイントが決まったら、/etc/fstabなどにブート時の自動マウントのための設定を書いてもOK。
5)ファイルを置いてみる
EC2インスタンス上からファイルをcp -aして置いてみる
# cp -a /home/awsuser/dbdump/20121109_dbbackup.tar.bz /mnt/s3/ # ls -al /mnt/s3/ 合計 7613 -rw-rw-r-- 1 awsuser awsuser 7795431 3月 25 06:21 2013 20121109_dbbackup.tar.bz
→問題なくファイルコピー完了。
AWS Management Consoleからも見てみると、コマンド上からアップしたファイルが見えている。成功!
6)注意事項:s3fsマウント時の権限問題
S3のバケットをs3fsでマウントすると、s3fsを実行したユーザーのみアクセスが許可され、それ以外のユーザーアクセスは禁止される、という仕様らしい。
解決策としては、オプション”allow_other”を使うとよいらしい。
-参考:お世話になっております!
s3fsのallow_otherオプションとurlオプションとfstab
普通にマウントした場合
rootでマウントした場合
# s3fs backup-db1-tokyo /mnt/s3-tokyo # ll /mnt/ 合計 0 drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-singapore drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-tokyo
と、このように普通にマウントポイントを見ることができるが
一般ユーザーでアクセスしようとすると…
# su - awsuser $ ll /mnt/ ls: cannot access /mnt/s3-singapore: 許可がありません ls: cannot access /mnt/s3-tokyo: 許可がありません 合計 0 d????????? ? ? ? ? ? s3-singapore d????????? ? ? ? ? ? s3-tokyo
→/mntから、いきなり許可なしとして怒られる。
/mnt以下のマウントポイントへのアクセスは、言わずもがな。
$ ls -al /mnt/s3-tokyo ls: cannot access /mnt/s3-tokyo: 許可がありません
ということで、オプション”allow_other”を使ってみる。
コマンド実行例
例によってrootアカウントでマウント。
# s3fs backup-db2-singapore /mnt/s3-singapore -o allow_other
マウント確認
# ll /mnt/ 合計 0 drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-singapore drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-tokyo
→マウントポイントのチェックは問題なし。
ここで一般ユーザーへsu -してみる。
# su - awsuser $ ll /mnt 合計 0 drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-singapore drwxrwxrwx 1 root root 0 12月 31 19:00 1969 s3-tokyo
→問題なくアクセスできた!
$ ll /mnt/s3-tokyo/ 合計 0
→フォルダ指定でもOK。ためしにファイルを置いてみて、問題なければ設定完了。