我的网站允许用户上传文件。 我们使用典型的Javascript + POST + Signature将它们直接上传到S3。 这很好,但一些本地networking反对CORS请求 – 用户有一个他们可以连接到的主机的白名单。
我很乐意提供uploads.baconserker.com作为我的S3存储桶的CNAME别名来解决这个问题。 但这与SSL(证书名称与s3主机名称不匹配)相违背。 我相信这种情况需要SNI,Cloudfront提供SNI。 但是,我的用例并不涉及Cloudfront或边缘caching。 是否可以直接为存储桶https端点设置SNI? 或者通过我自己的主机名直接发送到s3上传其他方法?
我相信这种情况需要SNI,Cloudfront提供SNI。 但是,我的用例并不涉及Cloudfront或边缘caching。
公平的,但这是官方的解决scheme。 S3不直接支持SSL和自定义域。
另外,请考虑这一点:
CloudFront不只是一个CDN。 它也是一个SSL卸载程序,主机:头重写器,pathprepender,geolocator,georestrictor,安全内容网关,HTTP到httpsredirect器,错误页面定制,根页面替代,web应用程序防火墙,原始页眉注入器,dynamic内容gzipper,基于path多源HTTP请求路由器,查看器平台标识符,DDoS mitigator,区域顶点别名目标……所以不要太“挂断”CDN,或者事实上你要在另一个服务器前面堆叠一个服务 – CloudFront在很大程度上是为了补充S3而devise的。 他们每个专门在存储和交付的某些方面。
你可能会从这个小小的爆发中得到这样的印象:我是AWS的隐形传道者,但我不是。 没有从属关系。 我只是一个有用的工具迷,而CloudFront是一种与“CDN”无关的方便function的瑞士军刀。
因此,CloudFront是一个可行的解决scheme。 它允许你使用你自己的域名和一个SSL证书(你买的一个或者从ACM免费的一个),它可以select把域名与存储桶名称分开,所以存储桶名称不再需要与域。
此外,如果您的整个站点位于CloudFront上,则不一定需要uploads. 在主机名上 – 整个站点可以位于一个主机名的后面,因为CloudFront允许您通过path模式有select地路由到不同的后端。
CloudFront也倾向于优化上传速度,因为客户端将连接到附近的边缘,而客户端和存储区之间的其余path将位于AWS的托pipenetworking上,而不是公共Internet上。
但是,您提到了“主机白名单”问题。 CloudFront拥有数以万计的IP地址,因此部分解决scheme仍然有点欠缺。 他们是公共信息,但这是一个大名单。
不过,这比S3更好,因为AWS不会单独发布S3的地址范围,就像他们使用CloudFront一样。
但是,如果您真的不想使用CloudFront路由,请将HAProxy安装在EC2中的一个小型t2.micro实例上,并在popup式IP的相同区域中安装Elastic IP。 将其configuration为S3的反向代理,在那里安装您的证书,并指定您的主机名,并将代理configuration为将Host:标题重写回存储桶名称。
这就意味着你有一个静态IP 和你的虚荣域。 只要实例与桶在同一个区域内,唯一的成本应该是实例的成本,因为您不支付相同区域内的EC2和S3之间的带宽。
自从CloudFront提供SNI之前,我一直在这样做(尽pipe当时实例是m1 ),基本上也是这样,尽pipe最近我还有一个这样做的理由。 HAProxy 1.6中的Lua解释器可以被用来通过注入一个XSL样式表的引用来操纵S3的XML错误响应 ,以便浏览器使它们…非常漂亮。