AWS S3 NodeJS禁止或连接rest
我的本地机器上有一个NodeJS应用程序。 我正尝试使用Amazon S3服务进行设置,但不幸的是,它不起作用。 我能够获得签名的URL,但是当上传文件时,AWS返回Forbidden 403(几次它断开连接,但在从CORS中删除超时选项后停止)
我到目前为止所做的:
-
创build新的用户休闲政策:
{ "Statement": [ { "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } ] }
-
为此用户创build了新的访问密钥
-
更新了桶的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>
-
更新了桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "my-user-id-number" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-bucket/*" } ] }
-
创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(); }); });
-
上传文件
$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); });
- 预签名的S3 URL签名不匹配
- Node.js Amazon S3 – 下载失败,出现SignatureDoesNotMatch错误
- AWS Transfer Acceleration使用JavaScript SDK的预签名URL
- 如何调整图像大小并使用nodejs中的multer上传到s3并使用easy-image npm模块?
- 在NodeJS的pkgcloud中,“stream和pipe-capable”意味着什么
- 节点expressionaws s3.listBuckets在页面呈现后执行callback
- 无法使用node.js将Blobfile upload到S3
- S3上传发送事件在本地使用deferred.notify()而不是在服务器上
- Lambda函数失败,没有生成日志