EC2インスタンス(Ubuntu)にS3をマウントする方法

0. 概要

サーバーのログやバックアップファイルを容量(ほぼ)無限で単価の安いS3に直接アップロードしたいことがあるかと思います。
それはS3をEC2のマウントポイントにマウントすることで可能となり、普通のファイルシステムのように使用することができるようになります。
今回はその手順をご紹介いたします。

1. S3バケットを用意しよう

AWSコンソールからマウントしたいS3バケットを作成します。
(このときのバケットの名前は後で使うので覚えておいて下さい)
パブリックアクセスの有無やS3バケットの冗長性はお好みで大丈夫です。

2. AIMロールを作成しよう

マウントしたいEC2インスタンスがS3へアクセスできるように権限を付与する必要があります。
ここではまずその権限のルールを作成します。

「IAM > ロール > ロール > AWSサービス」を選択。
その下にある「ロールを使用するサービスを選択」で、EC2を選択。

次に進む。

ここで適切なロールを選択する必要がありますが、マウントしたバケットの中身を自由に操作したいのであれば「AmazonS3FullAccess」を選んでおくのが無難です。
タグや名前はお好みでつけて下さい。

3. AIMロールをEC2インスタンスに紐付けよう

先程作ったロールをEC2インスタンスに紐付けます。
(この作業を行ったインスタンスのみがS3バケットにアクセスできるようになります)
「EC2 > インスタンス > インスタンス > 任意のインスタンス」で右クリック。
「インスタンスの設定 > IAMロールの割当/置換」から先程作ったロールを選択して決定します。

4. S3マウントの用意をしよう

最後に実際にインスタンスの中でS3をマウントします。
マウントにはgoofysというミドルウェアを使うため、まずはその準備をする。

# 必要なミドルウェアをインストール
sudo apt install golang fuse git
# メモリが極端に少ない場合はswap領域を確保する
## メモリが0.5GBほどしかないインスタンスではメモリ不足で失敗する
sudo mkdir /var/swap/
sudo dd if=/dev/zero of=/var/swap/swap0 bs=2M count=1024
sudo chmod 600 /var/swap/swap0
sudo mkswap /var/swap/swap0
sudo swapon /var/swap/swap0
# goofysのインストール
export GOPATH=$HOME/go
go get github.com/kahing/goofys
go install github.com/kahing/goofys

次は実際にマウントします。
マウントの場所や権限は環境に合わせて変更して下さい。

# マウントファイルの作成
sudo mkdir /mnt/S3
sudo chown ubuntu:ubuntu /mnt/S3
# idの確認
id
# 自動起動の設定
sudo vim /etc/fstab
# 下記内容を追記(> は費用)
> /home/ubuntu/go/bin/goofys#"バケットの名前" /mnt/S3 fuse _netdev,allow_other,--file-mode=0666,--uid="先程確認したid",--gid="先程確認したid" 0 0
# 再起動(念の為)
sudo reboot

上記がうまく行っていれば、マウントディレクトリがS3と同期されているはずです。
実際にファイルを置いたり削除したりして確認してみて下さい!