4

S3でキーを作成しました。

mykey.exists()戻り値true

mykey.get_contents_to_filename()正しいファイルを生成します

しかし:

mykey.copy('bucket', '/backup/file')

戻り値: NoSuchKey The Specified key does not exist. Key = mykey

boto 2.0b4 を使用しているようです キーが存在する場合、NoSuchKeyエラーが発生するのはなぜですか? 私は何が欠けていますか?

編集:キー名のバックスラッシュを実際に使用している前スラッシュに変更します

4

2 に答える 2

2

Amazon s3 は結果的に一貫性があるため、あるリクエストはキー (.exists() == True) を参照でき、別のリクエストは新しいキーの知識をまだ持っていない別の s3 サーバーで終了する可能性があるという理論があります (一貫性のないread - これは、結果的に一貫性のあるデータ ストアの難しさです. これは、put の後に head/get が続く s3 の既知の動作です. コピーでも同様に保持されると思います.)すべてのリクエストにあなたのキーが表示されます。通常、これは約 1 ~ 2 秒です。コード内で exists() チェックとコピーの間に 30 秒のタイムアウトを挿入します。それはまだ起こりますか?

問題はここで説明されています: https://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0 )

于 2012-06-25T06:19:37.523 に答える
-1

キー名に問題が発生している可能性があります。文字列'\backup \ file'のbaskslash文字は、実際には文字列エスケープとして解釈されるため、'\ b'はASCIIバックスペース文字に置き換えられ、'\ f'はASCIIフォームフィードとして解釈されます(詳細については、これを参照してください)。それはおそらくあなたが意図したものではありませんが、それでも実際には機能するはずですが、boto2.0b4(現在githubマスターで修正されています)のキー名のエスケープにバグがあり、これが機能しませんでした。

実際にキー名を「\backup\ file」にしたい場合は、Pythonでr'\ backup\file'として指定してみてください。これはそれを生の文字列として扱い、エスケープ処理は発生しません。

于 2011-04-26T12:27:24.257 に答える