我遇到了一个问题,当尝试从客户端将带有PUT请求的对象上载到签名的URL时,S3偶尔会在OPTIONS请求预检中返回403。令人沮丧的是,90%的时间它都可以正常工作,当它确实失败时,如果我重试几次相同的请求,它将通过。
有人经历过类似的事情吗?如果是,您是如何解决的?
这似乎与this issue有关,但并不完全相同,因为它们正在通过CloudFront,而我将直接进入S3。
const params = {
Bucket: **my bucket**,
Key: 'test/my-test-file.csv',
Metadata: {
'created-by': req.user.id,
'job-id': job.id,
},
};
const url = s3.getSignedUrl('putObject', params);
return $http({
url: **signedUrlHere**,
method: 'PUT',
data: file,
headers: {
'Content-Type': '',
},
transformRequest: [],
});
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Host: s3.amazonaws.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: content-type
Referer: https://**.***.com/*/*/*
Origin: https://**.***.com
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 403 Forbidden
x-amz-request-id: *********
x-amz-id-2: *******
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 20 Jun 2019 02:54:39 GMT
Server: AmazonS3
答案 0 :(得分:2)
研究了一段时间之后,我们发现了这些间歇性403的问题所在,至少对我们而言。希望这对您或其他有相同问题的人有所帮助。在我们的案例中,这是由于人们在错误的时间设置了计算机。这说明了间歇性的原因,因为大多数人将系统设置为自动时间和时区,少数人设置错误的时间会出错。