无法从 S3 获取对象元数据。检查 aws Rekognition 中的对象键、区域 and/or 访问权限

Unable to get object metadata from S3. Check object key, region and/or access permissions in aws Rekognition

import boto3

if __name__ == "__main__":

    bucket='MyBucketName'
sourceFile='pic1.jpg'
targetFile='pic2.jpg'

client=boto3.client('rekognition','us-east-1')

response=client.compare_faces(SimilarityThreshold=70,
                              SourceImage={'S3Object':{'Bucket':bucket,'Name':sourceFile}},
                              TargetImage={'S3Object':{'Bucket':bucket,'Name':targetFile}})

for faceMatch in response['FaceMatches']:
    position = faceMatch['Face']['BoundingBox']
    confidence = str(faceMatch['Face']['Confidence'])
    print('The face at ' +
           str(position['Left']) + ' ' +
           str(position['Top']) +
           ' matches with ' + confidence + '% confidence')

我正在尝试比较存储桶中存在的两个图像,但无论我在哪个区域 select,我总是会收到以下错误:-

botocore.errorfactory.InvalidS3ObjectException:调用 CompareFaces 操作时发生错误 (InvalidS3ObjectException):无法从 S3 获取对象元数据。检查对象键、区域 and/or 访问权限。

我的存储桶区域是 us-east-1,我在我的代码中配置了相同的区域。 我做错了什么?

编译前请确保脚本中的AWS环境变量配置AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

在我看来,您对 access_key 和 secret_key 没有足够的权限!如果凭证是 IAM 用户的,请确保 IAM 用户有权执行 Rekognition compare_faces 读取操作和 s3 读取操作!还要检查您的 s3 源和目标对象密钥是否正确。 最好创建具有​​所需权限的角色并承担该角色来请求临时安全凭证,而不是使用永久访问密钥。

我遇到了同样的问题。我所做的修复是重新排列我的存储桶和文件夹。确保您的图像直接在您的存储桶中,而不是在您存储桶中的文件夹中。还要仔细检查图像的名称是否正确以及一切是否正确。

也 运行 进入这个问题,注意到我的 IAM 角色将 bucketname 作为资源,我不得不在末尾添加一个斜杠和一个通配符。将其更改为 "Resource":"arn:aws:s3:::/*"

确保 bucket 区域与呼叫区域相同。如果您使用的是 AWS CLI,请确保包含具有适当区域的配置文件。

检查 S3 和 Image Rekognition 是否在同一区域,我知道,这不是很好或没有记录(我猜),但这些人正在谈论它 here and here

我遇到了 android 使用 AWS rekognition sdk 的问题,问题是 S3 存储桶的区域在我的请求中不一样,所以我必须在请求中输入正确的区域(与 S3 存储桶相同):

 rekognitionClient.setRegion(Region.getRegion(Regions.US_WEST_1));//replace with your S3 region

对我来说,更改 S3 存储桶中的文件权限有效。

对我来说,问题是包含空格的 s3 存储桶中的文件名。所以你必须确保密钥在存储自身时不包含空格。

我有同样的错误:我检查并发现图像存在于存储桶的某个子文件夹中。确保图像在根存储桶中。

在我的例子中,我的对象路径以斜杠 (/) 为前缀。删除它就可以了。

虽然这是一个很老的问题,但我也有同样的问题。但就我而言,我使用的是 Lambda 并且我的 Lambda 角色没有访问 S3 的权限,因此如果您通过 Lambda 执行此操作,除了 Rekognition 之外,您还需要提供对它的 S3 访问权限。