2012-08-11 37 views
14

我想了解如何设置一个通常为私有的存储桶,但允许匿名上传与限制。具体标准是:S3 - 匿名上传 - 关键前缀

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

问题我有是:

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

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

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

+0

for 2,你有没有考虑用载波回形针配置s3? – rb512 2012-08-22 05:19:28

+0

感谢您的建议。是的,我已经使用过这些,但我认为它们通常都是在经过认证的基础上(而不是匿名)进行操作。可能有一些插件做匿名,但我真的只是希望,因为S3是一个REST接口,我允许匿名上传,没有任何第三方库的简单的HTTP请求可以做到这一点。但试图解析亚马逊文档比我希望如果有人能指引我朝正确的方向发展更加麻烦。 – 2012-08-23 13:36:38

+0

没有完全明白。通过匿名,你的意思是你希望能够上传文件而不提供你的s3证书?我不认为这是可能的。 – rb512 2012-08-24 02:48:52

回答

12

您所描述的内容可以在一个存储桶中实施。您可以通过存储桶政策允许匿名访问特定文件夹,请检查examples或使用AWS Policy Generator。你的情况可能是这个样子:

{ 
    "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基于浏览器的上传进行详细说明here

+0

我还没有检查过这一切,看看它是否像我想要的那样工作,但赏金即将结束,我不希望你没有得到积分,如果你确实拥有它的话。看起来不错,很快就会做一些测试。谢谢! – 2012-08-28 21:30:19

3

我最近花了一点时间搞清楚匿名上传到S3的来龙去脉,并且也遇到了这个问题。我写的是在一些长度为我工作的解决方案:

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

基本上你可以实现你想,除了认证请求管理器就无法工作了什么(或者至少我不意识到解决方案)。

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