S3的BOTO在尝试复制现有密钥时返回NoSuchKey

时间:2011-04-21 01:10:17

标签: amazon-s3 boto

我在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错误? 我错过了什么?

编辑:将键名中的反斜杠更改为我实际使用的反斜杠

2 个答案:

答案 0 :(得分:1)

我有一个理论认为,因为亚马逊s3最终是一致的,所以一个请求可以看到密钥(.exists()== True)而另一个请求最终会在另一个不知道新密钥的s3服务器上(一个不一致的读取 - 这是最终一致的数据存储的难度。这是s3的已知行为,其中有一个put后跟一个head / get。我希望它也能保留副本。)经过一段时间(但不确定)之后一段时间所有请求都会看到您的密钥。通常这只是一两秒左右。在exists()检查和副本之间的代码中放置30秒超时。它还会发生吗?

此处描述了该问题:https://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0

答案 1 :(得分:-1)

我认为您的密钥名称可能会遇到问题。字符串'\ backup \ file'中的baskslash字符实际上被解释为字符串转义符,因此'\ b'被替换为ASCII退格字符,'\ f'被解释为ASCII换页符(请参阅this for更多细节)。虽然这可能不是你想要的,但它确实应该仍然可以工作,但是在boto2.0b4(现在已经在github master中修复)中的密钥名称的转义中存在一个错误,阻止了它的工作。

如果您确实希望您的密钥名称为“\ backup \ file”,请尝试在Python中将其指定为r'\ backup \ file'。这将它视为原始字符串,不会发生转义处理。