S3コマンドの基本的な使い方のメモ

はじめに

2年前位に新製品(組み込み機器)用にS3サーバーでデータをあげる検討をしたときのメモです.

  • 転記時の問題点
    • s3cmdのバージョンメモってなかった
    • さらっと調べたので誤情報あるかも(当時以降、一度もS3触れていないし)
    • 現在、検討用のS3サーバーなくなったから再度動作確認できない

s3cmd で使いそうなコマンド

Amazon S3 Tools: Command Line S3 Client and S3 Backup for Windows, Linux: s3cmd, s3express

# バケット確認
s3cmd ls s3://com.sato.test/data1

# バケット作成
s3cmd mb s3://com.sato.test/data1

# アップロード
## S3サーバー直下にディレクトリごとアップロード (ディレクトリpathの最後に"/"を付けるとディレクトリの中身だけあげるので注意
s3cmd put -r /path/to/dir s3://com.sato.test

## バケットの特定ディレクトリにアップロード
s3cmd put -r /path/to/dir/hello.txt s3://com.sato.test/data1

パケットキャプチャした感じだと、 存在しないバケットにputするときもクライアント側はファイルを送っているので、 初回通信時はバケット有無を確認してからファイルを送った方がパケット量を節約できる (回線契約タイプの都合上、動画を1回でも送ると月定額範囲をかなり逼迫してしまうため)

s3cmdのexitステータスとstderr

cmd 実行内容 exit stdout stderr
ls 指定なし 0 存在するバケット -
バケット:既存 0 バケットの中身 (中身がない場合は出力なし) -
バケット:非存 0 - そんなバケットない ※1
バケット:既存(別地域) 1 - endpoint違うよ
バケット:既存
ファイル:既存
0 ファイル名とか ※2 -
バケット:既存
ファイル:非存
0 - -
mb 新規 0 つくりました -
既存 1 - すでにあるよ
put 新規 0 ファイル名とかサイズとか -
既存 0 ファイル名とかサイズとか ※3 -
  • ※1:リージョンが違ったらputできないので別名のバケットにしないといけない
  • ※2:”a.txt”と”a.txt.1”というァイルがサーバにあるとき、s3cmd ls バケット/a.txt とすると2つのファイルが表示される
  • ※3:ファイルは新しい方に置き換えられる

s3cmdをC/C++ライブラリで置き換え

機能検討中はs3cmdで動作確認していましたが、組み込み環境でpythonを入れてしまうとpythonの容量があまりに大きくなってしまうため、置き換え調査をしました

検討したライブラリは以下のとおりです

  • libs3

    • amazon提供のc/c++ライブラリ
    • ライセンスがGPLv3なので使えないだろう → 最新のリポジトリみたらLGPLv3になっていた
  • aws4c

    • ライセンスがLGPL
    • get,put,deleteができるようだが、バケットの作成がない
    • 最終更新日2011/06/29
  • libaws

    • ライセンスがApache v2
    • cmake,makeでライブラリのビルドはできたが、情報、ドキュメントがなかなかみつからないので使い方を把握するのにテストコードを読まないといけない
  • WebStor

    • ライセンスがApache v2
    • サイトへの登録を行わないと落とせないので、未入手

当時は、ライセンス、対応機能、実装工数の面から、libawsを選択しました。 リンク用にlibs3リポジトリをちら見したら、ライセンスがGPLからLGPLになっていたので今ならlibs3にするかもしれません