aws S3をgoofysでマウントしてFTPサーバー作成


amaozon linuxにFTPサーバーを作成。
S3に直接FTPサーバーにしたいのですができないらしい、EC2を通してFTPサーバーを作成する。
S3なので容量は気にしなくていい。

▼追記2016/07/23-----------------------------------------------------------------------------------▼
FTPサーバー構築後の話になります。
送受信はできるのですがファイルの上書きの際に接続が切れてしまう現象になりました。
もう一回接続しなければなりません。
「451 Failure writing to local file.」というエラーがでてきますが、ググったら容量が少なくて出てくるエラー。
S3だから、っんな訳あるかって思いました(笑)調べていくうちにgoofysとvsftpdの相性が良くないそうです。。。
http://dev.classmethod.jp/cloud/aws/elb_to_ftp_to_s3fs_goofys/
このサイトの「課題その3(vsftpd+goofysの相性)」に書いてあります。
s3fsに変えるのを検討しています。
▲-------------------------------------------------------------------------------------------------▲

マウントする準備

S3バケットの作成

S3のサービスを開いてバケットの作成。適当にリージョンと名前を決め作成する

S3は終わり

IAMの設定

IAMのサービスを開いてユーザーの作成,ポリシーの作成をします。

1.ユーザー作成

1-1.左のナビゲーションからユーザーを選択、新規ユーザーの作成を選択

1-2.適当にユーザー名を書いて「ユーザーごとにアクセスキーを生成」にチェックがついていることを確認する。確認したら右下にある作成を選択

1-3.認証情報のダウンロードを選択(アクセスする際に大切なものです大事に保管)
ダウンロードしたら、閉じるを選択。ユーザーが作られているので確認

2.ポリシー作成

2-1.左のナビゲーションでポリシーを選択。ポリシーを作成を選択

2-2.「Policy Generator」を選択。

2-3.以下のようにする
※[バケット名]は作成したバケットを入れる。[]はいらない。

効果:許可
AWSサービス:Amazon S3
アクション:すべてのアクション
Amazon リソースネーム(ARN):arn:aws:s3:::[バケット名],arn:aws:s3:::[バケット名]/*

以上のものができたらステートメントの追加を選択。右下にある次のステップを選択

2-4.適当にポリシー名と説明を入力後ポリシーの作成を選択
[メトリクス名]が作成されました。
と出てきます。

3.ユーザーにポリシーをアタッチする。

3-1.左のナビゲーションからユーザーを選択。1で作成したユーザーを選択。アクセス許可のタブにポリシーのアタッチと出てくるので選択。

3-2.フィルターのポリシータイプを選択して、カスタマー管理ポリシーを選択。
2で作成したポリシーがあるのでチェックボックスにチェックを入れて、右下にあるポリシーのアタッチを選択。
これでIAMの設定は終わり。S3にアクセス許可をするユーザーができましたので、次はインスタンスの設定をします。


インスタンスの設定

goofysでS3をマウントしてFTPサーバーを構築
FTP専用のuserを作成して、そのユーザーのホームディレクトリにS3をマウントします。

goofysインストールしてS3をマウントする

・rootユーザーのホームディレクトリで作業します。
sudo su
cd ~

・goofysを扱うためのパッケージをインストール
yum install -y golang fuse

・goofysをインストール
wget https://github.com/kahing/goofys/releases/download/v0.0.5/goofys -P /usr/local/bin/

・実行できるように権限を変更
chmod 755 /usr/local/bin/goofys

・IAMの登録
aws configure

configure
aws_key_id [アクセスキー]
aws_sec_key [シークレットキー]
region [S3のリージョン]
format text

※アクセスキーとシークレットキーはIAMの設定1-3でダウンロードしたものに書いてあります。[]はいりません。
S3のリージョンはS3バケットの作成で指定したリージョンです。例えば東京なら「ap-northeast-1」と記述。それぞれのリージョンと記述に関してはここの表を見て記述してください。

ls -la.awsが作成されているのを確認します。.awsの中のファイルは設定したものが入っています。

・ユーザーを作成する
useradd [ユーザー名]

・作成したユーザーにパスワードを付ける
passwd [ユーザー名]
新しいパスワードをなににするか問われますので適当に入力。新しいパスワード再確認が来るので同じものを入力
ftpサーバーに接続する際に問われます。

・作成したユーザーに切り替えホームディレクトリにS3をマウントするディレクトリを作成します。
su [ユーザー名]
cd ~
mkdir [ディレクトリ名]

・rootユーザーに戻り作ったディレクトリにS3をマウントします。
root ユーザーに戻ります
exit
マウントします
/usr/local/bin/goofys -o allow_other --dir-mode [権限] --file-mode [権限] --region [リージョン] --uid [uid] --gid [gid] [バケット名] /home/[作成したユーザー名]/[作成したディレクトリ]
上記の例です。
/usr/local/bin/goofys -o allow_other --dir-mode 0700 --file-mode 0600 --region ap-northeast-1 --uid 501 --gid 501 example-s3buket /home/ftp-user/ftp-s3-mountpoint
(例の説明:作成したバケット名はexample-s3buketリージョンは東京(ap-northeast-1)。作成したユーザーはftp-user。作成したディレクトリはftp-s3-mountpoint。uidは作成したユーザーのuidです.gidは作成したユーザーのgidにしています。
uid,gidの確認は/etc/passwdに書いてあります。それかid [ユーザー名]コマンドで確認とれます。)

・マウントされているか確認する。
df -h
出力結果にS3のバケット名が出てきたら成功。

▼追記2016/07/25-----------------------------------------------------------------------------------▼
・起動時自動マウントの設定
IAMの認証がユーザーの時に自動マウントできました。
ロールを使用しての自動マウントはできなかったです。

自動マウントしてくれる設定ファイルを開く。
vi /etc/fstab

fstab
/usr/local/bin/goofys#[バケット名] [マウントするディレクトリ] fuse allow_other,--dir-mode=[権限],--file-mode=[権限],--uid=[UID],--gid=[GID]    0       0
/usr/local/bin/goofys#example-s3buket /home/ftp-user/ftp-s3-mountpoint fuse allow_other,--dir-mode=0700,--file-mode=0600,--uid=501,--gid=501    0       0

・アンマウント
fusermount -u [マウントしたディレクトリ]
▲-------------------------------------------------------------------------------------------------▲

これでgoofysのことに関して終了です。

次はFTPサーバーの設定をします。

ec2のポートセキュリティ

ftpサーバーを作成するため必要なポートを開けておきます。
以下の2つをポートセキュリティのインバウンドに追加する

プロトコル ポート 送信元
TCP 21 0.0.0.0/0
TCP 60001-60010 0.0.0.0/0

FTPサーバーを構築

条件は、S3をマウントしたディレクトリをFTPサーバーのディレクトリとして接続したさいの最上位ディレクトリにする。S3以外の場所はアクセスできない。

・ftp-config.shを作成し実行権限与えて編集
touch ftp-config.sh
chmod u+x ftp-config.sh
vi ftp-config.sh

ftp-config.sh
#!/bin/bash
sudo yum install vsftpd -y
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
Elastic_IP=`curl http://169.254.169.254/latest/meta-data/public-ipv4`
sudo sh -c "cat << EOF >> /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/user_conf
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=${Elastic_IP}
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
EOF"
sudo sed -i -e "/^anonymous_enable/s/YES/NO/g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^dirmessage_enable/s/YES/NO/g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^#ascii_upload_enable/s/#//g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^#ascii_download_enable/s/#//g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^#chroot_local_user/s/#//g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^#chroot_list_enable/s/#//g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^tcp_wrappers/s/YES/NO/g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^connect_from_port_20/s/YES/NO/g" /etc/vsftpd/vsftpd.conf
sudo sed -i -e "/^xferlog_std_format/s/YES/NO/g" /etc/vsftpd/vsftpd.conf
sudo touch /etc/vsftpd/chroot_list
sudo mkdir /etc/vsftpd/user_conf
sudo chkconfig vsftpd on

・実行する
./ftp-config.sh

・ftpに接続する際のユーザーとディレクトリを指定する。
vi /etc/vsftpd/user_conf/[作成したユーザー名]

[ユーザー名]
local_root=/home/[作成したユーザー名]/[S3をマウントしたディレクトリ名]

・起動
/etc/init.d/vsftpd start

これで終わりです。

ftpサーバー構築の際の参考にしました。
http://qiita.com/Yuki_BB3/items/deeb84c360c6f3c37f51


確認。

別のインスタンスを使用する。
・ftpコマンドが使えるようにインストール
yum install -y ftp

・ftp接続
ftp [サーバーのIPアドレス]
ユーザー名とパスワードを聞かれたらOK

接続できなかった場合は、FTPサーバーでftp localhostなどでローカルでは繋がるのかなどして調べる。


追記情報

[2016/07/23]
ftpサーバー構築後の問題点を冒頭に追記しました。

[2016/07/25]
goofysの自動マウントのやり方を「goofysインストールしてS3をマウントする」の最後に追記しました。
アンマウント方法を追記しました。