通配符子域指向适当的S3 / CloudFront子目录

时间:2016-06-04 20:41:56

标签: amazon-s3 dns amazon-cloudfront amazon-route53 wildcard-subdomain

我需要多个子域来指向Amazon S3上的各个存储桶/子目录(与CloudFront分配同步),我将托管一些静态文件。

这样任何

SUBDOMAINNAME.example.com

自动指向

s3.amazonaws.com/somebucket/SUBDOMAINNAME

somedistributionname.cloudfront.net/SUBDOMAINNAME

有没有办法在不运行重定向服务器的情况下完成此任务?

是否可以在不更改每个新子域的DNS记录的情况下完成,如果没有,则以编程方式添加DNS规则?

在资源使用方面,最有效的方法是什么? (可能有数百个子域,每个子域每天有100个请求)

3 个答案:

答案 0 :(得分:2)

不,没有办法自动执行此操作。

  

有没有办法在不运行重定向服务器的情况下完成此任务?

从技术上讲,实现这一目标并不是您需要的重定向。你需要改写路径,这就是为什么你最终问题的答案是" no" - 因为Route 53(和一般的DNS)不能做任何与路径相关的事情。

Route 53确实支持通配符DNS,但是如果没有CloudFront和/或S3支持一种机制将主机头从HTTP请求放入路径(他们不会这样做),那么有限的帮助。

现在,这可以通过零触摸"轻松实现。模式,具有单个Route 53 *通配符条目,为*.example.com配置的单个CloudFront分配,以及一个或多个运行HAProxy的EC2实例,以执行请求路径重写并将请求转发到S3存储桶。基本配置文件中的单行将完成该请求重写:

http-request set-path /%[req.hdr(host)]%[path] 

然后您需要代理将实际的存储桶端点主机名发送到S3,而不是浏览器提供的主机名:

http-request set-header Host example-bucket.s3.amazonaws.com

代理会将修改后的请求发送给S3,返回S3对CloudFront的响应,这会将响应返回给浏览器。

但是,如果您不想采用这种方法,因为需要服务器,那么替代解决方案如下所示:

  • 为每个子域配置CloudFront分配,为分配设置alternate domain name以匹配特定子域。

  • 将每个子域的分布的Origin配置为指向同一个存储桶,将origin path设置为/one-specific-subdomain.example.com。在将请求发送到S3之前,CloudFront会将GET /images/funny-cat.jpg HTTP/1.1的请求更改为GET /one-specific-subdomain.example.com/images/funny-cat.jpg HTTP/1.1,从而导致您所描述的行为。 (这与我为HAProxy描述的行为相同,但它是静态的,而不是动态的,因此每个子域有一个分布;在这两种情况下,这都不是"重定向" - 所以地址栏不会改变。)

  • 在路由53中为每个子域配置A记录别名,指向子域的特定CloudFront分配。

这可以通过API,使用任何一个SDK或使用aws-cli以编程方式完成,这是一种非常简单的方法来测试,原型和脚本等没有写很多代码的东西。 CloudFront和Route 53都完全自动化。

请注意,使用自己的CloudFront分配的每个站点都没有明显的缺点,因为您的命中率没有区别,而且分发没有单独的收费 - 仅请求和带宽费用。

另请注意,CloudFront具有默认limit of 200 distributions per AWS account,但这是一个软限制,可以通过向AWS支持发送请求来增加。

答案 1 :(得分:2)

由于Lambda @ edge可以使用由Cloud Front“Viewer Request”事件触发的lambda函数来完成。

以下是此类Lambda函数的示例,其中request.headers['Authorization'] 之类的请求将从您的来源返回文件foo.example.com/index.html

你需要一个包含CNAME /foo/index.html的CF发行版和一个指向它的A记录“* .example.com”

*.example.com

至于费用,请查看lambda pricing。目前的定价为每百万请求0.913美元

答案 2 :(得分:1)

通配符适用于S3。我只是把A记录*指向一个IP并且它有效。