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 もインストールしておきます。
| 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 言語をインストールします。
| 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 をインストールします。
| go get github.com/kahing/goofys
go install github.com/kahing/goofys
|
AWS の資格情報設定
AWS の資格情報を用意します。ACCESS_KEY はアクセスキー、SECRET_KEY はシークレットキーを入力します。
| 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 は省略することも可能です。
| mkdir ~/s3
$GOPATH/bin/goofys --region <REGION> --profile s3 <BUCKET> ~/s3
|
状態確認
s3-mount-with-goofys という名前のバケットをマウントし、df で状態確認した結果は以下の通りです。
| $ 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 で普通にアンマウント出来ます。
アンマウントされたことを確認します。
| $ df -ahT -t fuse
df: no file systems processed
|
複数のサーバからマウントされた場合は?
特に問題無く動作するようです(手元で試した限りは問題ありませんでした)。尚、goofys はマウントポイントのオーナーとなる UID や GID を指定出来るオプションがあるので、場合によっては指定します。
上手くいかない時は
バケットを上手くマウント出来ない場合は goofys に -f オプションを指定してフォアグラウンドで実行し、エラーメッセージを確認します。
| $GOPATH/bin/goofys -f --region <REGION> --profile s3 <BUCKET> ~/s3
|
例えば「~/.aws/credentials が存在しない場合」は以下のようなエラーメッセージが表示されます。
| $ $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
|