【发布时间】: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应该排除实际的签名错误,因为这些应该通过<Code>SignatureDoesNotMatch</Code>来解决。如果您使用 IAM 用户进行签名,请验证附加到该用户或该用户所属的组的所有策略。任何匹配的Deny都会取消匹配的Allow。
标签: amazon-web-services amazon-s3 aws-sdk