18

我试图准确了解如何设置一个通常是私有的但允许匿名上传但有限制的存储桶。具体标准是:

  • 存储桶主要是私有的,需要我的密钥/秘密来添加/删除/更新/列出文件。
  • 有一个名为“incoming”的“目录”(即键前缀),允许匿名用户上传内容到列表,但不能上传。
  • 存储桶对所有内容都有一天的有效期。作为奖励,我希望“传入”目录有 30 分钟的到期时间,但如果这不可能,则整个存储桶的到期时间为一天。
  • 带有“传入”前缀的文件将在每个对象的大小上受到限制。
  • 我可能还想将带有“传入”前缀的对象限制为仅某些内容类型。

我的问题是:

  1. 简单地创建两个桶会更好吗?一份用于我的传入文件,一份用于我自己的个人处理和存储?
  2. 将文件上传到传入目录的代码是什么样的。理想情况下,我想避免依赖 S3 库而只使用 HTTP 调用。如果您可以在 Ruby 中向我展示正确的方向,则可以加分。:)

过期似乎可以通过 S3 管理控制台设置,但最短的过期时间仅限于 1 天。我可以在该字段中输入小数吗?权限似乎适用于整个存储桶,而不仅仅是前缀。这让我觉得我只需要两个桶。如果我保留一个存储桶,我认为我需要创建一个 IAM 策略并将其应用于存储桶,但这超出了我对 S3 的有限了解,我想确保我不会在允许人们执行的权限中留下漏洞比我想要的更多。

我发现了很多关于通过 HTTP 表单发布匿名上传到 S3 的文档。我可以将其改编成代码,但我想知道,因为我在应用程序代码中(而不是 HTTP 表单帖子),有没有更简单的方法?

4

2 回答 2

17

您所描述的可以在一个桶中实现。您可以通过存储桶策略、检查示例或使用AWS 策略生成器允许匿名访问特定文件夹。在您的情况下,它可能看起来像这样:

{
    "Version": "2008-10-17",
    "Id": "Policy1346097257207",
    "Statement": [
        {
            "Sid": "Allow anonymous upload to /incoming",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::[your_bucket]/incoming/*"
        }
    ]
}

也可以使用简单的 html 表单匿名将文件上传到您的存储桶:

<form action="http://[your_bucket].s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    <input type="hidden" name="acl" value="public-read" />
    Name: <input type="text" name="key" value="incoming/[filename]" /><br/>
    File: <input type="file" name="file" /> <br />
    <input type="submit" name="submit" value="Upload" />
</form>​

此处详细描述了基于 S3 浏览器的上传。

于 2012-08-27T20:10:52.420 回答
3

我最近花了一些时间弄清楚匿名上传到 S3 的来龙去脉,也遇到了这个问题。我在以下文章中详细介绍了适用于我的解决方案:

https://gist.github.com/jareware/d7a817a08e9eae51a7ea

基本上你可以实现你想要的,除了经过身份验证的管理请求不起作用(或者至少我不知道解决方案)。

我知道这是一个较老的问题,但只是在这里记录它以防它帮助其他人。

于 2014-12-28T22:30:09.463 回答