goofysを使ってAWSのEC2にS3バケットをマウントして、WordPressの画像置き場にする(kusanagi環境)

S3はストレージ利用だけでなく、Webから呼び出すホスティング領域としても使えます。でもいちいちCLIやブラウザからファイルをアップしなくてはいけない、となると面倒ですね。
今回は、以下のことを実現するために、EC2のサーバからS3をマウントして、Linux上で通常のディレクトリと同様に運用する環境を構築しました。

↓やりたいこと↓

WordPressを冗長化して、画像のアップロードディレクトリをs3にする

WordPressのサイトを2台構成にするにあたって、アップロードした画像をどうするか、DBをどうするか、という問題があります。このうち、「DBはRDSを使う」で解決できるんですが、画像をどうするか、と。rsyncするとかlsyncするという手もありますが、画像のバックアップ性や費用のことを考えると、S3を画像置き場にするというのが魅力的。

1.goとfuseをインストールする

goofysが使うものなのでインストールします。

$ sudo yum install golang fuse

2.AWS CLIの設定

AWSのcredentials設定をします。

$ aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]:

2.goofysをインストールする

まずPATHを作成する。好きなとこでいいです。

$ export GOPATH=$HOME/go
$ echo $GOPATH
/usr/local/dacelo/go

GOROOTも設定する、という手順もネットでは見かけますが、指定しなければデフォルトのPATHが使われるんで特にしなくていいです。

そしてインストール。
https://github.com/kahing/goofys
を見てみて、ちゃんとgoofysのgithubがあることを確認してください。

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

getもinstallも、「あれ?固まったかな?」と不安になるくらいの時間、戻ってきません。インストールが完了しても、プロンプトが戻ってくるだけで何もエコーがないので不安になりますが、きっと大丈夫。

3.バケットを作成する

好きな名前でバケットを作ります。コマンドラインで作っても、管理コンソールから作ってもどちらでもいいです。

$ aws s3 mb s3://dacelo-s3-mnt/
make_bucket: s3://dacelo-s3-mnt/

どっちで作るにしても、できたら、lsで確認しましょう。

$ aws s3 ls s3://dacelo-s3-mnt/

4.バケットをマウントする

今回は、/mnt/にマウントするべく、まず普通にディレクトリとして作ります。

$ mkdir -p /mnt/s3/dacelo-s3-mnt/

あとでWordPressが使うので、所有権をhttpdにしときます。(これはmount時に指定すれば、ここではなんでもいいのかも知れない。未検証)

$ sudo chown httpd:www /mnt/s3/dacelo-s3-mnt/

httpdのUID、GIDを調べてメモっておきます。

$ id httpd
uid=1001(httpd) gid=1001(www) groups=1001(www)

さあ、いよいよマウントします。さっきメモった、httpdのGIDとUIDをセットします。

広告

/usr/local/gps/go/bin/goofys dacelo-s3-mnt /mnt/s3/dacelo-s3-mnt/ -o allow_other,–uid=1001,–gid=1001

これでhttpd:wwwとしてマウントされます。

5.WordPressから画像をアップロードできるようにする。

$ ln -s /mnt/s3/dacelo-s3-mnt/uploads/ /home/kusanagi/dacelo/DocumentRoot/wp-content/uploads

これでWordPressから画像をアップロードすると、s3の中に[uploads]というディレクトリが作成され、中に画像が保存されていきます。やった!

6.再起動しても大丈夫なようにする

何らかの事情でサーバが再起動すると、マウントが外れてしまってエラいことになるので、fstabに登録しておきます。

以下を/etc/fstab の末尾に追記。

/usr/local/gps/go/bin/goofys#dacelo-s3-mnt /mnt/s3/dacelo-s3-mnt fuse _netdev,allow_other,–dir-mode=0755,–file-mode=0666,–uid=1001,–gid=1001 0 0

それから忘れちゃいけないのが、root用にもawsのcredentialsが必要ということ。
sudoで設定しようとするとrootのホームディレクトリにならないので、suしてからrootとして設定する。

$ sudo su –
# aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]:

入力する情報は同じです。

7.テストする

df -h すると、マウント状況が確認できます。

$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/xvda1 30G 5.3G 25G 18% /
devtmpfs 472M 0 472M 0% /dev
tmpfs 495M 0 495M 0% /dev/shm
tmpfs 495M 13M 482M 3% /run
tmpfs 495M 0 495M 0% /sys/fs/cgroup
dacelo-s3-mnt 1.0P 0 1.0P 0% /mnt/s3/kids-img-mnt-root

1ペタか、凄ぇな。初めて見る単位。
サーバを再起動しても自動マウントされるかどうかも、試しておきましょう。

トラブルシューティング

2019/06/06 17:23:41.814913 main.FATAL Unable to mount file system, see syslog for details

こんなエラーが出てマウントに失敗したら、/var/log/messages を見ると詳細が出ています。

allow_other オプションが有効になってなかった

僕が遭遇した事例はこれ。どのユーザーからもアップできるように、allow_otherのオプションをつけてマウントしようとしたんですが。

/usr/local/gps/go/bin/goofys[29797]: main.FATAL Mounting file system: Mount: mount: running fusermount: exit status 1#012#012stderr:#012fusermount: option allow_other only allowed if ‘user_allow_other’ is set in /etc/fuse.conf

ということなので、/etc/fuse.confを修正します。

# mount_max = 1000
#user_allow_other

となっているので、2行目のコメントアウト#を外して有効化したらOKでした。。

About: dacelo


Leave a Reply

Your email address will not be published. Required fields are marked *