オンプレミス環境からS3に高速ファイル転送:ExpeDat Gateway for Amazon S3を使ってみた
西澤です。いざオンプレミスに構築済のシステムをAWS環境に移行しようとすると、大容量データの転送が不可欠です。その多くのケースでは、コストが安くて容量を気にせずに利用できるS3にデータを格納したくなると思います。EC2でFTPサーバを構築してS3へ転送するのは骨が折れますし時間もかかります。そこで高速にデータ転送が可能(700 Mbpsとの触れ込み!)というExpeDat Gateway for Amazon S3を試してみることにしました。
- AWS Solutions Architect ブログ: ExpeDat Gateway for Amazon S3を使ったビッグデータのクラウド移行
- Moving Big Data Into The Cloud with ExpeDat Gateway for Amazon S3 - AWS Big Data Blog
Expedat Gateway for Amazon S3の概要
システム構成
Expedatを利用したS3への転送環境は以下のようなイメージとなります。VPC内に構築したEC2がGatewayとしてS3へのファイル転送をサポートしてくれます。
構築に必要な作業
以下の作業が必要です。
- データ格納用のS3バケット
- Expedat Gatewayからアクセスが可能なS3バケット
- Expedat Gateway(EC2)
- 公開されているAMIからのEC2環境構築(適切なVPC環境を含む)
- Expedat Client(作業用サーバ)
- オンプレミス環境にクライアントソフトウェアを導入
- クライアントソフトウェアは構築したExpedat GatewayのWebよりダウンロード
利用料金
14日間のFreeTrialが可能ですが、ソフトウェア利用料は割とお高めです。クラウドのメリットは使いたい時だけ使いたい分だけ利用できること。ユースケースとして考えられるような一時的な初期構築時のデータ転送のみで利用するなら、データ移行作業を結果的に短期間で済ませられるので、そこまで割高にはならないのではないでしょうか?
下記は対応しているインスタンスタイプ別の東京リージョンでの料金表ですが、このうちのソフトウェア利用料金にのみ14日間のFreeTrialが適用されますが、EC2インスタンス利用料は計上されますのでご注意ください。長期間利用する場合には、月単位や年単位での利用オプションも選択できるようです。
EC2 Instance Type | EC2 Usage | Software | Total |
---|---|---|---|
m3.xlarge | $0.385/hr | $1.50/hr | $1.885/hr |
c4.large | $0.133/hr | $1.50/hr | $1.633/hr |
c4.xlarge | $0.265/hr | $1.50/hr | $1.765/hr |
c4.2xlarge | $0.531/hr | $1.50/hr | $2.031/hr |
Expedat Gateway(EC2)環境構築
それでは早速環境を構築してみましょう。AWS Marketplaceのページから、"Continue"をクリックします。
"Accept Terms"をクリックして、EC2を起動しましょう。Marketplaceの利用方法は、他のマシンイメージと同様です。
今回は"Manual Launch"から、手動で起動してみました。EC2起動操作は割愛しますが、SecurityGroupでは下記ポートの開放が必要です。また、インスタンスタイプはc4.xlargeを利用することにしました。
- SSH(tcp/22)
- 初期設定を行うクライアント環境から
- HTTP(tcp/80)
- ExpeDatクライアント環境から(ソフトウェアダウンロードの為)
- データ転送用(udp/8080)
- ExpeDatクライアント環境から
EC2インスタンスが起動したら、SSHログインしてみましょう。EC2起動時に指定したSSHキーペアを使ってec2−userでログインします。
SSHログインすると、自動的にスクリプトが実行され、Gatewayのセットアップが始まります。
ExpeDat Gateway for Amazon S3 Setup This script will gather information necessary to access an S3 bucket using ExpeDat. Enter the name of the target S3 bucket:expedat-bucket Getting credentials for the S3 bucket Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables. Access Key [ASIAxxxxxxxxxxxxxxxx]: Secret Key [hNd1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]: Default Region [US]: us-west-2 New settings: Access Key: ASIAxxxxxxxxxxxxxxxx Secret Key: hNd1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Default Region: us-west-2 Test access with supplied credentials? [Y/n] Y Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-) Save settings? [Y/n] Y Configuration saved to '/usr/local/expedat/s3cfg' Creating an ExpeDat account This username and password will be used to access the ExpeDat S3 Gateway Enter a username: [s3user]: Enter a password: Replacing /etc/svpasswd Restarting ExpeDat Server This ExpeDat Gateway for Amazon S3 should now be operational. This setup script can be repeated by logging back in and running: /usr/local/expedat/s3setup.sh To access S3 via this server, download an ExpeDat client from here: http://ec2-xxx-xxx-xxx-xxx.us-west-2.compute.amazonaws.com/ Then verify that the security group permits incoming UDP port 8080. Press Return to end this setup session Connection to xxx.xxx.xxx.xxx closed by remote host. Connection to xxx.xxx.xxx.xxx closed.
全ての入力が完了すると、一旦接続が自動的に切断されましたが、もう一度ec2−userでログインすると、普通にLinuxインスタンスとして操作できるようでした。上記コマンド結果に出力がありますが、セットアップをやり直したい場合には/usr/local/expedat/s3setup.sh
を実行すれば良いようです。
セットアップでは、下記情報の入力が必要です。
- 作成済のS3バケット名
- アクセスキー/シークレットアクセスキー
- 利用リージョン
- ExpeDat接続用ユーザ名/パスワード(クライアントから接続する際の認証情報をここで新規に設定)
アクセスキー/シークレットアクセスキーの項目ですが、EC2インスタンスに対象S3バケットへのアクセスが可能なIAMロールを割り当てたところ指定せずに動作することが確認できました。"Leave them empty for using the env variables."とのことでしたが、内部的にはs3cmdを使っているようで、インスタンスプロファイル(IAMロール)権限も自動で参照してくれるので、個別にアクセスキーを作成する必要は無さそうです。
以上でGateway環境の構築は完了です。簡単ですね。
Expedatクライアント環境の構築
続いてクライアント環境をセットアップしましょう。今回はWindows Server 2008 R2環境を利用しました。SecurityGroupが適切に設定されていれば、EC2インスタンスに割り当てられたPublic IPアドレスにクライアント環境のブラウザから接続できるはずです。
こちらからクライアントツールをダウンロードしましょう。GUIベースのクライアントは、Windows OSとMac OS X環境のみ用意されているようです。今回はWindows用のフルクライアントパッケージをダウンロードしました。インストール作業は不要で、zipに含まれるexeファイルを起動するだけで利用できました。
それぞれのツールを利用してS3へのファイル転送を確認してみましょう。
MTPexpedat
MTPexpedatは、Windows環境ではお馴染みのFTPやSFTPのクライアントツールによく似たUIを持つ転送ツールです。早速exeファイルを実行してみましょう。接続するサーバの情報とユーザ/パスワードを入力し、Handlersに"S3"を選択して、矢印のボタンをクリックするとGatewayに接続します。
転送対象のファイルを選択し、"Send"ボタンをクリックすると転送が始まりました。転送中は、途中経過や終了時間予測がウィンドウ下部に表示されます。
無事にS3に格納されました!
ちょっと注意です。S3オブジェクトに理解がある方には当然の挙動かもしれませんが、UIからS3バケット上にフォルダを作成するボタンが正常に機能しませんでした。
S3バケット内にフォルダを作ってファイルを配置したい場合には、prefix指定をすればフォルダ配下にファイルを格納することができるようです。
DropDat
DropDatは転送用環境を事前にセットアップして、ファイルをドラッグ&ドロップして利用することができる転送ツールです。こちらもexeファイルを実行してみます。NewNameの欄には、"DropDat"以外の名前を指定する必要があります(理由はこの後を読めばわかります)。サーバの接続情報やユーザ情報を入力し、"Create"をクリックします。フォルダごと転送をする"Streaming Folders"のチェックボックスは、MTPexpedatの設定画面にも存在していましたが、S3 Handlerからは有効としてもエラーとなり、利用できませんでした。
すると、同一フォルダ内に指定した名前のexeファイルが生成されました。こちらに転送したいファイルをドラッグ&ドロップして利用します。
こちらからも無事に転送が確認できました。パス指定をする場合は、exeを生成する際に"Destination Folder"にprefixを指定しておく必要があるようです。
movedat
movedatはコマンドラインから利用できるクライアントツールです。コマンドプロンプトからexeファイルを格納したフォルダに移動するか、PATH指定をすることで利用できます。
>movedat movedat - 1.17.0 October 2015 - DEI usage: LIST movedat [options] [user@]host:[directory/] GET movedat [options] [user@]host:[path] <file> GET movedat [options] [user@]host:[path] [[user@]host:[path]...] <dir> SEND movedat [options] <file> [<file>...] [user@]host:[path] MOVE movedat [options] -m [user@]host:oldpath newpath DELETE movedat [options] -x [user@]host:deletepath ... MKDIR movedat [options] -n [user@]host:newfolder ... FIND movedat [options] -F [user@]host:<pattern> CACHE movedat [-p port] [-A|-E] user[:passwd]@host "movedat -v" for more options >movedat -v (C)2015 Data Expedition, Inc.(R) US Pat. 7158479,7313627,7404003,7630315,8014289 movedat - 1.17.0 October 2015 - DEI, EXP-1.17.0, DOC-2.1.2 MTP-win32-4.2.0 1692 00000002: ExpeDat-1.17A Gateway for Amazon S3 - 151130, Client usage: LIST movedat [options] [user@]host:[directory/] GET movedat [options] [user@]host:[path] <file> GET movedat [options] [user@]host:[path] [[user@]host:[path]...] <dir> SEND movedat [options] <file> [<file>...] [user@]host:[path] MOVE movedat [options] -m [user@]host:oldpath newpath DELETE movedat [options] -x [user@]host:deletepath ... MKDIR movedat [options] -n [user@]host:newfolder ... FIND movedat [options] -F [user@]host:<pattern> CACHE movedat [-p port] [-A|-E] user[:passwd]@host Argument Config Help -a <integer> Aggression MTP aggression level (-3 to 5) -A <string> Permanently cache credentials -b <integer> StreamSize Compression and packing buffer (kilobytes) -B BuildPath Create remote directories as required -c NoCheck No checkfiles, disable download resume -C NoPWCache Do not use the password cache -d <integer> Debug Diagnostic level (0 to 6) -D Display Deliver contents to stdout -e <integer> Expire Idle timeout (seconds) -E <string> Expire credentials now -f <path> Alternate configuration file, "" for none -F Find files matching wildcard pattern -h Transfer folder contents one file at a time -H ShowHidden Include hidden files -i Transfer folder contents as a stream -I IgnoreExisting Skip files which already exist -k <integer> MaxRate Speed limit (kilobytes/second) -K Encrypt Require content encryption -L <integer> Latency Advise large minimum RTT (milliseconds) -m Move/rename a remote file or directory -M <integer> MaxRTT Limit RTT (milliseconds) -n Create a new remote directory -N <integer> NoiseRatio Loss tolerance factor (4 to 5000) -o Objects Run server scripts as object handlers -O StartOver Do not resume interrupted transfers -p <integer> Port Look for server on alternate UDP port -q Quiet Minimal output, non-interactive -r Resume interrupted transfers when possible -R Register a license code -s ShowLogs Output parseable log format -S <integer> StopTime Limit total runtime (minutes) -t <string> TryInterval Set retry behavior ("fail", "skip", or seconds) -T <integer> MaxDatagram Maximum UDP payload size (bytes) -U <integer> MinDatagram Minimum UDP payload size (bytes) -v Display version and help -W <string> Set user domain for Windows servers -x Delete one or more remote files -y Yes Answer 'y' (default) to all queries -z Compress Enable inline compression
コマンドラインからもファイルを転送してみましょう。今回は2つのファイルを指定して、新しいフォルダに向けてファイルを転送してみました。複数指定した場合には、シーケンシャルに動作するようですね。
>movedat -o testfile3 testfile4 s3user@xxx.xxx.xxx.xxx:testdir3/=S3 Password for s3user@xxx.xxx.xxx.xxx: 1.00 gigabytes of 1.00 gigabytes at 41.2 megabits/sec testfile3 1.00 GB in 39.5 sec ( 218 mbit/s) 1.00 gigabytes of 1.00 gigabytes at 55.2 megabits/sec testfile4 1.00 GB in 37.0 sec ( 232 mbit/s)
アップロードされたファイルをリストしてみます。2回目の接続時はパスワードが聞かれませんでした。しばらくキャッシュする仕様のようなので、継続して利用したい場合には、"-A"オプションを指定することで、Credential情報を保存して利用することができるようです。詳細は前述のコマンドオプションをご覧ください。
>movedat -o s3user@xxx.xxx.xxx.xxx:testdir3/=S3 -rwxrwxrwx 1,073,741,824 Jan 30 2016 16:19 testfile3 -rwxrwxrwx 1,073,741,824 Jan 30 2016 16:20 testfile4
このツールでもS3にファイルが転送されていることを確認できました。
まとめ
今回は、大容量ファイルをS3に高速転送するツールをご紹介しました。今回検証したクライアント環境は、同一リージョン内のEC2インスタンスを利用した為、参考値にしかなりませんが、1GBのファイルを30s前後で転送できる(200〜300Mbps)ことが確認できましたので、1TBのファイルなら8.5hくらいの計算になります。安定してこれくらいの速度が出るなら、かなり有用なツールになりますね。ただし、実際の性能については、Gatewayのインスタンスタイプや、クライアントマシンの性能、インターネット接続環境等にも依存すると思われます。また、AWS環境への安定したネットワーク性能を確保したい場合には、Direct Connectを利用できれば確実です。
エラー発生時の挙動や、複数ファイルを同時に取り扱うケース、負荷がかかった場合にどこがボトルネックになるか等、実際に利用にはもう少し調査が必要です。その結果については、また改めてご報告できればと思います。