[AWS] EC2 上で Storage Gateway (ゲートウェイキャッシュ型ボリューム)を構築する。

こんにちは、与儀です。

Storage Gateway はざっくり言うと、S3領域に対して大容量のストレージを構築して、iscsi経由でファイルをアップロードダウンロードすることができるサービスです。オンプレミスのサーバでStorage Gatewayを構築して、S3領域を利用することもできますが、ここではEC2上にStorage Gatewayを構築する場合で考えます。

Storage Gatewayの利用ケースとしては、すでにNFSを利用した大容量ファイルストレージを利用していて、それをAWSへ持っていきたいが、NFSの構成がアプリの仕様上どうしても変更できない場合、などが考えらえれます。

この記事では、Storage Gatewayを構築して、iscsi接続するまでをとても簡単にですが、説明していきます。

Storage Gateway (ゲートウェイキャッシュ型ボリューム)を構築する

下記のドキュメントを主に参考にします。

ボリューム ゲートウェイのセットアップ(ゲートウェイキャッシュ型とゲートウェイ保管型)

サービス一覧から「Storage Gateway」を選択します。※東京リージョンを選択していることを確認してください。

「Amazon EC2 で新しいゲートウェイをデプロイする」を選択します。

「Gateway AMI を起動」を選択します。

AWSマーケットプレイスのEC2インスタンスの起動画面になります。リージョンが東京リージョンになっていることを確認して、「Continue」を選択します。

リージョンが東京リージョンであること、インスタンスタイプがこの中で最安のm2.xlargeであることを確認して、「Accept Terms & Launch with 1-Click」を選択します。ここでは、詳細設定を省くため、1-Click Launchでの起動をしております。

起動中となります。費用が発生することにご注意ください。

EC2ダッシュボードに戻ると、m2.xlargeのインスタンスが起動中であることがわかります。ここでこのインスタンスのパブリックIPアドレスをメモしてください。

再度、Storage Gateway のダッシュボードに戻り、「Amazon EC2 で新しいゲートウェイをデプロイする」を選択します。

先ほどメモした、EC2インスタンスのパブリックIPアドレスを入力して「アクティベーションへ進む」を選択します。

AWS Storage Gateway 仮想マシンのアクティブ化の画面になります。ゲートウェイのタイムゾーンを「(GMT 9:00)東京~」、ゲートウェイ名に任意の名前を入力して、「自分のストレージゲートウェイのアクティブ化」を選択します。

ボリュームゲートウェイに「SGW-TEST」が追加されるので、それを選択して、再度「ボリュームを作成」を選択します。

が、エラーとなってしまいます。これは、アップロードバッファとキャッシュストレージのローカルストレージ設定がされていないことによるものです。なので、まずはローカルストレージを設定します。

「EC2ダッシュボード」→「ELASTIC BLOCK STORE」→「ボリューム」→「ボリュームの作成」を選択して下記のように入力して、作成を選択します。※アベイラビリティゾーンは、Storage Gatewayのインスタンスが起動している場所と同じところを選択します。

作成されたボリュームにNameタグで任意の名前を付けておきましょう。その後、右クリックで「ボリュームのアタッチ」を選択します。

ボリュームのアタッチで、Storage Gatewayのインスタンスを選択します。

これでアタッチ完了です。ではもう一度、ローカルストレージの設定をしてみましょう。
「Storage Gatewayダッシュボード」→「ゲートウェイ」→「ローカルストレージを設定」を選択します。

すると、先ほどはできなかったローカルディスク選択の画面になりました!プルダウンから「アップロードバッファに使用する」を選択して、保存を押します。

同様に、EBSボリュームを作成して、Cache Storage も追加しておきましょう。

これで、キャッシュストレージ、アップロードバッファの設定は完了です。

次に、ボリュームを作成します。
「SGW-TEST」→「ボリューム」タブの「ボリュームの作成」を選択します。

「次へ」を選択します。

「スキップ」を選択します。

「スキップ」を選択します。

下記のように入力して、「ボリュームを作成」を押します。

「CHAP」認証の設定は、こちらも「スキップ」を選択します。

これで、ボリュームの作成は完了です。

ボリュームが作成されました!以上で、Storage Gatewayの作成は完了です。

この後は、このStorage Gatewayのインスタンスへ、iscsiマウントをするために TCP 3260 ポートをセキュリティグループで許可設定します。ここでは、iscsiクライアントとなるEC2インスタンスに設定されているセキュリティグループのグループIDを接続元として追加しています。

以上で準備が整いました、次にiscsiクライアントのEC2サーバから、iscsi接続を実施します。

iscsiクライアントのEC2サーバからiscsi接続をする

こちらのドキュメントを主に参考にします。

Red Hat クライアントからストレージボリュームへの接続

iscsi-initiator-utilsをインストールします。

[root@ip-172-31-8-243 ~]# yum install iscsi-initiator-utils

ゲートウェイに対して定義されているストレージボリュームターゲットを検出するために、起動したStorage GatewayインスタンスのプライベートIPアドレスを指定して、次の discovery コマンドを使用します。

[root@ip-172-31-8-243 ~]# /sbin/iscsiadm --mode discovery --type sendtargets --portal 172.31.3.174:3260
Starting iscsid: [ OK ]
172.31.3.174:3260,1 iqn.1997-05.com.amazon:testvolume1
[root@ip-172-31-8-243 ~]#

ターゲットに接続するには、以下のコマンドを使用します。

[root@ip-172-31-8-243 ~]# /sbin/iscsiadm --mode node --targetname iqn.1997-05.com.amazon:testvolume1 --portal 172.31.3.174:3260,1 --login
Logging in to [iface: default, target: iqn.1997-05.com.amazon:testvolume1, portal: 172.31.3.174,3260] (multiple)
Login to [iface: default, target: iqn.1997-05.com.amazon:testvolume1, portal: 172.31.3.174,3260] successful.
[root@ip-172-31-8-243 ~]#

ボリュームがクライアントマシン(イニシエータ)にアタッチされていることを確認するには、次のコマンドを使用します。
●接続前

[root@ip-172-31-8-243 ~]# ls -l /dev/disk/by-path
total 0
lrwxrwxrwx 1 root root 10 Sep 15 09:31 xen-vbd-51712 -> ../../xvda
lrwxrwxrwx 1 root root 11 Sep 15 09:31 xen-vbd-51712-part1 -> ../../xvda1
[root@ip-172-31-8-243 ~]#

●接続後

[root@ip-172-31-8-243 ~]# ls -l /dev/disk/by-path
total 0
lrwxrwxrwx 1 root root 9 Sep 15 09:40 ip-172.31.3.174:3260-iscsi-iqn.1997-05.com.amazon:testvolume1-lun-0 -> ../../sda
lrwxrwxrwx 1 root root 10 Sep 15 09:31 xen-vbd-51712 -> ../../xvda
lrwxrwxrwx 1 root root 11 Sep 15 09:31 xen-vbd-51712-part1 -> ../../xvda1
[root@ip-172-31-8-243 ~]#

そのままでは/dev/sdaはマウントしようとすると、フォーマットエラーになります。

[root@ip-172-31-8-243 ~]# mount /dev/sda /mnt
mount: /dev/sda is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/sda,
 missing codepage or helper program, or other error
 
 In some cases useful info is found in syslog - try
 dmesg | tail or so.
[root@ip-172-31-8-243 ~]#

ので、ext4でフォーマットします。

[root@ip-172-31-8-243 ~]# mkfs.ext4 /dev/sda
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 26214400 4k blocks and 6553600 inodes
Filesystem UUID: 04c4687d-f22d-4462-8eca-89b19b8e3ea3
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
 4096000, 7962624, 11239424, 20480000, 23887872
 
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
 
[root@ip-172-31-8-243 ~]#

これでマウントできました!

[root@ip-172-31-8-243 ~]# mount -t ext4 /dev/sda /mnt
[root@ip-172-31-8-243 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.8G 1.2G 6.6G 15% /
devtmpfs 490M 60K 490M 1% /dev
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda 99G 60M 94G 1% /mnt
[root@ip-172-31-8-243 ~]#

ここまでの内容をざっくり図にすると↓のような状況です。

以上のように、比較的簡単に? Storage Gateway を構築して接続するまでできました。ですがStorage Gatewayは実際に使ってみると、運用面でいろいろと癖があるので導入する場合は、いくつか注意する必要があります。

ちょっと古いですが今年の4月に私がJAWS-UG沖縄の勉強会で発表したときのスライド資料も参考にしてもらえると幸いです。

以上です。