即使密钥存在,S3也会给我NoSuchKey错误

Daw*_*y33 9 amazon-s3 boto3

这是我的boto3命令,用于从S3存储桶获取具有特定键的对象:

resp = s3client.get_object(Bucket='<>-<>', Key='MzA1MjY1NzkzX2QudHh0')
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.
Run Code Online (Sandbox Code Playgroud)

我已经检查了存储桶,并且密钥确实存在

在此输入图像描述

我错过了什么或者我做错了吗?

Chr*_*ard 9

您的 URL 末尾有一个 %0A;那是一个行分隔符。

  • 您的存储桶也有公开列表;所以我能够导航到 https://s3.amazonaws.com/cypher-secondarybucket/MzA1MjY1NzkzX2QudHh0%0A 并得到“访问被拒绝”,而不是去 https://s3.amazonaws.com/cypher-secondarybucket/MzA1MjY1Nzkz0%0A并获得“密钥不存在” (2认同)

Nag*_*gev 7

一个通用答案可能对那些正在考虑文件路径并且可能对AWS S3 术语不熟悉的人有用。如果“名称”和“密钥An error occurred (NoSuchKey)...”不正确,通常会导致此问题中发布的消息出现异常。

假设您有一个 JPEG 文件存储在存储桶中的某个“路径”中。在 AWS 控制台上导航到此对象会显示 S3 URI:

s3://my-bucket/some/very/long/path/my-image.jpeg

您可以my-image.jpeg通过以下基本示例在 Python 中读取该对象:

import boto3

s3client = boto3.client('s3', region_name='us-east-1')

bucket_name = 'my-bucket'
object_key = 'some/very/long/path/my-image.jpeg'

try:
    s3obj = s3client.get_object(Bucket=bucket_name, Key=object_key)
except Exception as e:
    print(f"Error reading key {object_key} from bucket {bucket_name}: {e}")
else:
   print(f"Got object: {s3obj}")
Run Code Online (Sandbox Code Playgroud)

  • 我发现的所有示例和文档在对象键的开头都有一个前导“/”。按照你的例子并删除斜杠终于解决了我两个小时的挣扎。 (4认同)

coo*_*ugh 5

由于您知道您拥有的密钥肯定在您要查找的文件的名称中,因此我建议使用 afilter来获取名称以您的密钥作为前缀的对象。

s3 = boto3.resource('s3')
bucket = s3.Bucket('cypher-secondarybucket')
for obj in bucket.objects.filter(Prefix='MzA1MjY1NzkzX2QudHh0'):
    print obj.key
Run Code Online (Sandbox Code Playgroud)

运行此代码时,您将获得所有以您的密钥开头的文件的密钥名称。这将帮助您找出您的文件在 S3 上确切调用的内容。