用于社交网络(如内容管理)的Amazon s3存储


Amazon s3 storage for social networking-like content management

我有类似于任何社交网络平台的要求。具体细节如下:

  1. 用户可以分组发布内容
  2. 组中的所有用户都可以查看该内容
  3. 用户可以上传/下载内容
  4. 不是固定数量的用户/组。即它是一个公共服务,所以我不能显式管理访问列表

我看过这个。总结如下:

下载

  1. 用户请求他想要查看的图像
  2. 我们为用户生成临时的有时间限制的URL。亚马逊S3 API允许您为您的任何私有对象生成临时URL已存储在S3中。您可以设置此URL的到期时间,然后把它传给用户。通常,S3图像就是这样显示的在网站中。我们使用该机制通过API经过一段时间后,您将不再具有访问权限

上传

上传更麻烦…

  1. 我们首先决定用户只能发布到[ourS3bucketPath]/[userId]/imagename.jpg路径。使用S3,您可以限制用户访问特定密钥路径
  2. 当用户想要发帖时,他会请求服务器进行临时访问。亚马逊提供了一个有趣的临时用户,称为"联合用户"。你可以在飞行中创建一个,它们就像设置时间后的临时URL。此外,您可以限制访问特别是仅S3桶密钥路径。因此,在这里,我们提供新的联合用户
  3. 用户告诉服务器将要上传的图像
  4. 用户上传到亚马逊给定bucket路径
  5. 用户与完成的服务器确认下载完成

下载方面还可以,但我对上传不太确定。创建联邦用户后,如果用户将文件上载到s3,然后告诉我的服务器路径名,则可以手动更改路径名以进行恶意操作。

如何执行以下操作:

  • 允许授权用户(由我自己的服务器决定)查看文件
  • 允许授权用户(同样,由我的服务器决定)上传文件

我也欢迎有关bucket结构命名的建议。我想到了:

CONTENT(bucket名称)->->uuid命名文件

这意味着,如果有一百万个组,就会有一百万个文件夹组,后面跟着一些表示文件本身的uuid。

我的服务器将记录uuid,并使用group id计算绝对路径,该路径也将保存在我自己的服务器中。

创建一个临时用户似乎有些过头了,尤其是当有一种更直接的方法可用时:

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html

通过表单帖子上传文件,您可以创建并签署一个不可篡改的策略文档,该策略文档不仅可以约束上传的密钥(路径),还可以选择性地限制上传文件的大小——S3将拒绝太大的文件。(或小)。


还有一点可能需要澄清:

Amazon S3 API允许您为存储在S3中的任何私有对象生成临时URL。

这取决于你所说的"API"是什么意思。生成这些代码的不是S3——这完全是在本地代码中完成的,而不需要联系S3。SDK有代码可以帮你做到这一点,或者你可以使用发布的规范编写自己的代码。我甚至写了一个MySQL存储函数,可以在查询中直接从数据库生成这些函数,并将URL作为参数。

根据您的应用程序,您可能也有兴趣了解CloudFront如何支持bucket内容的预签名URL(其中CloudFront位于bucket前面)——使用"自定义策略"的CloudFront预签名URL可以做S3预签名URL不能做的几件事——按IP地址限制URL的使用,并且允许访问与特定路径模式匹配的所有对象——比如CCD_ 1。

您可以使用匹配零个或多个字符(*)的通配符,也可以使用只匹配字符串中任意一个字符(?)的通配符。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-内容自定义策略声明示例

可以想象,您可以为应用程序服务器节省一些处理时间,方法是对其进行一次签名,然后使用基本签名URL字符串替换每个可见对象的路径。这只适用于CloudFront处理身份验证的情况——S3签名的下载URL不支持通配符。

签名URL非常快,但它确实涉及到一些相当繁重的幕后工作,因此,如果从同一个html页面上可以看到很多图像,那么这些毫秒可能会开始累积,这可能是一个有用的优化。。。更不用说使用CloudFront通常会看到更快的下载,因为频繁访问的对象缓存在下载它们的用户附近。

如果你的站点/应用程序从来没有那么忙过,那么几乎任何命名约定都会起作用-所以你提到的结构会起作用,但通常出于性能原因,你最好不要有很多对象都以相同的前缀开头-你想随机化对象名称的开始部分,而不是文件夹名称的结束部分,因此,如果你希望发展壮大,并有一个非常繁忙的网站,你可能想现在就计划:

http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html

AmazonS3在每个AWS区域中维护一个对象密钥名称的索引。对象密钥以UTF-8二进制顺序存储在多个索引中的分区。密钥名称指定密钥所在的分区存储在中。使用顺序前缀,如时间戳或字母顺序,增加了AmazonS3针对大量密钥的特定分区,压倒了分区的I/O容量如果你介绍一些密钥名称前缀、密钥名称的随机性,以及I/O负载,将分布在多个分区上

但是:

本主题中的AmazonS3最佳实践指南仅适用于通常每秒处理100个或更多请求。如果您典型的工作负载只涉及偶尔爆发的每100个请求秒,每秒少于800个请求,您不需要关注这些准则。