我们将NodeJS
用于Rest API,将ReactJS
用于应用程序,尝试使用nodeJS
从aws-sdk
获取AWS s3图像,然后计划将其放入反应是AWS Bucket
没有公共访问权限,也不应该是公共访问权限,如何解决此问题?
从nodeJS,我们得到s3 listObjects
,是否可以使用ReactJS
中的以下对象访问图像?
我们已经阅读了一些其他文档,建议使用签名的URL,但是它可以在浏览器中显示给客户的图像吗?
{
"Key": "public/5db0476246e0fb0004r4rbff5/s3-c0c79f542f3c.jpg",
"LastModified": "2019-10-23T12:30:32.000Z",
"ETag": "\"269b2c5455h220bccc374f4f4rfee\"",
"Size": 510811,
"StorageClass": "STANDARD",
"Owner": {
"ID": "dad9f9dfk39dfijir93irjfiejfidjfjdfdfdfr3r3r3r3fef3"
}
}
答案 0 :(得分:0)
您可以将存储桶放在CloudFront CDN后面。使用签名的URL分发您的内容/限制对某些来源的访问/以及其他可能适合您的用例的东西。
我的工作场所在相同的用例中使用带有签名URL的Cloudfront。
我认为该AWS帮助文档将提供更多帮助。 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
答案 1 :(得分:0)
//You can use this code to make an object public while uploading it.
const AWS = require('aws-sdk');
const fs = require('fs');
const path = require('path');
//configuring the AWS environment
AWS.config.update({
accessKeyId: "<Access Key Here>",
secretAccessKey: "<Secret Access Key Here>"
});
var s3 = new AWS.S3();
var filePath = "";
//configuring parameters
var params = {
Bucket: '<Bucket Name Here>',
Body : fs.createReadStream(filePath),
Key : "folder/"+Date.now()+"_"+path.basename(filePath),
ACL :'public-read'
};
s3.upload(params, function (err, data) {
//handle error
if (err) {
console.log("Error", err);
}
//success
if (data) {
console.log("Uploaded in:", data.Location);
}
});
从代码中上传图片时,只需将此添加到通话中即可。
ACL :'public-read'
(如果您没有任何上传工具,请忽略此内容。)
不幸的是,要获取已上传的对象,您不能以编程方式将权限更改为public。为此,请参阅本文档https://aws.amazon.com/premiumsupport/knowledge-center/read-access-objects-s3-bucket/。
为您强调最好的方法(您仍然可以参考 文档)
使用存储桶策略,该策略授予公共对特定前缀的读取访问权限
要授予公众对特定对象前缀的读取访问权限,请添加类似于以下内容的存储桶策略:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::awsexamplebucket/publicprefix/*"]
}
]
}
然后,将对象复制到具有公共读取访问权限的前缀中。您可以通过运行类似于以下命令的命令将对象复制到前缀中:
aws s3 cp s3://awsexamplebucket/exampleobject s3://awsexamplebucket/publicprefix/exampleobject