AWS S3 NodeJS禁止或连接rest

我的本地机器上有一个NodeJS应用程序。 我正尝试使用Amazon S3服务进行设置,但不幸的是,它不起作用。 我能够获得签名的URL,但是当上传文件时,AWS返回Forbidden 403(几次它断开连接,但在从CORS中删除超时选项后停止)

我到目前为止所做的:

  1. 创build新的用户休闲政策:

    { "Statement": [ { "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } ] } 
  2. 为此用户创build了新的访问密钥

  3. 更新了桶的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>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration> 
  4. 更新了桶策略

      { "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "my-user-id-number" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket/*" } ] } 
  5. 创build调用来在NodeJS中签名url(使用Express)

     aws.config.accessKeyId = process.env.AWS_ACCESS_KEY_ID; aws.config.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY; router.get('/sign-s3', function (req, res) { var s3 = new aws.S3(); var fileName = req.query.fileName; var fileType = req.query.fileType; var s3Params = { Key: fileName, Bucket: process.env.S3_BUCKET_NAME, Expires: 600, ContentType: fileType, ACL: 'public-read' }; s3.getSignedUrl('putObject', s3Params, function (err, data) { if (err) { console.log(err); return res.end(); } var returnData = { signedRequest: data, url: 'https://${S3_BUCKET_NAME}.s3.amazonaws.com/${fileName}' }; res.write(JSON.stringify(returnData)); res.end(); }); }); 
  6. 上传文件

     $http({ method: 'GET', url: '/aws/sign-s3', params: data }).then(function (response) { var fd = new FormData(); fd.append("file", file); $http({ method: 'PUT', url: response.data.signedRequest, data: fd }).then(function (response) { defer.resolve(response); }, function (err) { defer.reject(err); }); }, function (err) { defer.reject(err); }); 

还有一件事情我不明白:我创build了一个用户,并给它访问s3,但我不能指定用户斗在桶权限。 在访问策略中是否缺less某些内容?

预先感谢任何提示!

我已经想通了

首先,我生成新的访问密钥,以确保这些是正确的。 其次,我更新了我的上传请求,设置内容types并仅序列化文件,而不是带有文件的FormData。

所以上传请求看起来

 $http({ method: 'PUT', url: response.data.signedRequest, data: file, headers: {'Content-type': file.type} }).then(function (response) { defer.resolve(response); }, function (err) { defer.reject(err); });