是否可以在 S3 上通过子域进行动态静态质量托管?

Is it possible to do dynamic static mass hosting by subdomain on S3?

假设我需要托管 1000 个静态网站。它们中的每一个都是父域的子域:

foo.parent.com
bar.parent.com
baz.parent.com
...

由于每个 AWS 账户有 100 个存储桶的限制,每个静态内容将位于父存储桶的一个文件夹中:

https://s3.amazonaws.com/parent.com/foo/index.html
https://s3.amazonaws.com/parent.com/bar/index.html
https://s3.amazonaws.com/parent.com/baz/index.html
...

有没有办法将每个子域指向正确的文件夹?也许使用 53 号公路?

使用 Apache 可以将所有子域自动重写到所需的文件夹中,执行如下操作:

RewriteCond %{HTTP_HOST} ^([^.]+)\.parent.com$ [NC]
RewriteRule ^(.*) folder/%1/

抱歉,目前无法。域记录需要映射到具有完全相同名称的存储桶,并且有 100 个存储桶的限制。

您需要使用多个 AWS 帐户才能获得 1000 个存储桶,我不确定他们是否不同意。

探索另一种方法可能更好,例如使用 EC2 实例托管 1000 个网站,并从 s3 提供尽可能多的 css/js/images 等以卸载流量。

停止阅读此处,转而参阅 Serving a multitude of static sites from a wildcard domain in AWS,其中描述了如何使用单个 S3 存储桶、单个 CloudFront 分配和 Lambda@Edge 源请求触发器来完成此操作。


更新:最初发布此答案后不久,AWS 放宽了每个帐户 100 个存储桶的硬限制,将其转换为 默认值 限制,可以通过向 AWS 支持人员描述您的用例来增加。

Bucket Limit Increase: You can now increase your Amazon S3 bucket limit per AWS account. All AWS accounts have a default bucket limit of 100 buckets, and starting today you can now request additional buckets by visiting AWS Service Limits.

https://aws.amazon.com/about-aws/whats-new/2015/08/amazon-s3-introduces-new-usability-enhancements/


单独使用 S3,没有。

使用 S3,借助 Route 53 的重写帮助,不——DNS 不会重写路径。曾经。

将 S3 与根据传入 Host: header 重写路径的代理结合使用...嗯,是的。与您的 Apache 配置示例类似,您可以将 Apache 配置为重写 URL 然后 [P] 代理(而不是重定向 - 代理)对 S3 的请求,并重写路径。 Nginx 或 HAProxy 或其他几种产品也可以这样做……而且,如果一个或多个代理与存储桶位于同一区域,则 EC2 和 S3 之间不会产生数据传输费用。我整天提供内容,"Hostname A" 从 "Bucket Name B" 中提取内容,HAProxy 将传入的 Host: header 重写为 S3 期望的内容,以便从预期的存储桶中提供服务。奖励:使用我的证书在我的域上使用 SSL。

或者...如果您不喜欢冒险,可以使用 CloudFront。这消除了主机名与存储桶匹配的需要,并为您提供了一些额外的 path-related 灵活性。

When you specify the origin for a CloudFront distribution - the Amazon S3 bucket or the custom origin where you store the original version of content - you can now specify a directory path in addition to a domain name.

http://aws.amazon.com/about-aws/whats-new/2014/12/16/amazon-cloudfront-now-allows-directory-path-as-origin-name/

这对您意味着,为每个网站配置 CloudFront 分配,将其配置为使用适当的 S3 存储桶,以及该存储桶中的路径。 (当然,您可以自动化)。

AWS 不对分发本身收费,所以这个看起来有点 no-brainer。每个 AWS 帐户有一个 limit of 200 CloudFront distributions,但 与 S3 中的 100 个存储桶限制不同, 此限制似乎是一个可协商的默认限制,因为 S3 限制现在也是。