雑多なインフラエンジニア日記

技術ブログでっす~

s3cmd で WARNING: Upload failed が出てファイルがアップできない件

AWSには「S3」という便利なサービスが御座います。

まずは、S3の概要を書きます。

どんなものか超絶簡単に言うと、DropBoxやGoogleDriveが超進化
した感じです。

資料 (これを見れば大体わかります)


http://www.slideshare.net/AmazonWebServicesJapan/20120319-aws-meisterreloadeds3-13318721

基本的にはGUI(AWS Management Console)から、バケット(入れ物)や
その下にフォルダを作ったり、そこにインターネット経由でファイル
をアップしたり色々と出来ます。
ちなみに、バケット名はドメイン名みたいなものなので早い者勝ちです。


更に何が便利かというとGUIなんて煩わしいぜという人向けに、
コマンドやAPIが公開されており、サーバからS3を操作出来ます。
cronに仕込んでEC2のバックアップ取ったり、過去ログを転送したり
出来ちゃうんです。
しかも、S3はEBSよりコストが安く、SLAも高いほうです。

ツール群


http://understeer.hatenablog.com/entry/2012/01/15/122927


種類があり過ぎて選択に困った人は、迷わず「s3cmd」をぶち込みま
しょう。


s3cmdインストール方法


http://understeer.hatenablog.com/entry/2012/07/23/124402


上記サイトをぱっと見して、インストール&動作確認なんて1時間
で出来るぜっと思ったら、大ハマリしてまともに動作するまで、
半日掛かりました・・・orz


結果何が問題だったかというと、ユーザホーム配下(/root/など)に作成
される「.s3.cfg」の設定。



s3cmd --configure を実行すると自動的にS3を操作するためのコンフィグ
が作成されるのですが、S3の向き先がUSなんです。。
これに気づかず大ハマリ。
オレは東京リージョンに転送してーんだYO!!

何でそんなとこに大ハマリしたかって、テキストは上手くアップ出来るの
にバイナリ(rpmなど)はアップ出来ないとか、特定のバケットだけアップ出来
ないとか
、もはやs3cmd使うの止めようと思ったくらい謎の事象だったのです。

アップロード確認

・正常にアップできるバケット

$ s3cmd put -r /usr/local/src/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm s3://bucket001
/usr/local/src/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm -> s3://bucket001/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm  [1 of 1]
92444 of 92444   100% in    0s   294.52 kB/s  done
$


・アップできず、リトライ後エラーとなるバケット

$ s3cmd put -r /usr/local/src/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm s3://bucket002
/usr/local/src/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm -> s3://bucket002/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm  [1 of 1]
53248 of 92444    57% in    2s    19.14 kB/s  failed
WARNING: Upload failed: /aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm ([Errno 32] Broken pipe)
WARNING: Retrying on lower speed (throttle=0.00)
WARNING: Waiting 3 sec...
(リトライが続く)
ERROR: Upload of '/usr/local/src/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm' failed too many times. Skipping that file.
$


そもそも、バケットの中身確認

$ s3cmd la
WARNING: Redirected to: bucket002.s3-ap-northeast-1.amazonaws.com
2013-02-05 04:48         0   s3://bucket002/a.txt

                       DIR   s3://bucket001/folder1/
2013-02-05 04:37     92444   s3://bucket001/aws-amitools-ec2-1.4.0.9-1.5.amzn1.noarch.rpm

$



「WARNING: Redirected to:」っておかしくない!?とこれを手ががりに
調査開始。
そもそも、同じリージョンにおいてるのに特定のバケットだけリダイレク
トとか何を仰っているのかしら・・・
タイムゾーンがなんたらって言っている人が居たのでとりあえず、UTC
JSTに直してntpも国内のNTPサーバと同期。
んが、事象は変わらず。

意味不明過ぎたのでとりあえず、tcpdump(抜粋)

・正常にアップできるバケット
10.0.0.101.53791 > 27.0.1.207.http・・・・
 
・アップできず、リトライ後エラーとなるバケット
10.0.0.101.40997 > s3-2-w.amazonaws.com.http・・・



あら・・・。
27.0.1.207 は日本国内。
s3-2-w.amazonaws.comは、US・・・。
なんでUS行っちゃうのよとググったところ、明確な答えはあらず。

そーいや、「.s3.cfg」になんかUSって書いてあったなと見たところ、怪しい
箇所を発見!


・挙動がおかしい時の.s3.cfg の設定抜粋

bucket_location = US
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
simpledb_host = sdb.amazonaws.com


・以下に直したら正常にアップできるようになったYO!
(simpledb_hostは使ってないけど一応変更)

bucket_location = ap-northeast-1
host_base = s3-ap-northeast-1.amazonaws.com
host_bucket = %(bucket)s.s3-ap-northeast-1.amazonaws.com
simpledb_host = sdb.ap-northeast-1.amazonaws.com



ちなみに、各サービスのエンドポイントやロケーション名は以下を参照。


http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region



結果、なんで上手くいくバケットとそうでないバケットが混合しているかはっきり
しないのですが、上手くバケットはs3cmd実行の前日に作成していた、上手くいか
ないバケットは当日に作成したくらいの差しかない。
タイムゾーンは合わしてから作成したバケットもアップ出来なかったしな~。

とりあえず、解決した!!


・補足1
ベータ版がいいらしい。
http://dqn.sakusakutto.jp/2012/09/s3cmd110-beta2.html

・補足2
気のせいかもしれませんが、S3Fox(FireFoxのS3用アドオン)でフォルダを作成し、
s3cmd la を実行すると、フォルダやファイルが見えなかったりするのはなんで
だろう。
作成したフォルダ名もおかしい場合があるし。。
S3Foxは、ファイルアップ以外に使うのを控え中。


以上です。