Skip to content

EC2 上の CentOS7 から goofys で S3 をマウントする(API 利用編)

goofys を使って AWS の EC2 上に作った CentOS7 から S3 をマウントするには以下のようにします。EC2 のインスタンスは「CentOS 7 (x86_64) - with Updates HVM (2016/02/26)」をベースにしました。今回は AWS の API を使ってマウントしていますが、IAM ロールを使ってマウントする方法 もあります。

事前準備

事前に以下を用意しておきます。今回は AWS API のアクセスキー/シークレットキーを EC2 インスタンス内に保存する方法を使いました。セキュリティ上の問題から EC2 インスタンス内にアクセスキー等を保存したく無い場合は IAM ロールを使ってマウントする方法 もありますが、この場合は EC2 インスタンス作成時に IAM ロールを割り当てておく必要があります(後で IAM ロールを変更することが出来ない為。たぶん…)。

  • AWS の API 情報
  • アクセスキー
  • シークレットキー
  • リージョン名
  • S3 上のバケット名 (※ 事前にバケットを作成しておくこと)

FUSE / git / Go 言語 / goofys のインストール

FUSE と git のインストール

goofys は FUSE (Filesystem in Userspace) を使う為、FUSE をインストールします。また、goofys そのものは GitHub で提供されているので、git もインストールしておきます。

1
2
sudo yum update -y
sudo yum install -y fuse git

Go 言語のインストール

goofys は Go 言語で書かれているので、まず Go をインストールします。yum でインストールすることも出来ますが、デフォルトのリポジトリを使う限り、Go 言語のバージョンが 1.4.2 と古かったので、今回は yum を利用しません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ yum info golang
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.mirror.ndchost.com
 * extras: mirror.tocici.com
 * updates: mirror.chpc.utah.edu
Available Packages
Name        : golang
Arch        : x86_64
Version     : 1.4.2
Release     : 9.el7
Size        : 3.0 M
Repo        : base/7/x86_64
Summary     : The Go Programming Language
URL         : http://golang.org/
License     : BSD
Description : The Go Programming Language.

以下の手順で Go 言語をインストールします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cd ~/
curl -O  https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz
tar xvf go1.6.2.linux-amd64.tar.gz
mv go .go
rm go1.6.2.linux-amd64.tar.gz
mkdir bin
mkdir gocode
ln -s ~/.go/bin/go ~/bin/go
echo 'export GOROOT=$HOME/.go' >> ~/.bashrc
echo 'export GOPATH=$HOME/gocode' >> ~/.bashrc
source ~/.bashrc

goofys のインストール

goofys をインストールします。

1
2
go get github.com/kahing/goofys
go install github.com/kahing/goofys

AWS の資格情報設定

AWS の資格情報を用意します。ACCESS_KEY はアクセスキー、SECRET_KEY はシークレットキーを入力します。

1
2
3
4
mkdir ~/.aws
echo '[s3]' >> ~/.aws/credentials
echo 'aws_access_key_id=<ACCESS_KEY>' >> ~/.aws/credentials
echo 'aws_secret_access_key=<SECRET_KEY>' >> ~/.aws/credentials

S3 の Bucket をマウントする

いよいよ最後の仕上げです。S3 上に作成済みのバケットをマウントします。REGION はリージョン名を、BUCKET には S3 のバケット名を入力します。API の資格情報は ~/.aws/credentials の [S3] セクションに書いたので、--profile オプションは「s3」と指定します。尚、--region は省略することも可能です。

1
2
mkdir ~/s3
$GOPATH/bin/goofys --region <REGION> --profile s3 <BUCKET> ~/s3

状態確認

s3-mount-with-goofys という名前のバケットをマウントし、df で状態確認した結果は以下の通りです。

1
2
3
$ df -ahT -t fuse
Filesystem           Type  Size  Used Avail Use% Mounted on
s3-mount-with-goofys fuse  1.0P     0  1.0P   0% /home/centos/s3

バケットのアンマウント

お作法を熟知していないのですが、とりあえず umount で普通にアンマウント出来ます。

1
sudo umount ~/s3

アンマウントされたことを確認します。

1
2
$ df -ahT -t fuse
df: no file systems processed

複数のサーバからマウントされた場合は?

特に問題無く動作するようです(手元で試した限りは問題ありませんでした)。尚、goofys はマウントポイントのオーナーとなる UID や GID を指定出来るオプションがあるので、場合によっては指定します。

上手くいかない時は

バケットを上手くマウント出来ない場合は goofys-f オプションを指定してフォアグラウンドで実行し、エラーメッセージを確認します。

1
$GOPATH/bin/goofys -f --region <REGION> --profile s3 <BUCKET> ~/s3

例えば「~/.aws/credentials が存在しない場合」は以下のようなエラーメッセージが表示されます。

1
2
3
4
5
6
7
8
$ $GOPATH/bin/goofys -f --region us-west-2 --profile s3 s3-mount-with-goofys ~/s3
2016/07/09 15:34:56.053372 s3.ERROR code=SharedCredsLoad msg=failed to load shared credentials file, err=open /home/centos/.aws/credentials: no such file or directory

2016/07/09 15:34:56.106999 s3.ERROR code=SharedCredsLoad msg=failed to load shared credentials file, err=open /home/centos/.aws/credentials: no such file or directory

2016/07/09 15:34:56.107020 main.ERROR Unable to access 's3-mount-with-goofys': SharedCredsLoad: failed to load shared credentials file
caused by: open /home/centos/.aws/credentials: no such file or directory
2016/07/09 15:34:56.107027 main.FATAL Mounting file system: Mount: initialization failed

goofys のヘルプ

参考用に goofys のヘルプを掲載しておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ $GOPATH/bin/goofys --help
Error: goofys takes exactly two arguments.

NAME:
   goofys - Mount an S3 bucket locally

USAGE:
   goofys [global options] bucket[:prefix] mountpoint

VERSION:
   0.0.6

GLOBAL OPTIONS:
   --help, -h              Print this help text and exit successfuly.
   -o value                Additional system-specific mount options. Be careful!
   --dir-mode value        Permissions bits for directories. (default: 0755) (default: 493)
   --file-mode value       Permission bits for files (default: 0644) (default: 420)
   --uid value             UID owner of all inodes. (default: 1000)
   --gid value             GID owner of all inodes. (default: 1000)
   --endpoint value        The non-AWS endpoint to connect to. Possible values: http://127.0.0.1:8081/
   --region value          The non-AWS endpoint to connect to. Possible values: us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, sa-east-1, cn-north-1 (default: "us-west-2")
   --storage-class value   The type of storage to use when writing objects. Possible values: REDUCED_REDUNDANCY, STANDARD, STANDARD_IA. (default: "STANDARD")
   --use-path-request      Use a path-style request instead of virtual host-style. (deprecated, always on)
   --profile value         Use a named profile from $HOME/.aws/credentials instead of "default"
   --use-content-type      Set Content-Type according to file extension and /etc/mime.types (default: off)
   --stat-cache-ttl value  How long to cache StatObject results and inode attributes. (default: 1m0s)
   --type-cache-ttl value  How long to cache name -> file/dir mappings in directory inodes. (default: 1m0s)
   --debug_fuse            Enable fuse-related debugging output.
   --debug_s3              Enable S3-related debugging output.
   -f                      Run goofys in foreground.
   --version, -v           print the version