如何使用预签名网址调试S3上传?

时间:2018-02-08 14:22:27

标签: amazon-web-services amazon-s3 aws-sdk

前段时间我实现了一个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>

这并不是很有用,所以现在我想弄清楚如何最好地调试它。

我查了一下:

  • 存在桶
  • 存储桶的CORS配置与上传工作的存储桶配置相同
  • 存储桶策略与工作存储桶的策略相同,只是它所在的s3::GetObject资源引用此新存储桶
  • 访问控制列表是相同的
  • 它位于正确的区域
  • 预签名网址与工作网址相同
  • 我的浏览器正在为失败和正在运行的PUT请求
  • 发送相同的HTTP标头
  • 同样适用于首先发送的OPTIONS请求

我还能检查什么?

1 个答案:

答案 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>/*"
    }
  ]
}