EFSとEBS

#AWSのストレージサービス
AWSには以下のようなストレージサービスが提供されています。

- インスタンスストレージ
- EBS
- EFS
- S3
- Glacier
- Storage Gateway
- RDS
- Redshift
- ElastiCache
- DynamoDB
- (SimpleDB)

ここではEFSとEBSの比較について特徴と利用方法を取り上げます。

#EFSとEBSの比較
EFSはNFSでアクセス可能な共有ストレージのファイルストレージサービスで、EBSはブロックレベルのストレージサービスで、共にEC2にマウント可能なストレージです。EFSとEBSの利用比較の図については以下のようになります。
![efs_ebs.png](https://qiita-image-store.s3.amazonaws.com/0/81083/658955f6-2673-0a88-8df5-bacf675b11cc.png "efs_ebs.png")

[公式ページ](https://aws.amazon.com/jp/efs/details/)の比較表を引用させて頂くと以下のようになります。

|||Amazon EFS|Amazon EBS PIOPS|
|:-:|:-:|:-:|:-:|
|パフォーマンス|オペレーションあたりのレイテンシー|低、一定|最低、一定|
||スループットスケール|1 秒間あたり数 GB|1 秒間あたり 1 GB|
|特徴|データ(可用性/耐久性)|複数 AZ に冗長的に保存|単一 AZ に冗長的に保存|
||アクセス|複数 AZ の 1～数千の EC2 インスタンスから同時|単一 AZ の単一 EC2 インスタンスから|
||ユースケース|ビッグデータと分析、メディア処理ワークフロー、コンテンツ管理、ウェブ配信、ホームディレクトリ|ブートボリューム、トランザクションおよび NoSQL データベース、データウェアハウスと ETL|

##制限
- EFS
 - http://docs.aws.amazon.com/efs/latest/ug//limits.html
- EBS
 - https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_service_limits.html#limits_ebs

#マウントコマンド まとめ
##EFS

```bash
$ sudo yum install nfs-utils
$ sudo mkdir -p /mnt/efs/0
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /mnt/efs/0
$ df -h
$ sudo bash -c "echo 'fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /mnt/efs/0 nfs4 defaults 0 0' >> /etc/fstab"
```

##EBS

```bash
$ sudo mkfs.xfs /dev/sdf
$ sudo mkdir -p /mnt/ebs/0
$ sudo mount -t xfs /dev/sdf /mnt/ebs/0
$ df -h
$ sudo bash -c "echo '/dev/sdf /mnt/ebs/0 xfs defaults 0 0' >> /etc/fstab"
```

#利用方法
##EFS
マネジメントコンソールから[Elastic File System]を選択。
[Create file system]を選択。

###Step 1: Configure file system access
VPC: vpc-xxxxxxxxx
Create mount targets:
Availability Zone, Subnet, IP address, Security groupsの各項目について、利用するリージョン中のアベイラビリティゾーンが幾つか表示される。

[Next step]を選択。

###Step 2: Configure optional settings

####Add tags
Key: Name
Value: SampleEFS

####Choose performance mode
- General Purpose
- Max I/O

パフォーマンスモードは2種類から選択できる。Max I/Oはインスタンスが10個〜1000個の規模で接続するのに向いている。通常はGeneral Purposeで良い。CloudWatchのPercentIOLimitのIOの様子を見てMax I/Oを考える。

[Next step]を選択。

###Step 3: Review and create
内容を確認したら、[Create File System]を選択。


※注意点で、EFS側のセキュリティグループでインバウンドでEFSの通信を許可しておかないとタイムアウトでマウントに失敗するので、ポートを開放しておく。

EFSのMount targetsで各AZに適用されているSecurity Groupを確認しておく。
マネジメントコンソールから[VPC]を選択。
[セキュリティグループ]を選択。
先ほど確認したセキュリティグループを選択し、インバウンドルールを選択して、[編集]を選択。

[別のルールの追加]を選択して、以下を追加して[保存]を選択する。

カスタムTCPルール   TCP(6)   2049   0.0.0.0/0

 


```
$ ssh -i ~/.ssh/id_rsa.pem ec2-user@XXX.XXX.XXX.XXX
```

以下を入力しても何も表示されない場合はnfs-utilsがインストールされていないのでインストールする。

```bash
$ yum list installed | grep nfs-utils
nfs-utils.x86_64                         1:1.3.0-0.21.amzn1           @amzn-main
```

```bash
$ sudo yum install nfs-utils
```

```bash
$ sudo mkdir -p /mnt/efs/0
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /mnt/efs/0
```


```bash
$ df -h
ファイルシス                              サイズ  使用  残り 使用% マウント位置
/dev/xvda1                                  7.8G  1.2G  6.6G   15% /
devtmpfs                                    488M   60K  488M    1% /dev
tmpfs                                       498M     0  498M    0% /dev/shm
fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/   8.0E     0  8.0E    0% /mnt/efs/0
```

```bash
$ sudo bash -c "echo 'hoge' > /efs/sample.txt"
```

- ユーザに実行権限がないディレクトリのファイルに対してリダイレクトでデータを書き込みとsudo をつけても失敗する。
- もしくは、sudo tee -a /efs/sample.txt


としておき、別のインスタンスからも同様の手順でマウントすると、

```bash
$ cat /efs/sample.txt 
hoge
```

ファイルが共有できることが確認できる。


Amazon Linux, Red Hat Enterprise Linux, or SuSE Linuxでは、nfs-utilsパッケージ
Ubuntuでは、nfs-commonパッケージ

nfs-utilsパッケージを使用するが、Amazon Linuxではデフォルトでインストールされているので、yumなどでインストールする必要はない。


再起動してもマウントが外れないように/etc/fstabにマウントの情報を追記しておく。

```bash
$ sudo bash -c "echo 'fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /mnt/efs/0 nfs4 defaults 0 0' >> /etc/fstab"
```

###注意点
####nfs-utilsを入れ直さないと

```bash
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ /efs
mount: wrong fs type, bad option, bad superblock on fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
```

(参考) http://qiita.com/Accent/items/0d99c4652e2101760b50

```bash
$ sudo yum install nfs-utils
```

####ファイアウォールを解放しないと

```bash
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/ efs
mount.nfs4: Connection timed out
```


##EBS
###マネジメントコンソールの操作
1.マネジメントコンソールから、[EC2]を選択。
2.ELASTIC BLOCK STOREの[ボリューム]を選択。
3.[ボリュームの作成]を選択。

4.
ボリュームタイプ: 汎用SSD(GP2)
サイズ（GiB）: 5（最小: 1 GiB、最大: 16384 GiB）
IOPS: 300 / 3000(Baseline of 3 IOPS per GiB with a minimum of 100 IOPS, burstable to 3000 IOPS)
スループット (MB/秒): 該当しません
アベイラビリティーゾーン : us-east-1d
スナップショット ID: (空欄)
暗号化: (チェックしない)

[作成]を選択。

EBSはアベイラビリティーゾーンに属するので、アタッチしたいEC2インスタンスがあるものと同じものにしておかないといけないことに注意。

5.作成したボリュームを選択した状態で[アクション]から[ボリュームのアタッチ]を選択。

6.
ボリューム : us-east-1d にある vol-0bf1030e59290b4f8
インスタンス : i-e25cdcd2 us-east-1d 内の
デバイス : /dev/sdf

- Linux のデバイス: /dev/sdf から /dev/sdp

[アタッチ]を選択。

7.デバイスの存在を確認。

###CUIからの操作

```bash
$ ssh -i ~/.ssh/id_rsa.pem ec2-user@XXX.XXX.XXX.XXX
```

```bash
$ ls -al /dev/ | grep sdf
lrwxrwxrwx  1 root root           4  1月  2 06:16 sdf -> xvdf
```

xfsprogsパッケージが必要。Amazon Linuxではデフォルトでインストールされている。

```bash
$ sudo mkfs.xfs /dev/sdf
meta-data=/dev/sdf               isize=256    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

```bash
$ sudo mkdir -p /mnt/ebs/0
$ sudo mount -t xfs /dev/sdf /mnt/ebs/0
```

```bash
$ df -h
ファイルシス                              サイズ  使用  残り 使用% マウント位置
/dev/xvda1                                  7.8G  1.2G  6.6G   15% /
devtmpfs                                    488M   64K  488M    1% /dev
tmpfs                                       498M     0  498M    0% /dev/shm
fs-xxxxxxxx.efs.us-east-1.amazonaws.com:/   8.0E     0  8.0E    0% /mnt/efs/0
/dev/xvdf                                   5.0G   33M  5.0G    1% /mnt/ebs/0
```

再起動してもマウントが外れないように/etc/fstabにマウントの情報を追記しておく。

```bash
$ sudo bash -c "echo '/dev/sdf /mnt/ebs/0 xfs defaults 0 0' >> /etc/fstab"
```

###その他
####ルートデバイスボリュームの容量の追加
AMIの作成
AMIや元々のインスタンスの設定によっては、サイズの変更が反映されないので以下のコマンドを入力する。

```bash
$ sudo resize2fs /dev/xvda1
```
####追加ボリュームの容量の追加。

```bash
$ sudo resize2fs /dev/xvdf
```

ファイルシステムがXFSの場合は以下のコマンドを入力する。

```bash
$ sudo xfs_growfs /mnt/ebs/0
```
<!--
##SimpleDB
SDKとCLIのみで、かつプレビューステージを有効にして利用できる。以下のコマンドで有効にする。DynamoDBの利用推奨。

```
$ aws configure set preview.sdb true
```
-->

#参考
http://docs.aws.amazon.com/efs/latest/ug//mounting-fs.html
http://dev.classmethod.jp/cloud/aws/amazon-elastic-file-system-is-generally-available/
http://dev.classmethod.jp/cloud/efs-ataglance/
http://blog.serverworks.co.jp/tech/2016/06/29/efs-2/