CLIを利用して Linode Object Storage にファイルを最速でアップロードする

# Linode Object Storageとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/cd7e77ba-cc88-036a-0a94-96f5cc55dff2.png)

Linode Object Storageは様々なリージョンで利用可能なS3互換の低価格なAkamai Cloud Computing Serviceのストレージソリューションです。
ストレージはNVMe SSDにて動作しており、HDDに比べて高いパフォーマンスと低レイテンシーなアクセスを実現することができます。
データ量は250GBから100TB(※1)まで拡張することができ、オブジェクトはリージョン内でレプリケートされており冗長性が担保されています。
インバウンド転送無料、アウトバウンド1TBまでの転送が標準の価格に含まれており、追加の転送料金は1GBあたり0.005ドルとかなり低コストなのが特徴です(※1)。
今後のアップデートではデータ量が最大1PB、オブジェクト数は最大10億に対応する予定があります。

- [Linode Object Storage](https://www.linode.com/ja/products/object-storage/)
- [Enhancing Object Storage Performance](https://www.linode.com/blog/cloud-storage/nvme-object-storage-enhanced-performance/)
- [Akamai Cloud Computing Services(Linode)とは何かをわかりやすく解説](https://qiita.com/isss802/items/5313c7a6da1d9ed50a38)

※1 リージョンによって制限や価格が異なります、詳しくは[こちら](https://www.linode.com/docs/products/storage/object-storage/#specifications)を参照ください。


## Linodeにファイルをアップロードする方法

LinodeのObject Storageへのファイルアップロードの方法は、以下のようないくつかの方法がありますが、今回はこの中で、2. のCLIでのアップロードに関してどのツールが良いのか比較して検証してみました。

1. WebブラウザからCloud Managerを利用してアップロードする
2. Linode CLIもしくはS3互換のCLIを利用してアップロードする
3. S3互換のAPIを利用する
4. S3互換のクライアントツールを利用する

## CLIベースでのアップロードについて比較する

Linodeが公式にリリースしているCLIとS3に対応しているオープンソースのコマンドツール3つを比較します。

Linode CLI
https://github.com/linode/linode-cli

s3cmd
https://github.com/s3tools/s3cmd

s4cmd
https://github.com/bloomreach/s4cmd

s5cmd
https://github.com/peak/s5cmd

## 事前準備 API Keyの発行

Object StorageのメニューからAPI Keyの発行が行えます。
このAPI KeyはS3互換のものとなり、アクセスキーの設定方法はS3同様に行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/895ff741-b83e-55bd-be8f-b85d25ee0b1f.png)

コマンドを実行するコンソールでキーを環境変数に登録します。

```sh
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_DEFAULT_REGION=us-southeast-1
```

Linode CLIの場合には以下の環境変数の設定が必要です。

```
export LINODE_CLI_OBJ_ACCESS_KEY=XXXXXXXXXXXX
export LINODE_CLI_OBJ_SECRET_KEY=XXXXXXXXXXXXXXXX
export LINODE_CLI_TOKEN=xxxxxxxxxxx
```

## CLI アップロード速度の比較

各ツールに関しては特に設定変更は行わずにデフォルトのパラメーターで単純なアップロード時間の比較を実施しましました。
テスト1では単一ファイルのアップロード時間の比較、
テスト2では複数ファイルのアップロード時間の比較を行いました。
Object Storageのリージョンはus-southeast-1 (Atlanta)を利用しております。
送信元としては日本からのアップロードとなります。

### アップロードコマンド

#### linode-cli
```sh
# 単一ファイルのアップロード
linode-cli obj put ddFile32.txt [bucket_name]/ --cluster us-southeast-1
# 複数ファイルのアップロード
linode-cli obj put files/* [bucket_name]/ --cluster us-southeast-1
```

#### s3cmd
```sh
# 単一ファイルのアップロード
s3cmd sync ddFile32.txt s3://[bucket_name]/ 
# 複数ファイルのアップロード
s3cmd sync files s3://[bucket_name]/
```
#### s4cmd

```sh
# 単一ファイルのアップロード
s4cmd sync ddFile32.txt s3://[bucket_name]/ --endpoint-url https://us-southeast-1.linodeobjects.com
# 複数ファイルのアップロード
s4cmd sync files s3://[bucket_name]/ --endpoint-url https://us-southeast-1.linodeobjects.com
```
#### s5cmd
```sh
# 単一ファイルのアップロード
s5cmd --endpoint-url https://us-southeast-1.linodeobjects.com sync ddFile32.txt s3://[bucket_name]/
# 複数ファイルのアップロード
s5cmd --endpoint-url https://us-southeast-1.linodeobjects.com sync files s3://[bucket_name]/  
```

### テスト1 - 32MBのファイルを1個転送した時間
|ツール|秒数|
|---|---|
|Linode CLI|36秒|
|s3cmd|36秒|
|s4cmd|37秒|
|s5cmd|37秒|

### テスト2 - 1MBのファイル100個転送した時間
|ツール|秒数|
|---|---|
|Linode CLI|2分28秒|
|s3cmd|1分26秒|
|s4cmd|18秒|
|s5cmd|14秒|


## まとめ
転送時間の結果に関しては、通信環境や地域、テスト端末によって速度が異なるため、本環境でのテストが絶対的に正しいということではなく、あくまでも参考値となります。
単一ファイルの転送では大きなは差はありませんでしたが、複数ファイルの転送ではs5cmdが一番Linode Object Storageへのアップロードの時間の短縮が行えることが確認できました。
Linode Object StorageへCLIでファイルをアップロードする際のご参考になればと思います。

## 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai