不久前,我实现了一个 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 配置与上传到的桶的 CORS 配置相同
  • 桶策略与工作桶相同,只是它的 s3::GetObject 上的资源是指这个新桶
  • 访问控制列表相同
  • 它位于正确的区域
  • 预签名 URL 看起来与工作中的 URL 相同
  • 我的浏览器正在为失败的和工作的 PUT 请求发送相同的 HTTP header
  • 首先发送的 OPTIONS 请求也是如此

  • 我还能检查什么?

    最佳答案

    所以有 one thing 我没有正确检查:



    我从 AWS Lambda 函数生成了 URL,我必须为其添加 IAM 策略,如下所示:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::<bucket name>/*"
        }
      ]
    }
    

    关于amazon-web-services - 如何使用预签名 URL 调试 S3 上传?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48687729/

    10-10 00:32
    查看更多