如何使用预签名的URL调试S3上传?

文森特

不久前,我实现了PDF上传功能,其中我的前端调用了我的后端,该功能调用getSignedUrl()了Amazon的JavaScript SDK以获取一个URL,该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配置与可以进行上传的存储桶的CORS配置相同
  • 存储桶策略与工作存储桶策略相同,不同之处在于它所s3::GetObject的资源引用了这个新存储桶
  • 访问控制列表相同
  • 它位于正确的区域
  • 预签名的URL与工作的URL相同
  • 我的浏览器正在为失败和正常的PUT请求发送相同的HTTP标头
  • OPTIONS首先发送请求也是如此

我还能检查什么?

文森特

因此,有一件事我没有正确检查:

预签名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>/*"
    }
  ]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章