S3代理到EC2实例

kun*_*foo 6 amazon-s3 amazon-ec2 amazon-web-services

我在s3上为我的网站运行静态托管.例如.www.somedomain.com指向S3桶.

我的api有一个子域api.somedomain.com,但处理跨域问题一直很烦人.我想映射www.somedomain.com/api/... - > api.somedomain.com/...但是没有完全重定向(301),因为我希望能够发布.

我知道Cloudfront允许这种行为,但由于我不需要CDN,因此它有点过分.

我已经获得了使用301重定向的路由规则,但无论如何要配置s3将我的请求传递给ec2?谢谢!

Joh*_*y C 3

要解决这个问题,你需要做的就是改变范式。在您的 EC2 实例上,只需与您的 Web 应用程序分开运行一个反向代理(例如 varnish 或 nginx),将http://www.somedomain.com/api/ *的流量路由到 Web 应用程序(您甚至可以重写请求 url 以删除“/api”前缀)和所有其他流向 S3 的流量。配置 nginx 或 varnish 来执行此操作非常简单(几个小时,而不是几天)。

然后将您的 www.somedomain.com DNS 记录切换为指向您的 ec2 实例而不是 S3。

用于清漆的无绒 VCL 示例可实现此目的:

backend s3 {
    .host = "s3.amazonaws.com";
    .port = "80";
}

backend app {
    .host = "localhost";
    .port = "8080";
}

sub vcl_recv {
    if (req.url ~ "^/api/.*") {
        set req.backend = app;
        set req.url = regsub(req.url, "^/api", "");
        set req.http.Host = "api.somedomain.com"; /* If your web app cares about host */
    } 
    else {
        set req.backend = s3;
    }
}
Run Code Online (Sandbox Code Playgroud)

此后,如果您愿意,您可以随意使用,例如使用路由 53 来检查您的 ec2 实例的运行状况,并在其发生故障时将 DNS 查找故障转移到您的 s3 存储桶,以及配置自定义缓存规则等。实现您想要的行为。