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

Ere*_*old 5 amazon-s3 amazon-web-services node.js

我对 AWS 很陌生,我正在尝试允许用户使用预签名 URL 访问/上传 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));
});
Run Code Online (Sandbox Code Playgroud)

我从中获取了一个 URL,但是当我尝试访问收到的链接时,出现访问被拒绝的异常。

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

你知道如何进行这项工作吗?

谢谢,

Joh*_*ein 2

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

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

  • 访问控制列表对单个对象的权限
  • 存储桶策略(根据路径、IP 地址、引荐来源等授予广泛的访问权限)
  • IAM 用户和组(向具有 AWS 凭证的用户授予权限)
  • 预签名 URL

预签名 URL可用于授予对 S3 对象的访问权限,作为“覆盖”访问控制的一种方式。通常私有的对象可以通过附加到期时间和签名的 URL 进行访问。这是无需 Web 服务器即可提供私人内容的好方法。

如果您的目标是仅在使用预签名 URL 的情况下提供内容,则:

  • 不要通过上面列出的正常方法分配任何权限(默认情况下这会使它们保持私有)
  • 使用预签名 URL访问对象

你的代码是:

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));
});
Run Code Online (Sandbox Code Playgroud)

我注意到您没有传递Expires参数,该参数指定预签名 URL 的有效期。以下是来自Amazon S3 文档的 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
Run Code Online (Sandbox Code Playgroud)

因此,在您测试 URL 之前,链接很可能已过期。我建议您提供一个Expires参数并将其设置为适合您的预期用途的长度(例如 300 秒)。