我对AWS非常陌生,我尝试允许用户使用预先签名的网址访问/上传S3上的一些图片。
这是我的代码:
const getLinkForKey = key => new Promise((resolve, reject) => {
const params = {Bucket: PICTURES_BUCKET, Key: key};
S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url));
});

我从中获取了一个网址,但是当我尝试访问我收到的链接时,我收到了拒绝访问权限的异常。
我想我可能需要配置一些存储桶策略或类似的东西,但我真的很困惑这个主题。
你知道怎么做这个吗?
谢谢,
答案 0 :(得分:1)
是的,预先签名的网址应该适合您。只是为了提供快速解释......
默认情况下,Amazon S3中的所有对象都是私有的。然后,您可以添加权限,以便人们可以访问您的对象。这可以通过以下方式完成:
Pre-Signed URL 可用于授予对S3对象的访问权限,作为"覆盖"访问控制。通过附加到期时间和签名,可以通过URL访问通常的私有对象。这是一种在不需要Web服务器的情况下提供私有内容的好方法。
如果您的目标是仅在使用预签名网址的位置投放内容,则:
您的代码是:
const getLinkForKey = key => new Promise((resolve, reject) => {
const params = {Bucket: PICTURES_BUCKET, Key: key};
S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url));
});
我注意到您没有传递Expires
参数,它指定了预签名网址的有效期。以下是Amazon S3 documentation for node.js的代码示例:
var params = {Bucket: 'bucket', Key: 'key', Expires: 60};
var url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url); // expires in 60 seconds
因此,在您测试网址之前,链接很可能已过期。我建议您提供Expires
参数并将其设置为适合您预期用途的长度(例如300秒)。
答案 1 :(得分:0)
我终于找到了问题所在。我正在将我的代码执行到一个没有正确访问S3配置的lambda。不幸的是,没有任何错误可以帮助我找到这个。它现在已修复,链接工作:)