S3バケットの準備
まずは、データを格納する先(S3ではバケットと言います)を用意します。
AWSマネージメントコンソールからS3サービスを選び、"バケットを作成する"をクリックします。
バケット名をcondorannexdata、リージョンを米国東部(EC2インスタンスを立ち上げるのと同じ場所)に指定します。 それ以外はデフォルトのまま作成します。
s3fsのインストール
LinuxのインスタンスからS3バケットにアクセスするにはs3fsが便利です。
インスタンスの立ち上げ後、SSHでログインしてインストールします。
$ sudo yum update
$ sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
$ cd s3fs-fuse/
$ ./autogen.sh
$ ./configure -prefix=/usr -with-openssl
$ make
$ sudo make install
アクセスキーの設定
s3fsでS3バケットにアクセスするためにはアクセスキーの設定が必要です。
$ sudo vi /etc/passwd-s3fs
AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY
S3バケットのマウント
準備ができたのでS3バケットをマウントします。
$ sudo mkdir /var/s3fs
$ sudo s3fs condorannexdata /var/s3fs -o passwd_file=/etc/passwd-s3fs
マウントされたか確認します。
$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
(中略)
s3fs on /var/s3fs type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
$ sudo touch /var/s3fs/foobar
$ sudo ls /var/s3fs
foobar
$
S3 Management Console上で、バケットにファイルが作成されたことも確認します。
このままでは毎回手動でマウントする必要があるので、自動的にマウントされるようにします。
$ sudo umount /var/s3fs
$ sudo mkdir /tmp/cache
$ sudo chmod 777 /tmp/cache /var/s3fs
$ sudo vi /etc/fstab
$ sudo mount -a
$ ls /var/s3fs/
foobar
$
これでインスタンス側の設定は一通り終わったので、イメージを保存します。
ローカル環境からのマウント
S3バケットへの接続はEC2インスタンスに限らず、ローカル環境からも行うことができます。これは先ほど行なったのと同じく、s3fsを使用します。
AWSのインスタンスと同様、ローカル環境で/var/s3fsにマウントして確認します。
[chiyama@docker s3fs-fuse]$ ls /var/s3fs
foobar
[chiyama@docker s3fs-fuse]$
先ほど作成したfoobarが見えています。
これで、ローカル環境からAWS環境にファイルをアップロードして、AWS上でファイルを共有する手段ができました。
s3fsを使用してファイルをアップロードする方法が遅いと感じた場合はAWS DataSyncやAWS Transfer for SFTPといったソリューションがあるので、こちらを検討してみるのもいいかもしれません。
実際のところどうなのか確認してみましょう。PIXAR USDのサンプルデータ、Kitchen_setをローカル環境からs3fsでマウントしたS3 バケットに転送してみます。
$ du -sm Kitchen_set
12 Kitchen_set
$ time cp -Rp Kitchen_set /var/s3fs
real 35m23.298s
user 0m0.024s
sys 0m0.188s
$
ほほう(; ・`д・´)。12MBのファイルで35分とはなかなかシブい結果が出ましたね。これはこのままだと辛いので、別の手段を考える必要がありそうです。今回は、先ほどのAWS Transfer for SFTPを使用してみます。