使用S3签名的URL到PUT对象时出现间歇性403 CORS错误

时间:2019-06-20 14:56:30

标签: amazon-s3 cors

我遇到了一个问题,当尝试从客户端将带有PUT请求的对象上载到签名的URL时,S3偶尔会在OPTIONS请求预检中返回403。令人沮丧的是,90%的时间它都可以正常工作,当它确实失败时,如果我重试几次相同的请求,它将通过。

有人经历过类似的事情吗?如果是,您是如何解决的?

这似乎与this issue有关,但并不完全相同,因为它们正在通过CloudFront,而我将直接进入S3。

在服务器端生成签名的URL

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);

对URL URL的Angular.JS HTTP请求

return $http({
    url: **signedUrlHere**,
    method: 'PUT',
    data: file,
    headers: {
        'Content-Type': '',
    },
    transformRequest: [],
});

Bucket CORS设置

<?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

Screenshot

1 个答案:

答案 0 :(得分:2)

研究了一段时间之后,我们发现了这些间歇性403的问题所在,至少对我们而言。希望这对您或其他有相同问题的人有所帮助。在我们的案例中,这是由于人们在错误的时间设置了计算机。这说明了间歇性的原因,因为大多数人将系统设置为自动时间和时区,少数人设置错误的时间会出错。