0

次のように、AWS::S3::Tree オブジェクトの子を繰り返し処理しようとしています。

conn = AWS::S3.new(:access_key_id => 'ACCESSKEYID', :secret_access_key => 'ACCESSKEY')
bucket = conn.buckets['bucketname']
tree = bucket.objects.with_prefix('assets/images').as_tree
directories = tree.children.select(&:branch?).collect(&:prefix)

これは、プレフィックスとして使用するほとんどのパスで正常に機能しますが、1 つのフォルダー (数万のサブフォルダーがある) が次のエラーを返します。

/lib/aws/s3/object_collection.rb:311:in `next_markers': Unable to find marker in S3 list objects response (RuntimeError)

次のようにデバッグするように gem メソッドをオーバーライドしました。

module AWS
class S3
    class ObjectCollection
        protected
        def next_markers page

            raise page.inspect

            marker = (last = page.contents.last and last.key)
            if marker.nil?
                raise 'Unable to find marker in S3 list objects response xxxxx'
            else
                { :marker => marker }
            end
        end
    end
  end
end

そして、これは返されたデータを出力します:

{:delimiter=>"/", :contents=>[], :common_prefixes=>[{:prefix=>"assets/images/100/"}, {:prefix=>"assets/images/1000/"}, {:prefix=>"assets/images/1001/"}, etc etc

呼び出しが :contents に対して空の配列を返すのはなぜですか?

4

1 に答える 1

1

これは、S3 からの XML が有効ではなく、コンテンツを解析できない場合に発生します。ワイヤー トレーシングを有効にすると (AWS::S3.new に :http_wire_trace => true を追加)、問題のある HTTP レスポンス ボディを調べることができるはずです。

于 2012-12-29T02:37:10.920 に答える