AWS S3 - 为用户提供重定向的子域

时间:2013-11-05 09:28:35

标签: amazon-web-services amazon-s3 subdomain cname

我为AWS S3上的用户提供无限存储空间。每个用户在我的S3存储桶中都有一个文件夹(它必须是文件夹,没有独立的存储桶,因为AWS将存储桶限制为50)。

问题:我想为我的用户提供自定义域名(myuserdomain.com),以便他们可以在自己的域名中浏览他们的存储空间。

我看到了可能的解决方案:如果我要为每个用户提供自定义子域名,用户可以使用CNAME将自己的网站重定向到我的子域,并使用自己的域存储,以便它可以正常工作。

mybucket/user1folder -> user1folder.mybucket.awsS3.com
mybucket/user2folder -> user2folder.mybucket.awsS3.com

user1.com -> CNAME -> user1folder.mybucket.awsS3.com
user2.com -> CNAME -> user2folder.mybucket.awsS3.com

但我不知道如何重定向(在亚马逊级别)或(在DNS级别上)或(在不同级别上)..但它需要处理所有用户的流量。

1 个答案:

答案 0 :(得分:1)

  

我为AWS S3上的用户提供无限存储空间

真的?我需要免费存储大约8TB。我在哪里注册?

对我来说,这听起来像是你计划中一个相当严重的缺陷,因为我怀疑你是否想要免费赠送那么多存储空间。"

除此之外,还有第二个缺陷,即CNAME对于DNS区域的顶点是不可能的。您可以为CNAME创建www.example.com,但无法将example.com声明为CNAME

是的,它可以作为ALIAS记录完成,但您必须为您的客户托管DNS' Route 53上的域名。

第三个问题是:

mybucket/user1folder -> user1folder.mybucket.awsS3.com

那应该是user1folder.mybucket.s3.amazonaws.com,但我明白了,这个想法并不奏效。通过配置DNS,这种魔力是不可能的,因为HTTP Host:标头中发送的完整主机名必须与桶名完全匹配。 CNAME(和ALIAS)记录仅转换浏览器用于建立连接的IP地址,他们不对Host:标头执行任何操作。 S3中也没有能力提供此行为。

通过在混合中添加一个或多个EC2实例,运行具有重写和代理功能的Web服务器(如haproxy,varnish,nginx或者),技术可以完成您要执行的操作apache,将每个传入的主机名/ url重写为另一个,包括替换路径的元素并从"后端"中获取它。服务器(在这种情况下,将是S3)...这意味着当请求以user1.com/foo命中您的Web服务器时,您可以将URL请求重写为mybucket.s3.amazonaws.com/user1。 com / foo,从S3获取对象,然后将其返回给用户,但是你必须拥有足够容量的EC2实例来处理重写并将所有这些字节从S3传递回用户' s浏览器 - 所有数据都将流经您的EC2实例。

在Apache中,一个原始重写规则从请求中获取主机名,如果在路径的第一部分附加,则可能看起来像这样:

RewriteRule ^(.+) http://mybucket.s3.amazonaws.com/%{HTTP_HOST}$1 [P]

如果服务器收到http://example.com/foo的请求,它将被重写为http://mybucket.s3.amazonaws.com/example.com/foo,Apache服务器将从S3请求该对象,其内容从apache返回到浏览器。当然,这比直接访问S3要慢一些,但在您描述的情况下这是不可能的。如果"用户名"是" example.com" (网站的域名)然后你必须为每个用户定制apache配置,因为通过将主机名插入路径,替换不会简单地重建uri。

所以,是的,它在技术上是可行的,但实用性和可行性是不同的事情。


更新(来自评论):

  

我的博客ondrek.me是CNAME到S3存储桶,效果很好

您确实在区域的顶点使用CNAME,从而破坏了DNS协议并使其无法或极不可能成功地使用www.ondrek.me或任何其他子域,以及另外消除域的入站电子邮件的可靠传递。您当前的配置正常,但无效,并且可能会出现意外问题。

  

这里有一个正确的方法如何为我的用户提供域名customer.com到mybloggingplatform.com/customerId的博客?

除了我描述的内容?不,我会说没有。 DNS无法做到,浏览器无法做到,S3也不会这样做。

  

使用EC2并为每个博客重定向每个用户的每个请求都是一个巨大的开销。

是的,但重要的是,我没有说重定向。我上面讨论的解决方案没有重定向,因为这意味着将浏览器的地址栏发送到不同的位置,这几乎完全无法使用。我说重写和代理 - 服务器转换地址并获取对象。所以,是的,它有一些开销,但可能比你想象的要少。

  

需要一些聪明的解决方案,

是的,解决方案是"网络服务器。"

您需要一台或多台网络服务器(由某种存储支持),以便随时随地提供内容;配置根据传入的Host:标头确定内容在服务器上的位置或来自其他位置的内容。

在AWS中,我认为更合适的存储将是EBS,尽管S3在技术上可以工作,正如我所描述的那样。我有一个网络服务器,有很多非常"新鲜"文件和大量非常古老的文件仍然需要访问...我的服务器将新文件存储在其高性能SAN阵列上,而古老的东西已经迁移到S3但仍需要在旧的网址。当/ foo / bar的请求进入时,服务器检查/ var / www / foo / bar中的本地文件,如果存在则提供服务,否则通过后端代理请求,以获取/ mybucket /来自S3的foo / bar。如果文件不在那里,我的服务器实际上将403从S3返回到客户端。

我还成功地在一个旧的自定义编写的多租户Web服务器前使用HAProxy,由于它的设计,它确定了来自Host标题的路径名,并且无法合理地重新配置,因为它是这么久以至于没有人记得是谁写的或是如何运作的。需要通过网站的新主机名访问此服务器,并且HAProxy工作得非常出色,在HTTP标头中翻译主机名,以便此服务器始终认为请求的内容是什么,即使您键入了IP地址栏中的地址。在这样的设置中,HAProxy可以重写主机头和URL,并且可以非常容易地处理数百个并发连接。

  

github页面具有相同的功能,

我认为你会发现github拥有大量的网络服务器。

  

s3静态网站也

当然,

...托管在网络服务器上。