【问题标题】:Client IP Address to Closest AWS Region到最近的 AWS 区域的客户端 IP 地址
【发布时间】:2016-08-11 23:32:18
【问题描述】:

问题

我想将一些数据从客户端设备上传到 AWS,但我想上传到最近的 AWS 区域的 S3 存储桶。

同样,我希望能够从最近的区域下载。

当然,我会在每个区域设置一个存储桶

是否有一个我可以使用的系统可以获取客户端的 IP 地址,然后确定它是 us-west-1、eu-west-1、eu-central-1、ap-northeast-1 等?

问题的关键是这个。我上传的数据只对一个人有用,它需要尽快到达那个人。

因此,如果我在英格兰,我上传了一个文件,而我的目标收件人目前在日本(因为他们可能正在移动) - 上传到伦敦 AWS 区域的 ping 时间会比更近的区域更长去日本。

【问题讨论】:

  • 当你说“客户端设备”是什么意思?
  • 我有类似的问题,但我从未解决过。我尝试使用 CloudFront,但由于某种原因无法正常工作,请求被错误地路由。然后我尝试了基于此stackoverflow.com/questions/25678049/… 的 nginx 负载平衡,但无法使其正常工作。底线是你激励我再试一次 :) 如果我解决了这个问题,我会给你更新。

标签: python amazon-s3


【解决方案1】:

通过IP查找客户位置

使用地理ip

pip install python-geoip
pip install python-geoip-geolite2

那么您的代码将如下所示。

from geoip import geolite2
match = geolite2.lookup('8.8.8.8')

print match.location

这会产生, (37.386, -122.0838)

查找所有 AWS 中心的位置

信息来自:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html,您需要找到他们的地理位置。这可以通过 geopy 来完成

pip install geopy

然后

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.geocode("Singapore")
print location.latitude, location.longitude

这给了

1.2904527 103.852038

您需要为您的所有位置执行此操作并保存数据。可能在 RDBMS 中(如果您这样做,请考虑使用 django,django 对使用 GeoDjango 进行地理定位搜索具有出色的支持)

终于找到了距离

找到客户端位置后,我们称它为 l1,找到数据中心位置后,就该计算距离了

from geopy.distance import great_circle
great_circle(l1.point, l2.point)

还有距离

寻找最近的距离

您可以遍历所有保存的位置并找到最近的距离,或者如果您将数据保存在支持地理空间数据的 RDBMS 中(立即想到 postgis),您可以使用ST_Distance 函数进行距离比较用很少的代码快速有效地。如前所述,django 对地理空间查询具有出色的支持。

如果您使用 Postgis/Django,涉及 great_circle 的循环将被调用 st_distance 所取代。

【讨论】:

  • 近5年后还是这么难吗?现在有更好的选择吗?
【解决方案2】:

Route53 基于延迟的路由可以帮助您确定最近的区域。但是,每个区域的存储桶名称会有所不同,因此我不确定您将如何将其直接用于 S3。

我认为最好的选择是将 CloudFront 分配放在单个 S3 存储桶的前面。然后,您的用户可以自动上传到最近的 CloudFront 边缘站点。 https://aws.amazon.com/blogs/aws/amazon-cloudfront-content-uploads-post-put-other-methods/

【讨论】:

    【解决方案3】:

    您可以使用 S3 提供的“传输加速”功能(您可以使用 AWS 控制台在存储桶属性中启用它)。

    文档:https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

    您可能希望在存储桶上使用 Transfer Acceleration 进行各种 原因,包括以下几点:

    • 您的客户从世界各地上传到一个集中存储桶。
    • 您定期跨大洲传输 GB 到 TB 的数据。
    • 上传到 Amazon S3 时,您未充分利用 Internet 上的可用带宽。

    【讨论】:

      【解决方案4】:

      使用 Boto,您可以从 session.Session 对象中读取 region_name:

      my_session = boto3.session.Session()
      my_region = my_session.region_name
      

      region_name 定义为 session.get_config_variable('region')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 2011-10-22
        • 2011-10-04
        • 1970-01-01
        • 2013-04-20
        • 2020-03-10
        • 2019-11-13
        相关资源
        最近更新 更多