目次

goofysを使うかLaravelのライブラリで対応するか

そんな中、S3FS と同じように、S3 をマウントできる goofys というものがあることを知りました。

実際に導入実績もあるということで、今回はそれを採用しようということで半ば決定となりました。

アプリ側は Laravel のフレームワークを使うので、今回は filesystem パッケージを利用したファイルストレージライブラリを採用して、ローカルと S3 を切り替えようと思っていましたが、マウントできるのであれば、その辺も意識はしなくてもよくなります。

Laravel 5.4 ファイルストレージ

goofysのインストール手順

goofys は初めて聞く名前でしたが、1 年以上前に既に流行がきていたようで、手順書的なものはいくつかのサイトで紹介されていました。

現在の AmazonLinux でも大きく変わらないと思いますが、最新バージョンを使ってインストールとマウントを試してみたいと思います。

当然、goofys の GitHub 上の README.md を見るのが確実です。

kahing/goofys

そう言えば、go で動くアプリを実際にインストールするのは初めての経験かもしれません。周りでは使っている人も何人かいて、オススメはよくされるのですけどね。

$ yum install golang fuse

fuse  : 2.9.4-1.17
golang: 1.7.5-2.39

冒頭でも話題に出した AWS CLI の設定がここで必要となるのですが、AWS の IAM Role を使って接続の設定も可能です。こちらは、お好きな方を採用してください。

IAM Role で参考になるのは下記のサイトです。

s3fsよりも高速に使えるgoofysを試してみた

では、AWS CLI の設定をします。もちろん、ここまでに S3 に接続するための IMA ユーザーの作成をして、「Access key ID」と「Secret access key」は取得しておいてください。

バケットも先に作っておいて問題ありません。

では、AWS CLI の設定をします。IAM Role は今回は使いません。

$ aws configure

AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットキー]
Default region name [None]: ap-northeast-1 ※東京リージョン
Default output format [None]: 

バケットへの接続確認をします。何も置いていなければ結果はないですし、何かファイルを置いていたら直下のファイルの一覧が表示されます。

$ aws s3 ls s3://[バケット名]

ようやく、goofys のインストールに入ります。パッケージをダウンロードしようとしたら、GOPATH の環境変数を設定しろとのことだったので設定します。

$ go get github.com/kahing/goofys

package github.com/kahing/goofys: cannot download, $GOPATH not set. For more details see: go help gopath

which go をコマンド実行すると go コマンドのパスが返ってくるのになっと思っていたら、goofys のインストール先のことだったのですね・・・。

$ export GOPATH=/root/tmp/go

$ echo $GOPATH

/root/tmp/go

再度チャレンジです。

$ go get github.com/kahing/goofys

# github.com/kahing/goofys/internal
tmp/go/src/github.com/kahing/goofys/internal/handles.go:450: undefined: url.PathUnescape

あれっ、エラーが出た。go のバージョンは 1.7.5 です。

$ go version

go version go1.7.5 linux/amd64

go をソースから入れた方が良かったのかな。ってことで、CentOS や RHEL 向けの手順で golang を入れ直します。

How to Install Go 1.8 on Fedora 26/25/24 & CentOS/RHEL 7/6

$ yum remove golang

$ wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz

$ tar -xzf go1.8.3.linux-amd64.tar.gz

$ mv go /usr/local

$ vi .bash_profile

export GOROOT=/usr/local/go
export GOPATH=/root/tmp/go
PATH=$PATH:$HOME/bin:$GOPATH/bin:$GOROOT/bin

$ source .bash_profile 

$ go version

go version go1.8.3 linux/amd64

では、気を取り直して goofys のインストールです。何も標準出力されないので、インストールできたのか不安ですが・・・。

$ go get github.com/kahing/goofys

$ go install github.com/kahing/goofys

早速、マウントしてみます。成功しても何も標準出力されないので、df コマンドで確認します。

# マウントポイントの作成
$ mkdir -p /tmp/cdn                                                                              

# goofysインストール時に設定したパスでマウント実行
$ /root/tmp/go/bin/goofys --region ap-northeast-1 [バケット名] /tmp/cdn

$ df

Filesystem 1K-blocks Used Available Use% Mounted on

(途中省略)

[バケット名] 1099511627776 0 1099511627776 0% /tmp/cdn

試しに、images というディレクトリを作成し、aws s3 コマンドから確認してみます。

$ mkdir /tmp/cdn/images

$ aws s3 ls s3://[バケット名]

PRE images/

あとは、EC2 のインスタンスや OS 再起動時にも自動的にマウントされることを確認できたら OK ですね。

goofysでマウントした設定を自動マウントする

この時点では、/etc/fstab に何も設定していないので、OS 再起動のタイミングでマウントされていない状態になります。

よって、/etc/fstab に goofys のマウント設定をします。

また、Web アプリからファイルアップロードをさせたい場合もあると思いますので、apache や nginx の実行ユーザを主体にパーミッション設定してもいいと思います。

下記の例では、ec2-user とは別に作成したユーザ(uid=501, gid=501)で、作成されるディレクトリが 777、ファイルが 666、また、その他ユーザにもファイルの参照や書き込みを許可しています。

$ vi /etc/fstab

/root/tmp/go/bin/goofys#[バケット名] /tmp/cdn fuse _netdev,allow_other,--dir-mode=0777,--file-mode=0666,--uid=501,--gid=501 0 0

手動でアンマウントとマウントを実際にやっておけば、EC2 のインスタンス再起動時もほぼほぼ大丈夫だと思います。

$ unmount /tmp/cdn

$ mount -a

Tips記事一覧

新着記事一覧です。

関連記事一覧

「AWSのEC2にgoofysを入れてS3をマウントする」に関連した記事一覧です。