【问题标题】:How to debug S3 uploads using pre-signed URLs?如何使用预签名 URL 调试 S3 上传?
【发布时间】:2018-07-19 03:43:46
【问题描述】:

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

我还能检查什么?

【问题讨论】:

  • 你检查你的加密配置了吗?或者它是否有任何加密? .withEncryptionMaterials(materialProvider) .withCryptoConfiguration(new CryptoConfiguration().withAwsKmsRegion(Regions.getRegion(Regions.US_EAST_1)));您还可以将日志级别设置为调试以从 AWS S3 API 获取更多信息
  • @Damien-Amen 我认为我没有设置任何加密。 SDK 似乎工作正常,因为它返回一个预签名的 URL,只是当我 PUT 到该 URL(使用 Curl 或只是浏览器)时,我得到 AccessDenied
  • AccessDenied 应该排除实际的签名错误,因为这些应该通过&lt;Code&gt;SignatureDoesNotMatch&lt;/Code&gt; 来解决。如果您使用 IAM 用户进行签名,请验证附加到该用户或该用户所属的组的所有策略。任何匹配的Deny 都会取消匹配的Allow

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


【解决方案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>/*"
    }
  ]
}

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2021-08-26
    • 2016-10-12
    • 2020-09-30
    • 1970-01-01
    • 2021-10-03
    • 2019-03-25
    • 2018-07-08
    • 2017-02-15
    相关资源
    最近更新 更多