s3cmdじゃなくてawscli s3を使おう~IDCFクラウドオブジェクトストレージでも

バックアップなどの用途で、Amazon EC2やAWS外部のサーバーからAmazon S3等のオブジェクトストレージへファイルをアップロードする場合、僕はこれまでファイル転送ツールとしてs3cmdを使用していました。

ですが先日、
「AWS外部のサーバーから総量100GBを超えるファイルをS3にバックアップするのにどれくらいかかるか」
ということを調べているうちに、以下のような記事を見つけました。

・【AWS】みんな大好きS3のアップロードツールを試してみた!
http://i-think-it.net/s3-upload-tool

なんと、1GBのファイルをアップロードするのに、
「s3cmdよりawscli s3のほうが4倍ぐらい速い」
という結果が記載されています。
この記事ではEC2からS3というAWS間のアップロードを行っているのですが、僕はAWS外部からS3へのアップロードを試してみることにしました。

isdAmazon 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

isdIDCFクラウドオブジェクトストレージへのアップロード時間比較

さらに、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との比較
http://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倍以上速いという結果となりました。
マルチパートアップロードまわりの処理が相当優れているのでしょうか。

isdまとめ

  • オブジェクトストレージサービスへのアップロードは、s3cmdよりaw cli s3のほうが速い。
  • awscli s3は、IDCFクラウドオブジェクトストレージでも使用できる。syncコマンドも使える。

ファイルサイズが小さく、ファイル数が少ない場合はどちらのツールを使ってもさほど違いはないでしょうが、ファイルサイズが大きかったり、ファイル数が大量の場合は、大きな違いとなってくるでしょう。

オブジェクト数やファイルサイズのカウントもできるなど、機能も充実しているので、これからはs3cmdではなく、awscli s3を使用することにします。

(参考)AWS CLIのS3コマンドまとめ
http://www.task-notes.com/entry/20150904/1441335600