题
我想从客户端设备上传一些数据到AWS,但我想上传到最近的AWS Region的S3 Bucket.
同样,我希望能够从最近的地区下载.
当然,我会在每个地区设置一个水桶
是否有一个我可以使用的系统可能需要客户端的IP地址,然后确定它是us-west-1,eu-west-1,eu-central-1,ap-northeast-1等?
问题的症结在于此.我上传的数据仅对一个人有用,它需要尽快找到那个人.
因此,如果我在英格兰,我上传一个文件,我的目标收件人目前在日本(因为他们可能在移动) - 上传到伦敦AWS区域的ping时间将比靠近日本的区域更高.
使用 geoip
pip install python-geoip
pip install python-geoip-geolite2
Run Code Online (Sandbox Code Playgroud)
然后你的代码看起来像这样。
from geoip import geolite2
match = geolite2.lookup('8.8.8.8')
print match.location
Run Code Online (Sandbox Code Playgroud)
这产生, (37.386, -122.0838)
该信息可从以下位置获得:http : //docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html您需要为它们找到地理位置。这可以用 geopy 来完成
pip install geopy
Run Code Online (Sandbox Code Playgroud)
然后
from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.geocode("Singapore")
print location.latitude, location.longitude
Run Code Online (Sandbox Code Playgroud)
这使
1.2904527 103.852038
Run Code Online (Sandbox Code Playgroud)
您需要为所有位置执行此操作,并将数据保存在某个地方。可能在 RDBMS 中(如果您这样做,请考虑使用 django,django 对使用 GeoDjango 进行地理定位搜索有很好的支持)
找到客户端位置后,我们称其为 l1,找到数据中心位置后,是时候计算距离了
from geopy.distance import great_circle
great_circle(l1.point, l2.point)
Run Code Online (Sandbox Code Playgroud)
你有距离
您可以遍历所有保存的位置并找到最近的距离,或者如果您将数据保存在支持地理空间数据的 RDBMS 中(立即想到 postgis),您可以使用该ST_Distance功能快速有效地进行距离比较代码。如前所述,django对地理空间查询有很好的支持。
如果您要使用 Postgis/Django ,则涉及 great_circle 的循环将替换为对 st_distance 的调用。
Route53 基于延迟的路由可以帮助您确定最近的区域。但是,每个区域的存储桶名称都会有所不同,因此我不确定如何直接在 S3 中使用它。
我认为最好的选择是将 CloudFront 发行版放置在单个 S3 存储桶前面。然后,您的用户可以自动上传到最近的 CloudFront 边缘位置。https://aws.amazon.com/blogs/aws/amazon-cloudfront-content-uploads-post-put-other-methods/
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |