【问题标题】:How to access files from one S3 bucket into another bucket without making them public?如何在不公开文件的情况下将文件从一个 S3 存储桶访问到另一个存储桶?
【发布时间】:2019-01-09 09:22:28
【问题描述】:

要使其他 S3 存储桶可以访问文件,我们需要将存储桶设为公开或启用 cors 配置。

我在一个作为静态网站托管的公共存储桶中有一个 HTML 页面。在另一个桶中,我有 mp3 文件。此存储桶不公开。从第一个存储桶中,HTML 调用一个 script.js 文件,该文件尝试使用资源 URL 访问第二个存储桶中的 MP3 文件。这不是直接可能的,并且会产生 403 错误。因此,我为 bucket-2 编写了一个 CORS 配置,其中包含 .尽管如此,该脚本仍无法访问 MP3 文件。我还尝试使用静态网站 URL 而不是 ARN。再次收到 403 错误。是否可以让script.js在不公开bucket-2的情况下访问bucket-2中的mp3文件?

【问题讨论】:

    标签: amazon-web-services amazon-s3 permissions cors bucket


    【解决方案1】:

    您必须了解您的 javascript 是在客户的浏览器窗口中运行的,因此这是浏览器试图访问您的第二个存储桶中的 mp3 文件,而不是第一个存储桶。

    知道,除了打开对第二个存储桶的访问权并尝试使用 CORS 之外,没有简单的解决方案可以解决您的问题(但单独的 CORS 不会提供对私有存储桶的访问权限)

    方案一:手动生成签名

    如果您只想授予对第二个存储桶中的几个文件(而不是所有文件)的访问权限,我建议您在您的 javascript 中包含指向第二个存储桶中对象的完全签名 URL。根据S3 documentation,签名 URL 允许访问非公共存储桶中的单个对象。然而,生成签名并非易事,需要一些代码。

    我编写了这个命令行实用程序来帮助您为私有存储桶中的给定对象生成签名。 https://github.com/sebsto/s3sign

    AWS 命令​​行现在也有一个presign 选项 https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html

    另外,签名是有时间限制的,最大年龄是7 days所以如果你选择这种方法,你需要每周重新生成你的链接。这不是很可扩展,但很容易自动化。

    方案二:在网络服务器上动态生成签名

    如果您决定放弃客户端 Javascript 并改用服务器端生成的页面(使用 Python、Ruby、PhP 等...和服务器),您可以从服务器动态生成签名。这种方法的缺点是您需要一台服务器。

    提案 3:动态签名生成,无服务器

    如果您熟悉 AWS Lambda 和 API Gateway,则可以创建一个无服务器服务,该服务会动态地将签名 URL 返回到您的 MP3 文件。您的静态 HTML 页面(或客户端 Javascript)将调用 API Gateway URL,API Gateway 将调用 Lambda,而 Lambda 根据路径或查询字符串返回 MP3 的适当签名 URL。

    提案 2 和 3 具有与之相关的 AWS 成本(运行 EC2 服务器或 API 网关和 Lambda 执行时间),因此请务必在选择选项之前检查AWS Pricing。 (提示:提案 3 将更具成本效益)

    真正的问题是你为什么要创建这个?为什么不能在需要时使用细粒度的 S3 访问策略将所有公共内容放在同一个存储桶中。

    【讨论】:

    • 非常感谢。我是 AWS 新手。我正在尝试使用 S3、Lambda、API Gateway 构建应用程序。 MP3 文件由 lambda 函数动态生成,脚本会尝试根据它们的 ID 访问它们。所以细粒度的访问是不可能的。我只是想知道是否可以在不公开存储桶的情况下使它们可用。但是你有一点 - 如果它被传递给客户端,它无论如何都是公开的,因此将存储桶公开没有害处。谢谢你的详细解释。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2020-05-29
    • 2018-11-22
    • 2023-02-01
    相关资源
    最近更新 更多