如何在没有公共访问权限的情况下访问AWS s3文件?

时间:2019-11-15 09:11:00

标签: node.js reactjs amazon-s3 aws-sdk-nodejs

我们将NodeJS用于Rest API,将ReactJS用于应用程序,尝试使用nodeJSaws-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"
    }
 }

2 个答案:

答案 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