我创建了一个Lambda函数,以生成预签名的URL,供移动应用程序用户访问S3(非公共)上的pdf文档。
s3 = boto3.client('s3')
resp = s3.list_objects(
Bucket='xxxxxxxxx',
EncodingType='url',
MaxKeys=1,
Prefix='2',
RequestPayer='requester'
)
key = resp['Contents'][0]['Key']
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'xxxxxxxxx',
'Key': key,
'SSECustomerAlgorithm': 'AES256',
'ResponseContentType': 'application/pdf'
},
ExpiresIn=3600,
HttpMethod='GET'
)
然后我在浏览器上得到它。
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
据我了解,可以通过HTTP请求进行访问。
带卷曲
curl -X GET https://pre-signedurlhere --output test.pdf
然后
无法打开文件“ test.pdf”。它可能已损坏或使用了预览无法识别的文件格式。
答案 0 :(得分:0)
我不知道使用list_objects_v2是否有任何效果,但是我最终使用以下代码设法从预签名的url中访问文件。没有在AWS上更改任何设置。
s3 = boto3.client('s3')
resp = s3.list_objects_v2(
Bucket='Bucket-name-here',
MaxKeys=1,
Prefix='2',
RequestPayer='requester'
)
key = resp['Contents'][0]['Key']
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': '',
'Key': key,
'ResponseContentType': 'application/pdf'
},
ExpiresIn=3600,
HttpMethod='GET'
)