【意外と】StorageGatewayを使用してDockerコンテナ - S3間のリソース共有を実現【ドキュメントが少ない】

#1.はじめに
以前、検証用のDockerコンテナを間違って削除してしまいコンテナ内の大事なファイルを紛失してしまうというミスをやらかしました（職場での検証環境だったので、上司から信じられないくらいマジで切れられました..）
僕が悪いにしろ、そんな大事なファイルだったらちゃんとどこかに複製しておけよと凄く言い訳したくなりました..
なので次から同じミスをしないようコンテナで作業をする時はコンテナ内のリソースがAmazon S3で共有されるような環境を作ってみたいと思います。

##1.1 更新履歴
更新日 - 更新内容
2021年03月08日 - 画像、および、文言の差し替え

#2.概要
ハンズオンの手順、および、目標を以下に記載する。
<手順>
手順１：Amazon S3、および、AWS EC2の作成
手順２：StorageGatewayの構築、および、S3をEC2にマウント
手順３：Docker環境の構築

<目標>
Dockerコンテナ - Amazon S3間のリソース共有の実現

※本ハンズオンをDockerと互換性のあるpodmanで実機検証を行った結果、上記目標を達成できることを確認致しました。


#3.構成
本ハンズオンの構成図を以下に記載する。
![ver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/a6759f5e-66e6-f856-53fe-04dbe278b7dc.png)


本ハンズオンで目指す通信経路を以下に記載する。
・・・・・・・・・・・・・・
Amazon S3
↕
AWS Storage Gateway
↕
Amazon EC2
(DockerホストOS)
↕
Dockerコンテナ
・・・・・・・・・・・・・・
#4.Amazon S3の作成
・Amazon S3バケットを作成
S3バケットを作成して下さい。　バケット名はなんでも大丈夫です。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/e2e9ff90-b284-2e71-4503-b7171fc55f85.png)

・AWS EC2の作成
Dockerを構築する為の、EC2インスタンスを作成して下さい。
本ハンズオンではAmazon Linux2を使用します。
（Dockerが構築できればなんでもいいですファイルゲートウェイを選択して次へを選択）

#5.StorageGatewayの構築、および、S3をEC2にマウント
<b>《StorageGatewayの構築》</b>
StorageGatewayマネジメントコンソールから、「ゲートウェイの作成」を選択。

<b>[ゲートウェイの種類を選択]</b>
「ファイルゲートウェイ」にチェックを入れて、右下にある「次へ」をクリックし、次のページへ進んで下さい。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/fdf2df55-e9d1-d065-dc98-787802ebfdbe.png)


<b>[ホストプラットフォームの選択]</b>
「Amazon EC2」にチェックを入れて、右側にある「EC2インスタンスの起動」をクリック。
EC2インスタンスの作成に入ります。
![スクリーンショット (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/71ee1eb4-69cb-18e3-f5ea-29ffd36c097a.png)


********************** ここからEC2インスタンスの作成に入ります ************************

<b>[AMIの選択]</b>
恐らくスキップされます。
スキップされた場合、AMiは自動でコミュニティAMIのStorageGateway用のものが選択されています。
スキップされなかった場合、以下AMIを選択して下さい。
　
Storagegateway用AMI：［ami-0489767137bb9a979］
　

<b>[インスタンスタイプの選択]</b>
インスタンスタイプを選択します。
ここでは”m4 - xlarge”を選択
※ゲートウェイの機能のために少なくともxlarge以上のサイズが必要になります。
テスト目的、または、タイプの選択に悩んでいる方は”m4 - xlarge”の使用をおすすめします。
![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/56ed23cd-74e0-5b7d-fbb5-7ac68fdf7185.png)


<b>[インスタンスの設定]</b>
特に決まりはありませんが、最低限外と通信できるようにして下さい。

<b>[ストレージの追加]</b>
ファイルゲートウェイとしてのStorage Gatewayを機能させるためには、最低でも230GBの領域が必要ですので、上記画像のようにストレージを追加して下さい。
![スクリーンショット (49).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/2374a06a-4ea8-f252-4043-e9eb5684b3e8.png)

<b>[タグの追加]</b>
デフォルトのままで大丈夫です。

<b>[セキュリティグループの設定]</b>
以下要件を満たすよう設定して下さい。
・外と通信できる
・NFSポートの開放
※StorageGatewayではNFS接続を行うため、NFSのポート開放が必要になります。

設定できたらインスタンスを起動して下さい。

************************* EC2インスタンスの作成ここまで ******************************

<b>[サービスエンドポイントの選択]</b>
「パブリック」にチェックを入れて、右下の次へをクリック。
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/ab9d4c25-09d5-d169-d415-158c6ac49d29.png)


<b>[ゲートウェイに接続]</b>
先程起動したEC2インスタンスのPublicIPを入力して「ゲートウェイに接続」をクリック。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/fcdf6db1-0c70-65e9-37b3-913fe6aac054.png)


<b>[ゲートウェイのアクティブ化]</b>
ゲートウェイのタイムゾーンは東京を選択。
ゲートウェイ名はお好きな名前を入力して下さい。
　
アクティブ化をクリックするとStorageGatewayが構築され最後にログの設定へ移ります。
　
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/2efd1ca1-48f2-90ef-29a0-aae27c60aabc.png)


<b>[ローカルディスクの構成]</b>
ストレージがロードされるまで待ちましょう。
ログ等取りたい方はログ記録を設定から各種設定を行って下さい。
特に必要無い方は終了を押して下さい。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/26b6605c-5736-0927-c121-dd59b0bedff9.png)
　
以上でStorageGatewayの構築は終了となります。
　
<b>《S3をEC2にマウント》</b>
StorageGatewayを使用してS3をEC2にマウントします。
StorageGatewayマネジメントコンソールのナビゲーションメニューからファイル共有マネジメントコンソールへアクセス。
「ファイル共有の作成」を選択

<b>[ファイル共有の設定]</b>
Amazon S3 バケット名/プレフィックス名：
先程作成したS3パケット名を入力

ファイル共有名：自動で上記バケット名が反映

ゲートウェイ：先程作成したゲートウェイを選択

他はデフォルトのままで大丈夫です。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/12c4fe1f-37d4-4f91-53d8-f8473fabcb84.png)

<b>[ストレージ]</b>
デフォルトのままで大丈夫です。

<b>[確認]</b>
内容が間違っていないか確認して、ファイル共有の作成をクリック。
　
以上で、ファイル共有の作成が完了しました。
続いて、S3へのマウント作業を行います。
　
ファイル共有のマネジメントコンソールで先程作成したファイル共有を選択。
ページを下部にスクロールすると以下画像のように、マウント用のコマンドが発行されています。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/db7be9b5-acf5-6a2f-b86c-05e63d8ba59c.png)
EC2（Dockerホスト）にSSH接続し、上記コマンドを実行して下さい。

``` bash
#S3をEC2にマウント
sudo mount -t nfs -o nolock,hard *.*.*.*:/torage-docker-chibi /root/storage
```

以上でS3をEC2（Dockerホスト）にマウントすることが出来ました。
試しに上記コマンドで指定したフォルダにリソースを置いて見て下さい。
30秒程でS3にリソースが反映されると思います。
FTPサーバーみたいなことがこんな簡単に出来てしまうなんて凄いですね。。
では次の手順でDockerコンテナとS3間のファイル共有を実現しましょう。

#6.Docker環境の構築
EC2(Docker)でDocker環境を作成。
ホストのディレクトリ（S3からマウントしたディレクトリ）をコンテナにマウントしてホスト - コンテナ間で共有フォルダを作成し、ホストのディレクトリを通じてDockerコンテナ - S3間のファイル共有を実現します。

EC2（Dockerホスト）で下記手順（コマンド）を実行して下さい。

``` bash
# suに変身
$ sudo su -

# docker インストール & デーモン起動
$ yum install -y docker
$ systemctl start docker

# コンテナ起動 & S3からマウントしたディレクトをコンテナへマウント
sudo docker run -it -d \
--name centos7 \
-v /root/storage:/tmp/awss3 \
centos:centos7

# コンテナの確認
$ sudo docker ps

# コンテナへ接続
$ docker exec -it centos7 bash

# 確認用リソースをマウントされたディレクトリに作成
$ touch /tmp/awss3/test.txt 

# コンテナから離脱
$ exit

# コンテナで作成したリソースがホストで反映されているか確認
# llの結果が下記のようになればOK
$ cd /root/storage
$ ll
-rw-r--r-- 1 nfsnobody nfsnobody 0 *** * **:** test.txt
```

無事ホスト - コンテナ間のフォルダ共有が成功したでしょうか？
成功したら続いてS3バケットを見に行きましょう。
S3バケット内にコンテナで作成したリソースが反映されていれば本ハンズオンは無事完了となります。
お疲れ様でした。

#7.まとめ
ハンズオンはどうでしたか？無事最後まで完走できたでしょうか？
本記事を書くにあたって、StorageGatewayって有名なサービスなのに、意外とハンズオンドキュメントが少なく構築にとても苦労しました（汗）
最後にこの記事を読んでくれた方にお願いがあります。
StorageGatewayを使用して、Dockerコンテナへ直接S3をマウントする方法があるか調べて欲しいのです（汗）
自分には分かりませんでした（笑）
しかし本ハンズオンでも充分コンテナリソースの安全性は確保されるのでこれからコンテナ案件に取り組む方は是非本ハンズオンの構成を取り入れて見て下さい。
以上になります。ありがとうございました。