EC2 - S3通信はVPCにエンドポイントを作成することでインターネットを介することなくAWS内ネットワークで完結させて通信できることを知り、さっそく通信速度を比べてみた。
前提
- EC2 は
Amazon Linux(t2.micro)
- Regionは
サンパウロ
- テストデータとして 106MB のファイル、4MB×10個 のファイルを用意
- キャッシュなどの仕組みがある可能性を考慮し、インターネット経由用とエンドポイント経由用にそれぞれ別バケットを作成し、上記のテストデータを配置した。
- テストデータをaws cliでダウンロードしコマンド時刻時間を
time
コマンドで測定する。 - 測定を各2回行い、1回目と2回目の速度差も確認する。
- 十
測定
インターネット経由のダウンロード時間測定
インターネット経由で測定する。
まずは106MBのファイル1つをダウンロードするのに要する時間を測定する。
# 測定 1回目
[root@ip-172-31-13-183 single]# time -p aws s3 cp --region sa-east-1 s3://via-internet/singleFile/106MB.zip .
download: s3://via-internet/singleFile/106MB.zip to ./106MB.zip
real 2.31
user 0.96
sys 0.58
# 測定 2回目
[root@ip-172-31-13-183 single]# time -p aws s3 cp --region sa-east-1 s3://via-internet/singleFile/106MB.zip .
download: s3://via-internet/singleFile/106MB.zip to ./106MB.zip
real 2.42
user 1.02
sys 0.44
2.31秒
と2.42秒
という結果だった。
2回目の方がやや時間がかかってしまった。キャッシュ機構などはなさそうだ。
つづいて、4MB×10個を一気にダウンロードする時間を測定する。
sync
コマンドを使ったので2回目は何もダウンロードされないはずだが、、、果たして、、、
# 測定 1回目
[root@ip-172-31-13-183 multi]# time -p aws s3 sync --region sa-east-1 s3://via-internet/multiFile .
download: s3://via-internet/multiFile/image (1).BMP to ./image (1).BMP
download: s3://via-internet/multiFile/image (6).BMP to ./image (6).BMP
download: s3://via-internet/multiFile/image (8).BMP to ./image (8).BMP
download: s3://via-internet/multiFile/image (5).BMP to ./image (5).BMP
download: s3://via-internet/multiFile/image (3).BMP to ./image (3).BMP
download: s3://via-internet/multiFile/image (9).BMP to ./image (9).BMP
download: s3://via-internet/multiFile/image (7).BMP to ./image (7).BMP
download: s3://via-internet/multiFile/image (2).BMP to ./image (2).BMP
download: s3://via-internet/multiFile/image (4).BMP to ./image (4).BMP
download: s3://via-internet/multiFile/image (10).BMP to ./image (10).BMP
real 1.46
user 0.64
sys 0.20
# 測定 2回目
[root@ip-172-31-13-183 multi]# time -p aws s3 sync --region sa-east-1 s3://via-internet/multiFile .
real 1.49
user 0.32
sys 0.04
[root@ip-172-31-13-183 multi]#
1.46秒
と1.49秒
という結果だった。
プロンプトを見るとわかるが2回目の実行ではなんもダウンロードされることなくコマンドが完了している。
しかし、実行時間は1回目と変わらなかった。
エンドポイント経由のダウンロード時間測定
つづいてエンドポイント経由で測定する。
エンドポイントの作成方法については分かりやすい記事があったのでそちらを参考に。
【新機能】S3がVPCのプライベートサブネットからアクセス可能になりました!
一応エンドポイントが正しく作れたかどうか確認してみる。
プライベートネットワークにしか繋がっていないインスタンスからS3にアクセスを使用としてもタイムアウトエラーしてしまう。
[ec2-user@ip-172-31-100-87 ~]$ aws s3 ls s3://via-endpoint/multiFile/
fatal error: HTTPSConnectionPool(host='s3.amazonaws.com', port=443): Max retries
exceeded with url: via-endpoint/multiFile/ (Caused by ConnectTimeoutError(<botocore.awsrequest.AWSHTTPSConnection obj
ect at 0x7fda8c3da9d0>, 'Connection to s3.amazonaws.com timed out. (connect time
out=60)'))
エンドポイント作成後に同じコマンドを実行すると今度はちゃんと返ってくる。
[ec2-user@ip-172-31-100-87 ~]$ aws s3 ls s3://via-endpoint/multiFile/ --region sa-east-1
2017-11-29 03:57:30 0
2017-11-29 04:00:26 4320054 image (1).BMP
2017-11-29 04:03:20 4320054 image (10).BMP
2017-11-29 04:00:46 4320054 image (2).BMP
2017-11-29 04:01:04 4320054 image (3).BMP
2017-11-29 04:01:27 4320054 image (4).BMP
2017-11-29 04:01:46 4320054 image (5).BMP
2017-11-29 04:02:05 4320054 image (6).BMP
2017-11-29 04:02:24 4320054 image (7).BMP
2017-11-29 04:02:42 4320054 image (8).BMP
2017-11-29 04:03:02 4320054 image (9).BMP
準備も整ったので測定にはいる。
まずは106MBのファイル1つをダウンロードするのに要する時間を測定する。
# 測定 1回目
[ec2-user@ip-172-31-100-87 single]$ time -p aws s3 cp --region sa-east-1 s3://via-endpoint/singleFile/106MB.zip .
download: s3://via-endpoint/singleFile/106MB.zip to ./106MB.zip
real 2.86
user 0.87
sys 0.16
# 測定 1回目
[ec2-user@ip-172-31-100-87 single]$ time -p aws s3 cp --region sa-east-1 s3://via-endpoint/singleFile/106MB.zip .
download: s3://via-endpoint/singleFile/106MB.zip to ./106MB.zip
real 3.52
user 0.90
sys 0.20
2.86秒
と3.52秒
となった。
2回目の結果がやはり遅い。。。
つづいて、4MB×10個を一気にダウンロードする時間を測定する。
# 測定 1回目
[ec2-user@ip-172-31-100-87 multi]$ time -p aws s3 sync --region sa-east-1 s3://via-endpoint/multiFile .
download: s3://via-endpoint/multiFile/image (5).BMP to ./image (5).BMP
download: s3://via-endpoint/multiFile/image (8).BMP to ./image (8).BMP
download: s3://via-endpoint/multiFile/image (2).BMP to ./image (2).BMP
download: s3://via-endpoint/multiFile/image (1).BMP to ./image (1).BMP
download: s3://via-endpoint/multiFile/image (7).BMP to ./image (7).BMP
download: s3://via-endpoint/multiFile/image (4).BMP to ./image (4).BMP
download: s3://via-endpoint/multiFile/image (10).BMP to ./image (10).BMP
download: s3://via-endpoint/multiFile/image (6).BMP to ./image (6).BMP
download: s3://via-endpoint/multiFile/image (3).BMP to ./image (3).BMP
download: s3://via-endpoint/multiFile/image (9).BMP to ./image (9).BMP
real 1.70
user 0.58
sys 0.11
# 測定 2回目
[ec2-user@ip-172-31-100-87 multi]$ time -p aws s3 sync --region sa-east-1 s3://via-endpoint/multiFile .
real 0.55
user 0.35
sys 0.00
1.70秒
と0.55秒
となった
今度は2回目が早い!
測定結果まとめ
大きいのファイル(104MB)
インターネット経由
104MB 1回目: 2.31秒
104MB 2回目: 2.42秒
エンドポイント経由
104MB 1回目: 2.86秒
104MB 2回目: 3.52秒
複数の小さいファイル(4MB×10)
インターネット経由
4MB×10 1回目: 1.46秒
4MB×10 2回目: 1.49秒
エンドポイント経由
4MB×10 1回目: 1.70秒
4MB×10 2回目: 0.55秒
結論
- インターネット経由とエンドポイント経由でダウンロード速度に有意な差は認められなかった
- 良くアクセスするファイルは早くダウンロードできるかと思ったがそのような仕組みではなさそうだ
- エンドポイントにメリットはシステム内部通信(EC2 - S3)をインターネットにさらさずに済むことだと言える。
ところで
EC2とS3の通信料は無料らしいのだが、S3は一体普通のAPIアクセスとEC2からのアクセスをどのように識別しているのだろう???
疑問が残る。