问题
我想从客户端设备上传一些数据到AWS,但我想上传到最近的AWS Region的S3 Bucket。
同样,我希望能够从最近的地区下载。
当然,我在每个地区都设置了一个水桶
是否有一个我可以使用的系统可能需要客户端的IP地址,然后确定它是否为us-west-1,eu-west-1,eu-central-1,ap-东北1等?
问题的症结在于此。我上传的数据仅对一个人有用,并且需要尽快找到那个人。
因此,如果我在英格兰,我上传了一个文件,我的目标收件人目前在日本(因为他们可能在移动中) - 上传到Londons AWS区域的ping时间比离日本较近的地区。
答案 0 :(得分:3)
基于Route53延迟的路由可以帮助您确定最近的区域。但是每个区域的存储桶名称都不同,所以我不确定如何直接在S3中使用它。
我认为最好的选择是将CloudFront分配放在单个S3存储桶前面。然后,您的用户可以自动上传到最近的CloudFront边缘位置。 https://aws.amazon.com/blogs/aws/amazon-cloudfront-content-uploads-post-put-other-methods/
答案 1 :(得分:3)
使用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)
可从以下网址获取信息: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')