最靠近AWS区域的客户端IP地址

时间:2016-04-19 16:31:58

标签: python amazon-s3

问题

我想从客户端设备上传一些数据到AWS,但我想上传到最近的AWS Region的S3 Bucket。

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

当然,我在每个地区都设置了一个水桶

是否有一个我可以使用的系统可能需要客户端的IP地址,然后确定它是否为us-west-1,eu-west-1,eu-central-1,ap-东北1等?

问题的症结在于此。我上传的数据仅对一个人有用,并且需要尽快找到那个人。

因此,如果我在英格兰,我上传了一个文件,我的目标收件人目前在日本(因为他们可能在移动中) - 上传到Londons AWS区域的ping时间比离日本较近的地区。

4 个答案:

答案 0 :(得分:3)

基于Route53延迟的路由可以帮助您确定最近的区域。但是每个区域的存储桶名称都不同,所以我不确定如何直接在S3中使用它。

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

答案 1 :(得分:3)

从IP

查找客户端的位置

使用geoip

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替换。

答案 2 :(得分:1)

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

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

  

您可能希望在存储桶上使用传输加速   原因,包括以下内容:

     
      
  • 您的客户可以上传到来自世界各地的集中存储桶。
  •   
  • 您可以在各大洲定期将千兆字节转换为数TB的数据。
  •   
  • 上传到Amazon S3时,您未充分利用互联网上的可用带宽。
  •   

答案 3 :(得分:0)

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

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

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