我正在尝试使用预签名的URL将图像放入S3存储桶。 我正在使用SAM在本地托管站点,并且PUT请求可以正常工作。但是,在生产服务器上运行命令时,出现“ 403 Forbidden”错误。
值得一提的是,OPTIONS请求可以正常工作,获得200个代码,但是接下来发送PUT则获得403个代码。
我已经尝试过的事情:
什么都没有得到'403 Forbidden'
jQuery Ajax:
$.ajax({
url: presignedUrl,
type: 'PUT',
data: image,
contentType: image.type,
processData: false,
success: function (response) {
// window.location = '/Prod/';
}
});
创建预签名网址:
$cmd = $this->client->getCommand('PutObject', [
'Bucket' => env('AWS_BUCKET'),
'Key' => 'images/' . $request->input('image_name'),
]);
return $this->client->createPresignedRequest($cmd, '+20 minutes')->getUri();
“ 403禁止”的常规:
Request Method: PUT
Status Code: 403 Forbidden
Referrer Policy: no-referrer-when-downgrade
“ 403禁止访问”中的响应标题:
Access-Control-Allow-Methods: GET, POST, PUT, HEAD
Access-Control-Allow-Origin: *
Connection: close
Content-Type: application/xml
Date: Wed, 15 May 2019 15:02:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-id-2: e5WZfJAQk24kl7kBoF+HU8+AOiR7ivTIcUZ71dZl0Ssged03RThlCRtku+AmhRRUwFe1p63cL4Q=
x-amz-request-id: 4767484BEBE4EC07
从“ 403禁止访问”中请求标头:
Accept: */*
Content-Type: image/jpeg
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
在本地放置请求可以正常工作,并且没有错误。
答案 0 :(得分:0)
最终解决了该问题。
我已经在S3 Client中指定了凭据,删除它们可以使lambda函数的角色正确访问S3。
不正确:
$this->client = new S3Client([
'credentials' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
],
'region' => env('AWS_DEFAULT_REGION'),
'version' => 'latest',
]);
正确:
$this->client = new S3Client([
'region' => env('AWS_DEFAULT_REGION'),
'version' => 'latest',
]);