EC2-S3間の通信速度をインターネット経由とエンドポイント経由で比べてみた

EC2 - S3通信はVPCにエンドポイントを作成することでインターネットを介することなくAWS内ネットワークで完結させて通信できることを知り、さっそく通信速度を比べてみた。


## 前提
 - EC2 は `Amazon Linux(t2.micro)`
 - Regionは`サンパウロ`
 - テストデータとして 106MB のファイル、4MB×10個 のファイルを用意
 - キャッシュなどの仕組みがある可能性を考慮し、インターネット経由用とエンドポイント経由用にそれぞれ別バケットを作成し、上記のテストデータを配置した。
 - テストデータをaws cliでダウンロードしコマンド時刻時間を`time`コマンドで測定する。
 - 測定を各2回行い、1回目と2回目の速度差も確認する。
 - 十


## 測定

### インターネット経由のダウンロード時間測定

インターネット経由で測定する。
まずは106MBのファイル1つをダウンロードするのに要する時間を測定する。

``` bash
# 測定 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回目は何もダウンロードされないはずだが、、、果たして、、、

``` bash
# 測定 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のプライベートサブネットからアクセス可能になりました！](https://dev.classmethod.jp/cloud/vpc-endpoint-for-s3/)


一応エンドポイントが正しく作れたかどうか確認してみる。
プライベートネットワークにしか繋がっていないインスタンスからS3にアクセスを使用としてもタイムアウトエラーしてしまう。

``` bash
[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)'))

```


エンドポイント作成後に同じコマンドを実行すると今度はちゃんと返ってくる。

``` bash
[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つをダウンロードするのに要する時間を測定する。

``` bash
# 測定 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個を一気にダウンロードする時間を測定する。

``` bash
# 測定 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からのアクセスをどのように識別しているのだろう？？？
疑問が残る。