EC2にS3をマウントする

EC2にS3をマウントしたので、手順を記録します。


1) s3fs-fuseのダウンロード

gitからダウンロードしました。

$ sudo yum install git (gitが入っていない場合はインストール)

$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git


2) s3fs-fuseインストール準備

s3fs-fuseのインストールに必要なパッケージがない場合はインストールします。

以下のパッケージが足りなかったためインストールしました。

$ sudo yum install automake gcc-c++ fuse-devel openssl-devel libcurl-devel libxml2-devel


3) s3fs-fuseのインストール

s3fs-fuseをダウンロードした場所へ移動し、インストールしました。

$ cd s3fs-fuse/

$ ./autogen.sh

$ ./configure --prefix=/usr

$ make

$ sudo make install


4) マウントポイントの作成

今回は/usr/share/nginx/の下へs3というディレクトリを作成しました。

$ cd /usr/share/nginx/

$ mkdir s3


5) マウントに必要な情報を調べる

マウントを実行するためには以下の情報が必要です。

  • マウント先バケット名
  • マウントポイント
  • マウントポイントのuid
  • マウントポイントのgid
  • ロール名(EC2にアタッチされているS3アクセス用ロール)
  • エンドポイント(リージョン)

マウントポイントのユーザーはec2-user、グループはnginxとしたいため、それぞれのidを調べました。

$ id ec2-user

uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),…

$ id nginx

uid=996(nginx) gid=994(nginx) groups=994(nginx)


6) マウント

s3fsコマンドを実行します。

$ sudo s3fs <マウント先バケット> <マウントポイント> -o rw,allow_other,uid=1000,gid=994,iam_role=<S3へのロール>,endpoint=ap-northeast-1


7) 確認

$ df -h

$ ls <マウントポイント>

等で指定したS3バケットがマウントがされているか確認します。


---発生したトラブルと解決した方法---

トラブル1) s3fsコマンドを実行してもマウントされていない

s3fsコマンドを実行してもマウントされていない(コマンド実行時にエラーも出力されない)というトラブルが発生しました。

【原因】

読み込みと書き込み権限のみでロールを作成していましたが、マウント実行にはリスト権限も必要だったようです。

【解決方法】

マネジメントコンソールIAM⇒該当のロール(ポリシー)を選択しリスト権限を追加しました。

トラブル2) マウントポイントでlsやcatコマンドを実行するとエラーが表示される

マウントポイントのlsでエラー(No such file or directory)が表示されたり、ls -lでファイルの詳細を表示したときにパーミッションやユーザーなどの情報が???となっていたり、ファイルは存在するのにcatコマンドでファイルの中身が参照できないというトラブルが発生しました。

【原因】

ロールでバケットへのアクセス権限は設定していましたが、バケットの中身に対してのアクセス権限が設定されていなかったことが原因でした。

【解決方法】

ロール(ポリシー)のリソースへバケットの中身(バケット名/*)を追加で設定することで解決しました。

マネジメントコンソールIAM⇒該当ロールのポリシー選択⇒リソース⇒bucket項目へarn:aws:s3:::<バケット名>/*を追加しました。

トラブル3) /var/log/messagesへエラーメッセージ

こちらはマウントが失敗するわけではありませんが、トラブル1)の原因を探っているときに/var/log/messagesへ(Failed to connect region 'us-east-1'(default), so retry to connect region 'ap-northeast-1'.)というエラーメッセージが出力されているのを見つけ、原因を調べました。

【原因】

s3fsコマンド実行時にendpointの指定がないとデフォルトでus-east-1へ接続しにいくようです。

【解決方法】

マウント実行コマンドにendpoint=ap-northeast-1を追加することでエラーメッセージが表示されなくなりました。


8) 自動マウント設定

再起動したときに自動的にマウントされるように設定しました。

・/etc/rc.localへマウント実行コマンドの追加

$ sudo vi /etc/rc.local

最終行に以下追加

s3fs <マウント先バケット> <マウントポイント> -o rw,allow_other,uid=1000,gid=994,default_acl=public-read,iam_role=<S3へのロール>,endpoint=ap-northeast-1


・実行権限の付与

$ sudo ls -l /etc/rc.d/rc.local

-rw-r--r-- 1 root root 635 Feb 25 11:20 /etc/rc.d/rc.local

はじめはパーミッション644となっていましたが、744に変更しました。

$ sudo chmod 744 /etc/rc.d/rc.local

$ sudo ls -l /etc/rc.d/rc.local

-rwxr--r-- 1 root root 635 Feb 25 11:20 /etc/rc.d/rc.local


これで設定完了です。


参考にさせていただいたサイト

https://qiita.com/shicky1121/items/e19b50308c79e5a6081e

※掲載内容は、記事公開時点のものです。紹介されているサービス内容は変更される場合がありますので、ご利用の際は事前にサービス提供元等をご確認ください。

銀座ITラボ | FirebaseやAWSに関する技術情報を配信中

銀座ITラボは、iOS/Androidアプリなどのスマホアプリ、Firebase、AWSなどのクラウドサービス、Webシステム等の技術情報に関する記事を紹介するシンプルメーカーのオウンドメディアです。