使用 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:“阻止公共访问”设置以允许使用签名 URL 进行公共读取私有写入