使用 Node JS 从 Amazon S3 私有存储桶中检索图像

Posted

技术标签:

【中文标题】使用 Node JS 从 Amazon S3 私有存储桶中检索图像【英文标题】:Retrieve image from Amazon S3 private bucket using Node JS 【发布时间】:2021-07-15 07:53:06 【问题描述】:

我正在为我的一个网站使用 Node JS。根据网站的要求,我使用 Amazon S3 将图像存储在存储桶中。

我正在使用 API 使用访问密钥和 secretases 密钥在我的 Amazon S3 存储桶中动态上传图像。

但现在我想使用节点 JS 在网站中预览或显示那些上传的图像(不是一次全部)。请注意,S3 存储桶不是公开的。

谁能建议如何使用 Node JS 从 Amazon S3 检索图像? 尝试使用 getObject(),出现 403 禁止错误。文件成功上传到 S3 存储桶,读取文件时由于禁止错误而无法看到上传的文件。

这是我的代码

let fileNew = request.file;
        if (!fileNew) 
            response.status(200).json( message: "Failure, please upload file", status: 400 );
        
        const params = 
            Bucket: aws_s3_bucketName,
            Key: fileNew.originalname,
            Body: fileNew.buffer,
        ;
        
        s3.upload(params, async function (err: any, data: any) 
            if (err) 
                return console.log("There was an error while uploading your file: ", err.message);
            
            const fileInfo =data.Location;
            response.status(200).json( message: "Success", data: fileInfo , status: 200 );
        );
        s3.getObject(params, function(err, data) 
            if (err)
                console.log(err, err.stack);
              
            else 
                console.log(data); 
                          
    );

【问题讨论】:

确保您使用的 iam 角色具有 s3:GetObject 权限 @AmanB,是的,有权限 【参考方案1】:

我假设上传和下载发生在不同的请求中。

在这种情况下: 如果您对 PUT 和 GET 使用完全相同的标识,那么它应该可以工作。如果您想允许 AWS 账户中的其他人访问对象,请在上传时添加 bucket-owner-full-control ACL

const params = 
  Bucket: aws_s3_bucketName,
  Key: fileNew.originalname,
  Body: fileNew.buffer,
  ACL: 'bucket-owner-full-control'
;

更多关于 ACL 的信息here

如果您想在文件上传后立即下载文件,请将下载块移动到上传函数的回调中。

【讨论】:

,使用 ACL 更新,但我仍然收到 403 Forbidden 错误 您能否确认这两项操作是否使用完全相同的凭据。添加您用于调用 API 的身份的 S3 存储桶策略和 IAM 权限策略。验证您的组织是否有任何 SCP。验证 IAM 身份是否具有任何角色边界。 是的,我对这两个操作使用相同的凭据,我们的应用程序中有授权令牌策略。已添加 S3 存储桶策略和 IAM 权限。如果我将 S3 存储桶设为公开,它可以正常工作,没有任何问题,当我的存储桶设为私有时会遇到问题。 查看此aws.amazon.com/premiumsupport/knowledge-center/… 如果这没有帮助,建议向 AWS docs.aws.amazon.com/awssupport/latest/user/case-management.html 提出支持请求 我曾尝试使用亚马逊文档,但对我没有帮助。

以上是关于使用 Node JS 从 Amazon S3 私有存储桶中检索图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用适用于 Node.js 的 AWS 开发工具包将 Amazon S3 中的所有对象从一个前缀复制/移动到另一个前缀

Amazon S3 和 Cloudfront 上的 Node.js 服务器

Amazon S3 查看私有文件

Amazon s3:“阻止公共访问”设置以允许使用签名 URL 进行公共读取私有写入

如何从 mocha/superagent 测试对 amazon-s3 的 CORS 上传调用?

如何在循环中获取 Amazon S3 对象?