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

时间:2017-06-27 10:51:31

标签: amazon-s3 boto3

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

resp = s3client.get_object(Bucket='<>-<>', Key='MzA1MjY1NzkzX2QudHh0')

它出现以下错误:

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

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

  

enter image description here

我错过了什么或者我在这里做错了吗?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

我遇到的另一个可能的问题是,在我的对象的URL中导致行分隔符是在AWS documentation之一中获取对象密钥的过程中,此代码显示了获取密钥的示例一个对象。

foreach ($results as $result) {
    foreach ($result['Contents'] as $object) {
        echo $object['Key'] . PHP_EOL;
    }
}

问题是最后的PHP_EOL。只需将其删除,行分隔符就会消失。

$object['Key'] . PHP_EOL;-> $object['Key'];

答案 3 :(得分:0)

from urllib.parse import unquote
key = "MzA1MjY1NzkzX2QudHh0%0A"

key = unquote(key)

这将从任何键中删除所有特殊字符。

答案 4 :(得分:0)

一个通用的答案可能对正在考虑文件路径的人有用,并且可能是AWS S3 terminology的新知识。没有正确使用“ 名称”和“ ”通常会导致出现带有此问题中张贴的消息An error occurred (NoSuchKey)...的异常。

比方说,您有一个JPEG文件存储在存储桶中的某个“路径”中。在AWS控制台上导航到该对象,显示S3 URI为:

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

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

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}")