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は、ファイルアップ以外に使うのを控え中。
以上です。