前段时间我实现了一个PDF上传功能,我的前端调用我的后端,后端在Amazon的JavaScript SDK中调用getSignedUrl()
来获取前端应该是的URL能够使用PUT
请求上传文件。
这一段时间以来一直运行良好,今天,我尝试实现上传图像(到不同的S3存储桶)的类似功能。不幸的是,虽然它看起来设置相同,但PUT
上传会导致
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId><!-- A request ID --></RequestId>
<HostId><!-- A host ID --></HostId>
</Error>
这并不是很有用,所以现在我想弄清楚如何最好地调试它。
我查了一下:
s3::GetObject
资源引用此新存储桶PUT
请求OPTIONS
请求我还能检查什么?
答案 0 :(得分:1)
所以one thing我没有正确检查:
预签名URL允许您访问URL中标识的对象,前提是预签名URL的创建者有权访问该对象。也就是说,如果您收到用于上传对象的预签名URL,则只有在预签名URL的创建者具有上载该对象的必要权限时,才能上载该对象。
我从AWS Lambda函数生成了URL,我必须按如下方式添加IAM策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<bucket name>/*"
}
]
}