IN SHORT
How do I connect to the nearest EC2 instances using CloudFront to achive
geolocation based Content Distribution?
我想要做一个基于地理位置的内容分发,以便最终用户可以到达地理位置上离他最近的边缘位置,然后从离他最近的 s3 实例获取静态内容,该实例的地址只有关联的 EC2 实例知道。
______
| EC2 |
|------|
| S3 |
|______| Lets say this is a single unit
我希望这些单元充当我的内容的缓存。需要 EC2 来检查权限并检查数据库内容的可用性,而 S3 包含实际数据。
我希望用户能够联系到距离他最近的单位。因此,我决定使用 AWS CloudFront
如果我直接使用 S3 存储桶,这种方法就可以很好地工作,但这会创建不必要的数据副本(一个选项是 TTL,但对于用例来说它不起作用)。
因此我尝试使用CloudFront-Viewer-Country
白名单,但没有看到任何变化。
答案1
为 CloudFront 选择一个主机名,在访问后端时将其用作源服务器主机名。此主机名需要位于您控制的域中,该域在 Route 53 中配置。
我们要做的是安排它,以便每当 CloudFront 中的边缘位置尝试查找此主机名时,它都会收到最近的 EC2 实例的 IP 地址。(浏览器会自动路由到最近的 CloudFront 边缘,因此前端路由是自动的。我们只需路由到所需的后端即可)。
为此,创建多个基于延迟的路由Route 53 中此单个主机名的记录,每个记录指向一个 EC2 实例(或者可能是 ELB,如果在给定区域中有多个实例),并且映射(在 Route 53 配置中)到部署 EC2 实例的区域。
每次 CloudFront 边缘位置需要在 DNS 中查找原始服务器时,它收到的答案将是位于最靠近特定 CloudFront 边缘位置的 EC2 区域中的实例。(CloudFront 位置比 AWS 区域多)。此实例将是此特定 CloudFront 边缘将其所有请求发送到的唯一实例 - 这正是您想要的 - 因为客户端请求将已发送到最近的 CloudFront 边缘,并且每个 CloudFront 边缘现在都将请求发送到最近区域中的 EC2 实例。
对于没有实例的区域,在 Route 53 中不配置任何内容,将自动选择现有区域之一(即“最接近”CloudFront 边缘的区域)。即使您在基于延迟的路由 RR 集中只配置了一个区域,此配置实际上仍然有效,因为该区域始终被视为“最接近”全球任何地方的区域,因为没有其他区域可以与之比较。
当然,请注意,地理路由既是一门艺术,也是一门科学,因此不能保证“最近”的 CloudFront 边缘(特定位置的浏览器连接到的边缘)一定是您期望的边缘,而且“最近”的 AWS 区域也不一定就是您预期的区域。这可能是因为“最近”指的是最佳连接性而不是地理距离,或者是因为用户没有被正确定位。这不是 Route 53 或 CloudFront 的限制,而是因为 100% 准确的基于 IP 地址的地理定位根本是不可能的。这种不精确性需要纳入您的设计中,但总的来说,这是您似乎试图实现的解决方案。