s3cmdじゃなくてawscli s3を使おう~IDCFクラウドオブジェクトストレージでも
バックアップなどの用途で、Amazon EC2やAWS外部のサーバーからAmazon S3等のオブジェクトストレージへファイルをアップロードする場合、僕はこれまでファイル転送ツールとしてs3cmdを使用していました。
ですが先日、
「AWS外部のサーバーから総量100GBを超えるファイルをS3にバックアップするのにどれくらいかかるか」
ということを調べているうちに、以下のような記事を見つけました。
・【AWS】みんな大好きS3のアップロードツールを試してみた!
https://i-think-it.net/s3-upload-tool/
なんと、1GBのファイルをアップロードするのに、
「s3cmdよりawscli s3のほうが4倍ぐらい速い」
という結果が記載されています。
この記事ではEC2からS3というAWS間のアップロードを行っているのですが、僕はAWS外部からS3へのアップロードを試してみることにしました。
Amazon S3へのアップロード時間比較
アップロードの条件は以下のとおりです。
- 計測日は2015年12月9日
- 転送元のサーバーはIDCFクラウド, teslaゾーン S1, 0.8GHz x 1CPU, メモリ1GB, CentOS 7.0
- オブジェクトストレージはAmazon S3、東京リージョン
- 1GBのファイル1つの転送時間を計測
- s3cmdのバージョンは 1.6.0
- aws cliのバージョンは 1.9.11
- Configはデフォルト値のまま
転送する1GBのファイルはddコマンドで作成しました。
$ dd if=/dev/zero of=/tmp/1GB.dat bs=1M count=1024
awscli s3でのアップロード。
$ time aws s3 cp /tmp/1GB.dat s3://<bucket>/
s3cmdでのアップロード。
$ time s3cmd put /tmp/1GB.dat s3://<bucket>/
結果は次のとおり。
3回計測して一番遅かった時間を記載します
転送ツール | 転送時間 |
awscli s3 | 71秒 |
s3cmd | 98秒 |
awscli s3のほうが、40%ぐらい速いという結果となりました。
1GBのファイル転送で71秒というのは、1024MB/71sec = 14.4MB/sec = 115.4Mbps ということで、これはIDCFクラウド S1のネットワーク帯域の上限なのかな、と感じました。
そうであれば、転送元のネットワーク状況によっては、もっと速くなるでしょう。
実際、先述の記事の場合は、同じ1GBのファイルを16秒で転送完了していますね。
なお、s3cmdのConfigは、デフォルトで、マルチパートアップロードで分割する際のサイズは15MB、送信チャンクサイズ65536となっています。
-- ~/.s3cfg multipart_chunk_size_mb = 15 send_chunk = 65536 --
awscli s3では、マルチパートに分割する際のサイズはデフォルトで8MBです。
(参考)AWS CLI S3 Configuration
http://docs.aws.amazon.com/cli/latest/topic/s3-config.html
IDCFクラウドオブジェクトストレージへのアップロード時間比較
さらに、Amazon S3ではなく、僕がよく使っているIDCFクラウドのオブジェクトストレージへのアップロード時間も計測してみました。
アップロードの条件は以下のとおりです。
- 計測日は2015年12月9日
- 転送元のサーバーはIDCFクラウド, teslaゾーン S1, 0.8GHz x 1CPU, メモリ1GB, CentOS 7.0
- オブジェクトストレージはIDCF、東日本リージョン
- 1GBのファイル1つの転送時間を計測
- s3cmdのバージョンは 1.5.0-rc1
- aws cliのバージョンは 1.9.11
- Configはawscli s3はデフォルト値のまま。s3cmdは一部修正。
awscli s3をIDCFクラウドオブジェクトストレージに対して使用する場合、初期設定のaws configureでアクセスキー、シークレットアクセスキーを入力します。
また、アップロード実行時に、–endpoint-url 引数で、エンドポイント https://ds.jp-east.idcfcloud.com を指定します。
$ time aws --endpoint-url https://ds.jp-east.idcfcloud.com \ s3 cp /tmp/1GB.dat s3://<bucket>/
※Amazon S3以外のオブジェクトストレージサービスでawscli s3コマンドを使用する方法については、以下の記事を参考にしました。
(参考)AWS CLI でさくらのオブジェクトストレージにアクセス、S3・GCSとの比較
https://qiita.com/web_se/items/934df6cd1cbbd99e0536
s3cmdは、1.5.1以上のバージョンだと、なぜか ‘Access Denied’ のエラーが出てしまうので、1.5.0-rc1を使用しました。
(参考)IDCFクラウドオブジェクトストレージ よくあるご質問 s3cmdのご利用方法
http://www.idcf.jp/cloud/storage/faq/scm_005.html
s3cmdのConfigは上記の推奨どおりとします。
-- ~/.s3cfg host_base = ds.jp-east.idcfcloud.com host_bucket = %(bucket)s.ds.jp-east.idcfcloud.com multipart_chunk_size_mb = 15 send_chunk = 32768 --
s3cmdでのアップロード。
$ time s3cmd put /tmp/1GB.dat s3://<bucket>/
転送時間は次のとおりでした。
こちらも3回計測して一番遅かった時間を記載します
転送ツール | 転送時間 |
awscli s3 | 68秒 |
s3cmd | 155秒 |
IDCFクラウドオブジェクトストレージへのアップロードでも、awscli s3のほうが2倍以上速いという結果となりました。
マルチパートアップロードまわりの処理が相当優れているのでしょうか。
まとめ
- オブジェクトストレージサービスへのアップロードは、s3cmdよりaw cli s3のほうが速い。
- awscli s3は、IDCFクラウドオブジェクトストレージでも使用できる。syncコマンドも使える。
ファイルサイズが小さく、ファイル数が少ない場合はどちらのツールを使ってもさほど違いはないでしょうが、ファイルサイズが大きかったり、ファイル数が大量の場合は、大きな違いとなってくるでしょう。
オブジェクト数やファイルサイズのカウントもできるなど、機能も充実しているので、これからはs3cmdではなく、awscli s3を使用することにします。
(参考)AWS CLIのS3コマンドまとめ
http://www.task-notes.com/entry/20150904/1441335600