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

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

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

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

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

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


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

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

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

3-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`

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

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

`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`

```text:fstab
/usr/local/bin/goofys#[バケット名] [マウントするディレクトリ] fuse allow_other,--dir-mode=[権限],--file-mode=[権限],--uid=[UID],--gid=[GID]    0       0
```

```text:例
/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サーバーを作成するため必要なポートを開けておきます。
以下の２つをポートセキュリティのインバウンドに追加する

|プロトコル|ポート|送信元
|:-----|:-----|:-----
|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`

```text: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/[作成したユーザー名]`

```text:[ユーザー名]
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をマウントする」の最後に追記しました。
アンマウント方法を追記しました。