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

4

我已在S3上创建了一个密钥。

mykey.exists()返回true

mykey.get_contents_to_filename()生成了一个正确的文件

但是:

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

返回:
NoSuchKey 指定的键不存在。 键= mykey

看起来我正在使用boto 2.0b4 如果该键存在,为什么会出现NoSuchKey错误? 我错过了什么?

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

2个回答

2
我有一个理论,因为亚马逊 S3 是最终一致性的,所以一个请求可能会看到键 (.exists() == True),而另一个请求可能结束于不同的 S3 服务器,该服务器尚未获得新键的知识(这是最终一致性数据存储的难点:不一致读)。对于使用 put 后跟 head/get 的 s3,这是已知的行为,我也认为它适用于复制。通常,在短暂(但不确定)的时间内,所有请求都将看到您的键。通常只需要1-2秒钟左右。在 exists() 检查和复制之间的代码中放置30秒的超时时间。它仍然会发生吗?
此问题在此处描述:https://forums.aws.amazon.com/thread.jspa?threadID=21634&tstart=0

-1

我认为您可能遇到了密钥名称的问题。字符串“\backup\file”中的反斜杠字符实际上被解释为字符串转义,因此“\b”被替换为ASCII退格字符,“\f”被解释为ASCII换页符(有关详细信息,请参见this)。虽然这可能不是您想要的,但它确实应该仍然有效,但在boto2.0b4中密钥名称转义存在错误(现在已在github主分支中修复),这导致无法正常工作。

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


抱歉,那是我的Windows背景显示出来了。我实际上使用的是正斜杠而不是反斜杠。但是即使假设我正在使用反斜杠,为什么.exists()会起作用,而.copy()却不起作用呢? - ChrisMcB
很奇怪。我无法在我的本地环境中使用boto 2.0b4重现这个问题,但显然有些东西出了问题。mykey所代表的对象的实际名称是什么? - garnaat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接