使用预签名URL在Amazon S3上获取或放置对象

时间:2016-10-28 11:53:08

标签: node.js amazon-web-services amazon-s3

我对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));
});




我从中获取了一个网址,但是当我尝试访问我收到的链接时,我收到了拒绝访问权限的异常。

我想我可能需要配置一些存储桶策略或类似的东西,但我真的很困惑这个主题。

你知道怎么做这个吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

是的,预先签名的网址应该适合您。只是为了提供快速解释......

默认情况下,Amazon S3中的所有对象都是私有的。然后,您可以添加权限,以便人们可以访问您的对象。这可以通过以下方式完成:

  • 单个对象的访问控制列表权限
  • Bucket Policy(根据路径,IP地址,引荐来源等授予广泛访问权限)
  • IAM用户和组(向具有AWS凭据的用户授予权限)
  • 预签名网址

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。不幸的是,没有任何错误可以帮助我找到这个。它现在已修复,链接工作:)