爆速で日本から中国へファイルアップロードする方法：Alibaba Cloud OSS TA

#本記事の背景
日本から中国へ動画やCADデータなど大容量のデータを送りたいケースがあります。その際にInternetを使って送ることが非常に困難です。中国のInternetには海外との通信に対して制限がかかっているからです。また中国から海外へのInternet回線も混み合っている場合があり通常のWebサイトを見るだけでも満足な速度が得られないケースがあります。１GByteなどの大容量のファイルを送り受けするなど現実的ではありません。

　日本国内のInternet環境でも1GByteのファイルを送信・受信するのは容易ではありません。例として私の自宅のInternet回線の速度は速度測定サイトで計測すると54Mbpsでした（結構出ている）。この環境で１GByteのファイルを受信しようとすると以下の計算で時間を計算できます。
　1GByte x 8 bit / 54Mbps = 約148秒　（2分28秒）

　今回の記事では、この日本ー中国の間を高速転送かけられるAlibaba Cloud OSS Transfer Accelerationサービスを検証してみます。結論として送信サーバのインタフェース性能の最大値100Mbpsの速度が発揮できました。日本ー中国間でInternetを使って業務をしている人ならこの驚異的な数字に目をみはるはずです（しかも料金は激安）。では早速、検証方法を紹介していきます。

#検証構成
　今回の検証は、非常に簡単な構成で行うことができます。東京リージョンおよび比較のために香港リージョンにファイル送信サーバ（仮想サーバ ECS）を設置。中国では上海リージョンと北京リージョンに受信側のオブジェクトストレージ（OSS）を設定します。参考コストは最後に記載します。
![爆速日中ファイルアップロード方法 OSS TA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/a224cc6e-284a-720f-7fca-07f5896d9af4.png)

*EP:OSSのアップロード先エンドポイント
*RG:Regionの略
*ECS: AWSでいうところのEC2、仮想サーバ
*OSS: AWSでいうところのS3、オブジェクトストレージ
*VPC:バーチャルプライベートクラウド、AWSでも同じVPCです。

#検証手順
検証手順は以下のような順で行なっていきます。
1.上海RGと北京RGにOSSにバケットを作る
2.AlibabaCloudのRAMアカウント（API操作用のアカウント）を作る
3.送信サーバ（ECS)を作る
4.送信サーバにossutilをインストール/設定する
5.アップロードテストを行う
6.結果比較
##6.結果比較
まずは結果が気になりますよね。そこで手順はあとで見ていただくこととして結果をまず共有させていただきます。
東京RGのECSから上海RG、北京RGのOSSへアップロードした結果です。OSS InternetとはInternet経由のEPを利用した場合。OSS TAとはTransfer Accelerationを利用した場合です。

OSS TAを利用した場合、転送速度が約13000KB/S＝約100Mbpsにもなっています。
13000KByte/S x 8bit = 104,000KBit/sec =104Mbps

一方OSS Internet経由ではばらつきがひどく21.3KB/S＝約170Kbpsほどしか出ない状況もあります。平日のInternet最繁時間での測定なので混み合っているのかと思います。

![chart (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/964706c9-a54c-0bc8-b68f-c2f0d1907d9e.png)

| Source     | Destination       | average speed KB/s | Test Time  |
|------------|-------------------|---------------|------------|
| 東京RG ECS | 北京 OSS Internet | timeout       | 5/26 22:00 |
| 東京RG ECS | 北京 OSS Internet |          21.3 | 5/26 22:00 |
| 東京RG ECS | 北京 OSS Internet |         21.96 | 5/26 22:00 |
| 東京RG ECS | 上海OSS Internet  |        949.63 | 5/26 21:30 |
| 東京RG ECS | 上海OSS Internet  |       1635.08 | 5/26 21:30 |
| 東京RG ECS | 上海OSS Internet  |        851.53 | 5/26 21:30 |
|            |                   |               |            |
| 東京RG ECS | 北京 OSS TA       |      13078.43 | 5/26 22:00 |
| 東京RG ECS | 北京 OSS TA       |      12889.84 | 5/26 22:00 |
| 東京RG ECS | 北京 OSS TA       |      13077.29 | 5/26 22:00 |
| 東京RG ECS | 上海OSS TA        |      13094.76 | 5/26 21:45 |
| 東京RG ECS | 上海OSS TA        |      13094.43 | 5/26 21:45 |
| 東京RG ECS | 上海OSS TA        |      13094.11 | 5/26 21:45 |

香港RGのECSから上海RG、北京RGのOSSへアップロードした結果です。OSS TA経由では同じく100Mbpsほど出ています。香港〜中国間は比較的インターネット経由でも速度が出るという話し（噂）もあるのですが実際には全く不安定で速度も十分とは言えない状況のようです。
![chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/4e5605a4-0e74-f7c4-7bee-564c32472515.png)

| Source      | Destination       | average speed KB/s | Test Time  |
|-------------|-------------------|---------------|------------|
| 香港 RG ECS | 北京 OSS Internet |        150.14 | 5/26 22:30 |
| 香港 RG ECS | 北京 OSS Internet |        113.78 | 5/26 22:30 |
| 香港 RG ECS | 北京 OSS Internet |         116.5 | 5/26 22:30 |
| 香港 RG ECS | 上海OSS Internet  |        626.24 |  5/27 2:00 |
| 香港 RG ECS | 上海OSS Internet  |       1421.03 |  5/27 2:00 |
| 香港 RG ECS | 上海OSS Internet  |       4207.77 |  5/27 2:00 |
|             |                   |               |            |
| 香港 RG ECS | 北京 OSS TA       |      13086.59 | 5/26 22:00 |
| 香港 RG ECS | 北京 OSS TA       |      13087.24 | 5/26 22:00 |
| 香港 RG ECS | 北京 OSS TA       |      12875.28 | 5/26 22:00 |
| 香港 RG ECS | 上海OSS TA        |      13089.53 |  5/27 2:00 |
| 香港 RG ECS | 上海OSS TA        |      13038.91 |  5/27 2:00 |
| 香港 RG ECS | 上海OSS TA        |      13089.37 |  5/27 2:00 |

実際に送信サーバからも利用可能なインタフェース速度いっぱいまで使われていることがCloud Moniter(Alibaba Cloudの基本管理ツール）からわかります。
<img width="1094" alt="スクリーンショット 2020-05-26 22.25.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/29df021e-d97f-c2a2-5ae6-4d5dcf8c6fd3.png">

##1.OSSにバケットを作る
OSSのバケット作成は作りたいリージョンを選択してバケット名を入力するだけで簡単に作成できます。バケットを作成したあとに、Transfer Accelerationのためのエンドポイントを有効化します。
<img width="795" alt="スクリーンショット 2020-05-26 20.31.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/26cce6ac-d53f-ef3a-5385-0ca7ef4b0d84.png">

バケットの作成ができ基本データ画面が表示されます。
<img width="1119" alt="スクリーンショット 2020-05-26 20.33.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/dda897ad-6a5e-75d6-ab41-9d7ce5fd024a.png">

画面をスクロールすると「転送アクセラレーションアクセス」の有効化ボタンがあります。これを有効化するだけで高速に転送できるエンドポイントが作成されます。
<img width="889" alt="スクリーンショット 2020-05-26 20.33.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/0f205e7c-7fae-2ebc-0bb4-324f95189356.png">

有効化後にエンドポイントとBucketドメインが表示されます。これをアップロード時に利用します。
<img width="878" alt="スクリーンショット 2020-05-26 20.23.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/8237bff6-e12e-aa25-a526-11828f6b3db0.png">
##2.AlibabaCloudのRAMアカウント（API操作用のアカウント）を作る
送信サーバからOSSのバケット操作をコマンドラインで操作できるようにRAMアカウントを作成しておきます。＊RAM：Resource Access Management（RAMアカウントとはAWSでいうところのIAMの事です。）
　RAMのメニューを開くとクイックスタートというメニューがあるので、そこからアカウントの作成を選択すると簡単にできます。
<img width="1087" alt="スクリーンショット 2020-05-27 0.25.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/24155274-c05d-781b-e19d-ee5d5c4b76b3.png">
アカウントの種類は「プログラムによるアクセス」を選択しておきます。
<img width="703" alt="スクリーンショット 2020-05-27 0.25.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/b3650a1d-2509-a3a6-7b8b-8fefd9116aa4.png">

作成したアカウントにOSSをFullアクセスできる権限を付与しておきます。
<img width="666" alt="スクリーンショット 2020-05-27 0.27.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/a4598a1f-8762-5aee-9b14-55d2b9b7b238.png">
RAMアカウントのAccessKeyIDとAccessKey Secret を後ほど利用しますので控えておきます。
（AccessKey Secretは一度しか表示されないのでご注意を）
##3.送信サーバを作る
 ここではECSを立ち上げる手順は割愛します。こちらのヘルプを見ると参考になると思います。
[ECSのクイックスタート](https://www.alibabacloud.com/help/ja/doc-detail/25422.htm?spm=a2c63.l28256.a3.26.127a58a7r5kMo2)
特別な環境は利用していません。必要最低限のサーバー環境を作ってください。ちなみに今回選択したサーバ種類は最低スペックの以下のインスタンスです。（100Mbpsのインターフェース性能までしかないものにしています。後ほどの速度測定でこの数値が限界値になります。もっと高速を選んでもよかったかもしれません）
・バースト可能タイプ t5  | ecs.t5-lc2m1.nano | 1 vCPU | 0.5 GiB | 20 % | 2.5 GHz | 0.1 Gbps | 40,000 PPS | Intel Xeon E5-2682v4 / Intel Xeon(Skylake) Platinum 8163 / Intel(R) Xeon(R) Platinum 8269CY |

速度測定のために今回注意点を記載しておきます。購入時にインタフェース速度を設定する画面があります。トラフィック課金で選択した場合、このインタフェース速度は料金に関係ありませんので今回は最大の100Mbpsにしておきます。もっと高速なインタフェース速度を選べるインスタンスもありますので是非そちらでもお試しを。
<img width="1252" alt="スクリーンショット 2020-05-27 0.47.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/7b26831e-864e-beef-6478-c9fa814e81cf.png">
５Mbpsになっているものを100Mbpsにしておきます。あとで変更できないはずなので、ここで設定しましょう。
<img width="1247" alt="スクリーンショット 2020-05-27 0.47.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/25b12299-3acd-4f8b-d5af-2fcc303434bc.png">
##4.送信サーバにossutilをインストール/設定する
OSSをCLIで操作するためのツールがいくつか用意されています。今回はossutilを利用することとします。以下のヘルプを参照すると他のツールも記載あります。
[ossutilのインストールヘルプ](https://www.alibabacloud.com/help/ja/doc-detail/120075.htm?spm=a2c63.p38356.b99.77.20c11d1dbNcvEc)
まずossutil インストールパッケージをダウンロードします。

```
#wget http://gosspublic.alicdn.com/ossutil/1.6.6/ossutil64 
```
ファイル実行権限を変更します。

```
#chmod 755 ossutil64
```
ossutilのconfigコマンドを使って設定ファイルを生成します。ファイル生成場所から聞いてきますので必要に応じて変更してください。

```
#./ossutil64 config
This command generates a configuration file. Enter the path of the configuration file. The default path is /home/user/.ossutilconfig. If you press Enter without specifying a different destination, the file will be generated in the default path. If you want to generate the file in another path, set the --config-file option to the path. 
If the path of the configuration file is not entered, the default configuration file /home/user/.ossutilconfig is used. 
A parameter is ignored if you press Enter without configuring it. To learn more about parameters, run the help config command. 
```
OSSのバケットの設定をここで使います。
エンドポイントを聞かれた際に、注意点ですがhttp://を頭に入れて入力してください。
以下はRAMアカウントのAccessKeyIDとSecretを入力します。STS Tokenは何もいれずにリターンで。今回は使ってません。

```
Enter the endpoint: <b>http://</b>oss-cn-shenzhen.aliyuncs.com 
Enter the AccessKey ID: <b>your AccessKey ID</b>
Enter the AccessKey secret: <b>your AccessKey secret</b>
Enter the STS token: 
```
##5.アップロードテストを行う
ここから実際にファイルをアップロードしていく作業を説明しますが、そのまでに１GBのファイルを送信サーバに作っておきましょう。
ddコマンドで1GByteのダミーファイルを作成します。詳細は割愛しますがbs=1Mで1MbyteのブロックサイズのデータをCount=1000で1000個組み合わせてファイルを作るという感じでしょうか。（10Mファイルならcount=10にすると10Mbyteになります。）

```
#dd if=/dev/zero of=test1000Mfile bs=1M count=1000
```
ここまでで、環境が揃いましたのでossutilのappendfromfileコマンドを利用してファイルをアップロードしていきます。（appendfromfileでは同じファイル名でアップすると前のファイルにデータが追加される形でアップロードされます）

ここでテスト構成をもう一度確認しておきます。今回はInternetを使ったエンドポイントとアクセラレートされたエンドポイントの両方を試すことでInternet経由（通常）とTransfer Accelerationの効能を得たものとの比較をしています。
![爆速日中ファイルアップロード方法 OSS TA (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113808/70c6ae26-a3e5-7360-9ab1-29c9564f04ad.png)

送信サーバより以下のossutilのappendfromfileコマンドを使ってアップロードして数字を測っていきます。/user/test1000Mfile　は送信サーバ内のファイル、oss://actestbeijing/test1000Mfile1はOSSのバケット名とアップロードした際のファイル名です。（バケット名だけで、ドメイン名などは記載しなくていいのでご注意を）東京RGから北京リージョンのOSSバケットに送ったことになります。

```ossutil:1Gbyteファイル送信
#./ossutil64 appendfromfile /user/test1000Mfile　oss://actestbeijing/test1000Mfile1
```
東京RGから北京RGのOSSにTA（Transfer Acceleration)を利用して１Gbyteファイルを送った場合（5/26 22:00に送信）

```
total append 10485760(100.00%) byte,speed is 12332.53(KB/s)
local file size is 10485760,the object new size is 10485760,average speed is 12618.24(KB/s)
```

東京RGから上海RGのOSSにTA（Transfer Acceleration)を利用して１Gbyteファイルを送った場合（5/26 21:45に送信）

```
total append 1048576000(100.00%) byte,speed is 6390.24(KB/s)
file size is 1048576000,the object new size is 1048576000,average speed is 13094.76(KB/s)
```

12,600KByte/sec~13,000KByte/secが出ている結果です。これをbpsに変換すると
12,600KByte/sec x 8bit =100,800Kbit/sec =100Mbps
となり、ほぼ送信サーバのインターフェース速度上限まで利用して日本〜中国まで送信されていることがわかります。爆速ですよね。

##参考：利用したサービスの料金

料金について記載します。まず料金単価です。この単価を利用した分つみあげれば計算できます。
東京RGのECS：ecs.t5-lc2m1.nano 1 vCPU/0.5 GiB/20GB Disk  $0.013/Hour
香港RGのECS：ecs.t5-lc2m1.nano 1 vCPU/0.5 GiB/20GB Disk  $0.013/Hour
北京/上海RGのOSS保存料金：0~5GBまでFree　（>5GBからUS$0.0173)
北京/上海RGのOSS TA転送料金：US$ 0.193/GB　（From中国以外 To 中国の場合）

[参照：OSSの料金詳細](https://www.alibabacloud.com/ja/product/oss/pricing?spm=a2cay.257156.1834322160.1.34336f43trpgKL) 

今回のテストに７時間ほどECSを起動：
0.013 x 7時間 x (東京＋香港）＝$0.182 (¥20くらい）

OSS TA転送容量：
0.193 x 3回送信 x（北京＋上海）x （東京＋香港）＝$2.316 (¥255くらい）

OSS保存容量：途中で削除したので5GB未満　＝$0.0

ということで合計費用は300円未満という結果でした。

##参考にしたサイト
[Alibaba Cloud OSS utilヘルプ](https://www.alibabacloud.com/help/ja/doc-detail/120069.htm)
[DDコマンドの利用方法:容量指定のダミーファイルを作成したい](https://www.itmedia.co.jp/help/tips/linux/l0606.html)