機械学習に使うデータをS3にまとめて保存しておき、インスタンスのストレージを使わない様にしたかったので、S3をマウントして使う事にしました。
安定性を考えてs3fsを使っていますが、goofysの方が早いらしいです。
条件
- Ubuntu 16.04
- s3fs-fuseを利用(goofysは安定性が微妙らしいため)
- IAM Role を利用(Key情報をEC2インスタンス内に保持する必要がないため)
※Roleを使用すればEC2 インスタンス起動時に IAM Role 選択するのみ
手順
1.S3 Bucket の準備
2.IAMロールの準備
3.s3fs-fuse のインストールと設定
4.マウントの自動化
※ 1と2はAWSコンソール画面での操作
※ 3と4はインスタンスにSSH接続してから操作
1.S3 bucketの準備
- バケット名:s3-bucket1-gpu
- リージョン:米国東部(バージニア北部)※マウントしたいEC2と同じリージョンにすること
※ひとまず上記以外の設定はデフォルトにしておく
2. IAMロールの準備
① 信頼関係
・ロールを利用するサービス:EC2
・ユースケースの選択:EC2
② アクセス制限
・ポリシー名:AmazonS3FullAccessを選択
③確認
・ロール名:access-s3-role
・ロールの説明:access to S3 FullAccess
そして作成したロールをインスタンスに割り当てる
S3をマウントしたいインスタンスが選択されていることを確認して作成したIAMロール「access-s3-role」を選択して適用する
3.s3fs-fuse のインストール
まずgitなど必要なものをインストールする
$ sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config
そしてs3fsをgitからインストールする
$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
もろもろの設定(これでs3fsが /usr/local/bin 下におかれる)
$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
マウントポイントの作成
※root権限のディレクトリとして作成されるがマウント時にownerを設定するのでOK
$ sudo mkdir /mnt/s3
マウント時のownerのuid, gidを確認する
$ id ubuntu
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),110(lxd)
マウントする
$ sudo s3fs s3-bucket1-gpu /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
# allow_other: root 以外(マウントしたユーザー以外)も利用可能とする
これでS3のbucketをインスタンスにマウントできた。しかし再起動するとマウントは解除されてしまうので、再起動しても自動マウントされるように設定しておく。
4.マウントの自動化
インスタンスを再起動しても自動でマウントされるように設定を行う。
/etc/rc.local にマウントコマンドを書き込んでおけば起動時に自動で実行してくれる。
$ sudo vi /etc/rc.local
以下の内容をrc.localに追記する
# s3fs mount
# umount /mnt/s3
s3fs s3-bucket1-gpu /mnt/s3 -o rw,allow_other,uid=1000,gid=1000,default_acl=public-read,iam_role=access-s3-role
これでインスタンスを再起動しても自動でマウントされる。