当前位置: 首页 > 知识库问答 >
问题:

S3密钥不存在后立即上市

公孙涵育
2023-03-14

我正在使用Python和boto3来处理S3。

我列出了一个S3桶,并通过前缀过滤:

bucket = s3.Bucket(config.S3_BUCKET)
for s3_object in bucket.objects.filter(Prefix="0000-00-00/", Delimiter="/"):

这给了我一个S3对象的iterable。

如果打印对象,我会看到:

s3.对象摘要(bucket_name='validation',key=u'0000-00-00/1463665359.Vfc01I205aeM627249')

当我去拿尸体时,虽然我得到了一个例外:

content = s3_object.get()["Body"].read()

botocore.exceptions.ClientError:html" target="_blank">调用GetObject操作时发生错误(NoSuchKey):指定的键不存在。

所以boto给了我钥匙,但它说它不存在?

并非所有钥匙都会出现这种情况。只是一些。如果我在AWS控制台中搜索无效密钥,它不会找到它。

共有1个答案

夏振国
2023-03-14

可以安全地假设您正在使用“标准”endpoint。所有这些主要适用于it,而不是区域endpoint。S3是原子的,并且最终是一致的。文档中给出了几个示例,包括:

进程将一个新对象写入Amazon S3,并立即列出其桶中的键。在更改完全传播之前,对象可能不会出现在列表中。

偶尔会出现几个小时的延迟,我的数据与这一说法一致,即99%以上的数据存在于2秒内。

您可以通过将终结点从s3.amazonaws.com更改为s3-external-1.amazonaws.com来启用读写后一致性,从而修复此问题:

s3client = boto3.client('s3', endpoint_url='s3-external-1.amazonaws.com')
 类似资料:
  • 我正在Windows服务器x64上使用redis 2.6.12,配置为:maxmemory 45GB,内存策略易失性ttl(我所有的密钥都有ttl,但它们永远不会过期,因为过期时间是几年后)。每天有一次,在某个时间,我使用BGSAVE创建转储。内存大部分时间都是满的,因为我总是添加新的键,而最旧的键被逐出。 问题是,每隔一段时间,在数据库保存后,redis也会立即删除我的所有密钥,内存从45GB下

  • 我有一个Symfony 3.3联系人表单,可以发送电子邮件,并且我希望允许选择性地上传一些附件。 我正在努力适应https://symfony.com/doc/3.3/form/form_collections.html 满足我的需要。 我的formBuilder的相关部分如下所示: ...我刚刚修改了我的树枝模板,看起来像这样... ... 此时,加载“我的页面”会产生以下消息: 带键阵列的键“

  • 我想创建或获取证书,创建pfx文件,加载它并让IdentityServer使用它。但是,IdentityServer无法使用我的pfx。 如何成功创建pfx并让IdentityServer使用它? 我有一个IdentityServer4 web解决方案,它使用ASP在本地主机上运行。净核心。我正在为在Azure上运行的生产准备解决方案,并将证书添加到IdentityServer管道,而不是开发者签

  • boto3文档建议从命令行配置密钥。如果有的话,我可以把AWS键放入python源代码中吗?下面是供参考的代码。

  • 问题内容: 我想将文件上传到S3,而不使用服务器的访问权限和密钥。AWS密钥应作为默认密钥。但是在服务器中运行以下命令,我可以访问它而无需提供任何访问权限和密钥。 aws s3 cp somefile.txt s3:// somebucket / 从Java代码无法访问,因为它无法加载凭据。下面是我的代码。 问题答案: 当您尝试从EC2实例连接到S3存储桶时,可以使用以下Java代码获取实例。 这

  • 我试图在我的一个项目中使用Google Maps API,并在指导中设置API凭据,它希望我将应用程序的SHA-1签名证书指纹添加到API中。 在说明中,它说使用下面的命令来获取指纹: 当我尝试使用它时,无论是在Android Studio终端还是在我的应用程序目录中的cmd提示符,我都得到以下错误: 注意,我的应用程序在D:\Projects\Android\AppName中。 我如何获得我的S