0

我在 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 级别)或(在不同级别).. 但它需要处理所有用户的流量。

4

1 回答 1

2

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

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

对我来说,这听起来像是您计划中的一个相当严重的缺陷,因为我怀疑您是否愿意“免费”放弃那么多存储空间。

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

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

第三个问题是这样的:

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

那应该是 user1folder.mybucket.s3.amazonaws.com,但我明白了,但这个想法行不通。这种魔法通过配置 DNS 是不可能的,因为在 HTTPHost:标头中发送的完整主机名必须与存储桶名称完全匹配。 CNAME(and ALIAS) 记录只翻译浏览器用来建立连接的 IP 地址,它们不对Host:标头做任何事情。S3 中也没有提供这种行为的能力。

它在技术上可以通过将一个或多个 EC2 实例添加到组合中来完成您尝试做的事情,运行具有重写和代理功能(如 haproxy、varnish、nginx 或 apache)的 Web 服务器,以将每个传入的主机名/url 重写为不同的,包括替换路径的元素并从“后端”服务器(在本例中为 S3)获取它......这意味着当请求以 user1.com/foo 的身份访问您的 Web 服务器时可以将 URL 请求重写为 mybucket.s3.amazonaws.com/user1.com/foo,从 S3 获取对象并将其返回给用户,但您必须拥有足够容量的 EC2 实例来处理重写并将所有这些字节从 S3 传递回用户的浏览器——所有数据都将流经您的 EC2 实例。

在 Apache 中,从请求中获取主机名并将 if 附加到路径的第一部分的原始重写规则可能如下所示:

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 是 S3 存储桶的 CNAME,它运行良好

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

这里有什么正确的方法可以为我的用户提供域 customer.com 到 mybloggingplatform.com/customerId 的博客吗?

除了我描述的?不,我会说没有。DNS不行,浏览器不行,S3也不行。

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

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

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

是的,解决方案是“Web 服务器”。

您需要一个或多个 Web 服务器,由某种存储支持,以从任何位置提供内容;配置根据传入的标头确定内容来自服务器上或其他地方的位置Host:

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

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

github页面具有相同的功能,

我想你会发现 github 有大量的 web 服务器。

s3静态网站也

...当然,托管在 Web 服务器上。

于 2013-11-06T02:06:54.733 回答