目的
EC2インスタンスをS3にマウントするソフトウェアであるGoofyの設定手順について解説します。
前提
この手順を実施する前に以下条件が整っていることを確認します。
- EC2: Amazon Linux 2をAMIとしたEC2インスタンスが起動していること。
- S3: EC2にアクセスができるバケットを作成し、権限が設定してあること。
- IAM: アクセスキー&シークレットキーなどの接続情報が払い出されていること。
設定手順(一時利用)
1. 前提ソフトウェアのインストール
前提ソフトウェアである以下パッケージ一覧についてインストールします。
- golang
- goofyがGO実行環境で動作するため
- Filesystem in Userspace (FUSE) :
- Unix系コンピュータオペレーティングシステム用のソフトウェアインタフェース。goofyはこの仕組みを利用している。
- git
- GitHub上のgoofyをインストールする時に必要。
sudo yum install golang fuse git -y
各前提ソフトウェアのバージョンは以下の通り。
go version
go version go1.13.4 linux/amd64
git --version
git version 2.14.5
fusermount -V
fusermount version: 2.9.4
2. GOPATHを設定する
GOPATHを設定します。GOPATHとは Go言語では、環境変数GOPATHに保存されたパス(以降、単にGOPATHと呼びます)を開発時の作業ディレクトリとして扱います
export GOPATH=${HOME}/go
3. goofysをGitHubからインストール
Github上からgoofysをインストールします。
go get github.com/kahing/goofys
go install github.com/kahing/goofys
4. goofysにマウントするディレクトリを作成
goofysにマウントするディレクトリを作成します。他ユーザーからアクセスすることを想定して、root権限でしかアクセスできない階層にはマウントすディレクトリを作成しないように注意してください。 作者の設定手順のページには記載がありませんでしたが、読み書きの権限で怒られることもあるので、chmodで適切に権限を付与します(ここはオプションなので、場合に応じて設定してください)。
mkdir /home/ec2-user/mount-goofys
chmod 777 /home/ec2-user/mount-goofys
5. awsの認証情報(aws credentials)を設定
aws credentialsを直接編集しても良いですが、aws configureコマンドを使用すれば、簡単に編集できるので、今回はこちらを利用します。AMIによっては、aws cliが入っていない場合もあるので、その場合はaws cliをインストールする必要があります。aws credentialsの詳細な設定手順は、こちらをご参照願います。
なぜ、sudo aws configure
も実行する必要があるかと言うと、自動マウントの設定(fstab)を利用する際に利用するためです(fstabはroot権限でしか利用できない)。作者のページにも、To mount an S3 bucket on startup, make sure the credential is configured for root
との記述があります。sudo aws configure
を実行することで、rootユーザーのaws credentialsも設定することが可能です。
aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXX
Default region name [None]: XXXXXXXXXXXXXXXXX
Default output format [None]: XXXXXXXXXXXXXXXXX
sudo aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXX
Default region name [None]: XXXXXXXXXXXXXXXXX
Default output format [None]: XXXXXXXXXXXXXXXXX
6. マウントコマンドの実行
以下コマンドを実行して、既に作成済みのbucket(bucket-XXX )に対して、ディレクトリ(/home/ec2-user/mount-goofys)をマウントします。
$GOPATH/bin/goofys bucket-XXX /home/ec2-user/mount-goofys
df
コマンドで無事マウントされていることを確認します。
df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 16451592 0 16451592 0% /dev
tmpfs 16469640 0 16469640 0% /dev/shm
tmpfs 16469640 492 16469148 1% /run
tmpfs 16469640 0 16469640 0% /sys/fs/cgroup
/dev/xvda1 8376300 3089196 5287104 37% /
tmpfs 3293932 0 3293932 0% /run/user/1000
tmpfs 3293932 0 3293932 0% /run/user/0
bucket-XXX 1099511627776 0 1099511627776 0% /home/ec2-user/mount-goofys ←ここです。
設定手順(恒久利用)
7. fstabを編集して、再起動後もマウントされるように設定
fstabを編集することで、EC2が再起動した後も、S3にマウントするように設定します。
その前に手順6で設定したマウントをumountコマンドで解除します。
sudo umount /home/ec2-user/mount-goofys/
ここは一般的なfstabの設定と基本的には同様です。uidとgidを設定する場合は、idコマンドを利用して、それらを確認する必要があります。私の場合、該当ユーザーのuidとgidが共に1000であったため、これらの情報をfstabに設定します。
id
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)
次に、/etc/fstab
を編集します。Githubのページと上記で確認したコマンドを参考に、設定する必要があります。
sudo vim /etc/fstab
/home/ec2-user/go/bin/goofys#bucket-XXX /home/ec2-user/mount-goofys fuse _netdev,allow_other,--dir-mode=0777,--file-mode=0777,--uid=1000,--gid=1000 0 0
mount -a
することで設定は完了です。
sudo mount -a
ここで、golangの環境変数も永続化しておきます。Githubには記載がありませんでしたけど、念のためです。
vim /home/ec2-user/.bash_profile
export GOPATH=${HOME}/go
再起動します。
sudo reboot
ここで問題が発生します。df
コマンドでマウントしていることは確認ができたのですが、なぜか書き込みを行うことができません。。Github issueを確認すると、ftabを利用した方法だとRead-onlyとなってしまう事象が発生していることが記載してあります。どうやらレグレッションっぽいですね。
8. bash_profileで自動起動を設定
仕方なしにbash_profileに直接書き込むことで、自動起動を設定することに。これで設定完了。
vim /home/ec2-user/.bash_profile
$GOPATH/bin/goofys bucket-XXX /home/ec2-user/mount-goofys
以上です。