如何解决使用NodeJS创建S3 SignedUrl时出现“ NoSuchKey”错误
我正在尝试使用nodejs
通过aws-sdk
访问S3存储桶。
当我调用s3.getSignedUrl
方法并使用它提供的网址时,我在网址中收到“ NoSuchKey”错误。
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>{MY_BUCKET_NAME}/{REQUESTED_FILENAME}</Key>
我的理论是我传递的请求路径错误。比较我的要求:
{BUCKET_NAME}.s3.{BUCKET_REGION}.amazonaws.com/{BUCKET_NAME}/{KEY}
使用从AWS控制台创建的URL:
{BUCKET_NAME}.s3.{BUCKET_REGION}.amazonaws.com/{KEY}
为什么aws-sdk
在最后添加“ {BUCKET_NAME}”?
NodeJS代码:
// s3 instance setup
const s3 = new AWS.S3({
region: BUCKET_REGION,endpoint: BUCKET_ENDPOINT,// {MY_BUCKET_NAME}.s3.{REGION}.amazonaws.com
s3ForcePathStyle: true,signatureVersion: "v4",});
const getSignedUrlFromS3 = async (filename) => {
const s3Params = {
Bucket: BUCKET_NAME,Key: filename,Expires: 60,};
const signedUrl = await s3.getSignedUrl("getObject",s3Params);
return { name: filename,url: signedUrl };
};
解决方法
SDK会在路径中添加存储桶名称,因为您专门要求它:
s3ForcePathStyle: true,
但是,根据您的评论,您已经在端点中使用了存储桶名称(“我的端点为{MY_BUCKET_NAME}.s3.{REGION}.amazonaws.com
”),因此您的端点并非风格...
路径样式表示使用s3.amazonaws.com/bucket/key
而不是bucket.s3.amazonaws.com/key
。强制路径样式的端点实际上已经包含存储桶名称,其结尾为bucket.s3.amazonaws.com/bucket/key
,它被解释为键bucket/key
而不是key
。
解决方法应该是禁用s3ForcePathStyle
而不是设置s3BucketEndpoint: true
,因为您为单个存储桶指定了端点。
但是,我认为没有必要首先指定端点-只需让SDK为您处理这些事情即可!我将同时删除s3ForcePathStyle
和endpoint
(然后也不需要s3BucketEndpoint
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。