goofysを使ってEC2上のLinuxにS3をマウントする

2020-02-07Amazon,AWS,CentOS

はじめに

S3をファイルシステムとしてマウントするための方法を整理してみました。

  • AWSを利用していて、S3をサーバーマウントする技術として s3fs が有名
    • s3fs は遅い
  • 代替策として goofys がある
    • goofys は速い

goofys の方が評判が良いようなのでgoofysを検証しました。

ちなみに goofys のGithubページにベンチマークが掲載されています。

(引用)
Using --stat-cache-ttl 1s --type-cache-ttl 1s for goofys -ostat_cache_expire=1 for s3fs to simulate cold runs. Detail for the benchmark can be found in bench.sh. Raw data is available as well. The test was run on an EC2 m4.16xlarge in us-west-2a connected to a bucket in us-west-2. Units are seconds.

今回のゴール

起動時にS3バケットが所定のディレクトリに自動マウントされるようになるまで設定します。

※ちなみに、Dockerが利用できる場合にはgoofysを手軽に利用できるDockerイメージを公開していますのでお使いください。

検証環境

  • AWS EC2 上のCentOS環境を使用
$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

前提条件

  • EC2インスタンスが作成済みであること
  • S3バケットが作成済みであること
  • S3バケットにアクセス可能なIAMユーザが作成済みであること

セットアップ

Go/Fuse/AWS CLIのインストール

goofys を利用するにあたり、以下のソフトウェアの事前インストールが必要です。

  • Go
  • Fuse
  • AWS CLI
# 何はともあれパッケージをアップデート
$ sudo yum update -y

# epelリポジトリを追加して、Goをインストールできるようにする
$ sudo yum install epel-release -y

$ sudo yum install golang fuse awscli -y

※幸い僕ははまらなかったが、AmazonLinuxを利用している方の中には yum で go1.7系がインストールされてしまい、古いバージョンでは goofys が動作しなかったという事例もありました。

Goの実行に必要な環境変数を定義しておきます。
注意点として、ここから先の設定は root ユーザで行うこと。
後々 /etc/maount に設定を追加しサーバ起動時に自動的にS3のマウントが行われるようにするためです。

ちなみに、 こちらのエントリ でも少し触れたが、 Mac環境だと GO のライブラリは $HOME/.go にインストールされるが、 CentOS環境と $HOME/go にインストールされる点に注意しましょう。

# rootになる
$ sudo -i

# GOPATHを設定
$ export GOPATH="$HOME/go"

## 確認
$ echo $GOPATH

## .bashrcにも追記しておく(GOHOME/PATH設定)
$ cat <<'EOF' >>"$HOME/.bashrc"
export GOPATH="$HOME/go"
export PATH="${PATH}:${GOPATH}/bin"
EOF

インストールができたか確認してみます。

$ go version
go version go1.11.5 linux/amd64

また、S3バケットにアクセスできるように認証設定を行います。
( 事前にIAMユーザの作成やアクセスキーの発行が必要ですが、説明を省略してしまった(汗) )

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

goofysのインストール

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

マウントポイントの作成

S3バケットをマウントしたい場所にディレクトリを作成します。

※当然のことながら、事前にS3バケットは作成しておく必要があります。

$ mkdir -p /mnt/your-s3-bucket-name && chmod 777 /mnt/your-s3-bucket-name

マウントの動作テスト

以下のコマンドを実行し、マウントができるかテストします。

$ $GOPATH/bin/goofys your-s3-bucket-name /mnt/your-s3-bucket-name

# S3バケット内のファイルが見れるかな?
$ ls /mnt/your-s3-bucket-name

# 確認ができたら以後の作業のため一度マウント解除
$ umount /mnt/your-s3-bucket-name

サーバ起動時に自動マウントされるようにする( /etc/fstab 設定 )

サーバ起動時に自動マウントされるようにしてみましょう。
同時にS3バケット内のファイルを閲覧できるユーザが限定されるように設定します。

  • 閲覧可能なグループは goofys_group とし、このグループに所属していなければ閲覧できないものとします。
  • 検証用に test_user というユーザを作成し、 goofys_group グループに所属させておきます。
# ユーザ作成
$ sudo useradd test_user

# グループ作成 & test_userユーザを配属
$ groupadd goofys_group
$ gpasswd -a test_user goofys_group

# グループのgidを取得しておく(あとで使う)
$ grep goofys_group /etc/group| cut -d: -f3
1002

作成されたグループの gid ( 1002 ) はメモしてお。

最後に以下の内容を /etc/fstab に追記します。

$ cat <<'EOF' >>/etc/fstab
/root/go/bin/goofys#your-s3-bucket-name /mnt/your-s3-bucket-name fuse _netdev,allow_other,--dir-mode=0770,--file-mode=0770,-uid=0,--gid=1002 0 0
EOF
  • 設定の概要は大まかに以下のようにしています。
    • allow_other オプション無しだとコマンド実行者( root ユーザ )以外がアクセスできないことに注意
    • --uid オプションは マウントディレクトリの所有者を表し、 root ユーザとしています
    • --gid オプションは マウントディレクトリにアクセス可能なグループを表し、 先程作成した goofys_group グループとしています
    • --dir-mode オプションを指定して、ディレクトリを所有者あるいはグループに所属するユーザ以外からは見れないようにしている
    • --file-mode オプションを指定して、ファイルを所有者あるいはグループに所属するユーザ以外からは見れないようにしている

※ここまでrootユーザで実行して環境設定は完了です。

最終動作確認

以下のコマンドでマウントされることを確認してみましょう。

$ sudo mount -a

$ ls /mnt/your-s3-bucket-name

ひとこと

どうでもいいですが、 goofys で画像検索すると某キャラクターがたくさん見つかります。


話は変わりますが、最近 資格Times というサイトのフロントエンド開発に携わってます。
Vue.js + Laravel5 で構築されており、リアクティブなWebシステム構築の参考になるかと思います。
ぜひご参考ください。

2020-02-07Amazon,AWS,CentOS