Storage Gatewayを用いたEC2のS3マウント方法について



## 1. 目的

Storage Gateway は、オンプレミスのサーバをAWSストレージと接続することを主目的としたサービスですが、EC2との接続も可能です。その実態は、Storage Gateway用にAWSが準備したAMIイメージをもつEC2インスタンスで、マウント元のEC2インスタンスとS3とを標準マウントプロトコルで仲介します。
接続元のEC2インスタンスのOSによって、マウントプロトコルが異なります。

- Linuxクライアント：　NFS バージョン 3 または 4.1 プロトコル
- Windowsクライアント：SMB ファイルシステムのバージョン 2 および 3 のプロトコル


本投稿では、EC2(Linuxクライアント)をStorage Gatewayを介してNFSプロトコルでS3にマウントする設定する方法について解説します。



## 2. 前提

以下概念図が示す通り３つの構成要素が存在しますが、EC2インスタンスとS3の設定手順は本手順書では***対象外***となります。以下条件と満たすように、AWS公式ページから作成してください。

***EC2インスタンス***： S3にマウント先にもつLinuxサーバ。

- Linux OSベースのAMIで作成されていること
- マウント先のS3へアクセス可能なIAMロールがアタッチされていること

***S3***： マウント先のストレージ

- StorageGWおよびEC2インスタンスからアクセス可能なIAMポリシが設定されていること

***StorageGW***：　EC2インスタンスとS3を仲介するゲートウェイ。実態はEC2インスタンス。

<img width="666" alt="20181121_StorageGateway_arch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/75967030-8d52-dda9-4932-8f1d2f4ba25c.png">



## 3. Storage Gatewayの作成
### 3-1. Storage Gateway用EC2インスタンスの起動

Storage Gatewayを作成したいリージョンを選択して、「ゲートウェイの作成」を押下します。以下画面に遷移しますので、「ファイルゲートウェイ」を選択します。


<img width="1148" alt="スクリーンショット 2020-03-08 10.29.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/63af7664-58d9-01bf-5e74-dee885aa2d3d.png">


「Amazon EC2」を選択します。

<img width="1161" alt="スクリーンショット 2020-03-08 11.18.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/d56994be-0ff5-ce6b-69d0-fec2c95c17c6.png">

上記画面で、「インスタンスの起動」を押すと、Storage Gateway用のEC2インスタンスの作成画面に遷移します。一般的なEC2インスタンスと同様の要領で作成するのですが、以下注意事項があります。


***AMIイメージ***
Storage Gateway用のAMIイメージが選択されていることを確認します。

<img width="1598" alt="スクリーンショット 2020-03-08 11.23.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/2029c577-eed6-c87c-e808-57174d5bb403.png">


***インスタンスタイプ***
Amazon EC2でゲートウェイをデプロイする場合、ゲートウェイが機能するためにはインスタンスサイズは少なくとも xlarge である必要があります。ただし、コンピューティング最適化インスタンスファミリーの場合は、サイズとして少なくとも 2xlarge が必要ですゲートウェイの種類に応じて次のインスタンスタイプのうち 1 つを使用することをお勧めします。

- 汎用インスタンスファミリー — m4 または m5 インスタンスタイプ。
- コンピューティング最適化インスタンスファミリー — c4 または c5 インスタンスタイプ。2xlarge 以上のインスタンスサイズを選択し、必要な RAM 要件を満たします。
- メモリ最適化インスタンスファミリー — r3 インスタンスタイプ。
- ストレージ最適化インスタンスファミリー — i3 インスタンスタイプ。


***ストレージ***
Storage Gatewayには、VM 用の 80 GiB 以外にもディスク領域が必要になります。次の表は、デプロイされるゲートウェイのローカルディスクストレージの推奨サイズを示しています。したがって、ファイルゲートウェイとしてのStorage Gatewayには、最低でも***230GB***の領域が必要であることを注意しなければなりません。


<img width="880" alt="スクリーンショット 2020-03-08 11.32.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/94d66ecf-db2e-914c-0f20-ac90aabc48ab.png">

上記仕様に従い、以下のようにストレージ設定画面で少なくとも150GiBのEBSをアタッチします。

<img width="1527" alt="スクリーンショット 2020-03-08 11.39.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/22516477-51f3-c95a-b603-266eda58968a.png">


***セキュリティグループ***
[Storage Gatewayのポート要件](https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/Requirements.html#networks)に記載の通り、インバウンドとアウトバウンドの通信許可を設定します。

上記事項を注意しパラメータの設定が完了したら、「起動」を押下してStorage Gateway用EC2インスタンスを起動します。


### 3-2. Storage Gatewayのアクティブ化

Storage Gateway用EC2インスタンスが起動したら設定しているWebブラウザから接続可能なIPアドレス（今回はパブリックIPアドレス）を入力して、「ゲートウェイに接続」を押下します。

<img width="1209" alt="スクリーンショット 2020-03-08 11.59.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/bfdb4430-d725-b982-c4b3-8dfbd58d1768.png">

タイムゾーンとTagを編集して「ゲートウェイのアクティブ化」を押下すると、Storage Gatewayのアクティブ化が完了です。

<img width="1195" alt="スクリーンショット 2020-03-08 12.01.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/1cf703fe-548a-cba0-32d5-82317f1112a7.png">


### 3-3. Storage Gatewayのストレージ割り当て

Storage Gatewayのアクティブ化が完了すると、「ステータス」欄に実行中の文字が表示されます。

<img width="1670" alt="スクリーンショット 2020-03-08 12.06.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/fc5f1a80-05ba-5c28-ebb5-018b9542a7dd.png">

キャッシュ用にアタッチしたEBSを割り当てるとストレージ割り当てが完了します。

<img width="1673" alt="スクリーンショット 2020-03-08 12.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/a9979c1d-2548-eadb-c828-48aaed6687ac.png">


## 4. マウントの設定

Storage Gatewayの設定画面から「ファイル共有の設定」を押下して、

<img width="1663" alt="スクリーンショット 2020-03-08 12.11.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/bbe12ee8-de96-8a8e-6e6f-1295145f1357.png">

接続先のAmazon S3バケット名を選択肢して、


<img width="1531" alt="スクリーンショット 2020-03-08 12.10.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/3ab43cea-bb28-a43d-5eb3-ae1b562b9c27.png">

オブジェクトストレージクラス、オブジェクトメタデータ、IAMロールの設定を行い「次」へを押下すると、

<img width="1423" alt="スクリーンショット 2020-03-08 12.13.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/1e38f32b-c19e-6f1c-ca0f-5db91d67c5ef.png">

ファイル共有用の領域と接続用のコマンドが発行されます。

<img width="1463" alt="スクリーンショット 2020-03-08 12.16.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/57a6e593-2a92-e799-e896-55760ea1bf3c.png">


このコマンドをマウント元のEC2インスタンスで実行することで、正常にマウントが実行されます。


```bash:mountコマンドの実行例
mount -t nfs -o nolock,hard XXX.XXX.XXX.XXX:/bucket /home/ec2-user/mount-test
```

以下の通りマウントができていることが確認できたら設定は完了です。個人情報はマスキングしておきます。

```bash:dfコマンドの実行例
df
Filesystem                       1K-blocks    Used        Available Use% Mounted on
devtmpfs                           8194060       0          8194060   0% /dev
tmpfs                              8212108       0          8212108   0% /dev/shm
tmpfs                              8212108     484          8211624   1% /run
tmpfs                              8212108       0          8212108   0% /sys/fs/cgroup
/dev/xvda1                       314560492 3316464        311244028   2% /
tmpfs                              1642424       0          1642424   0% /run/user/1000
XXX.XXX.XXX.XXX:/bucket-XXXX 9007199254740992       0 9007199254740992   0% /home/ec2-user/mount-test ←ここです
```


以上