Подтвердить что ты не робот

IP-адрес клиента в ближайшем регионе AWS

Вопрос

Я хотел бы загрузить некоторые данные в AWS с клиентского устройства, но я бы хотел загрузить в ближайший AWS Region S3 Bucket.

Аналогично, я хотел бы иметь возможность загружаться из ближайшего региона.

Конечно, я бы установил ведро в каждом регионе

Есть ли система, которую я могу использовать, которая, возможно, принимает IP-адрес клиента, а затем выдает ли она us-west-1, eu-west-1, eu-central-1, ap-northeast-1 и т.д.

Суть проблемы в этом. Данные, которые я загружаю, полезны только одному человеку, и ему нужно как можно быстрее добраться до этого человека.

Итак, если я в Англии, я загружаю файл, и мой предполагаемый получатель находится в настоящее время в Японии (так как они могут быть в движении). Загрузка в регион Londons AWS будет иметь более высокий пинг-время, чем более близкий регион в Японию.

4b9b3361

Ответ 1

Найти местоположение клиента с 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 вам нужно найти геолокации для них. Это можно сделать с помощью геологии

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)

И у вас есть расстояние

Поиск ближайшего расстояния

Вы можете прокрутить все ваши сохраненные местоположения и найти ближайшее расстояние, или если вы сохранили свои данные в СУБД, которая поддерживает геопространственные данные (сразу возникает вопрос о postgis), вы можете использовать функцию ST_Distance для выполнения дистанционной компаньона быстро и эффективно с очень маленьким кодом. Как упоминалось ранее, django имеет отличную поддержку геопространственных запросов.

Если вы использовали Postgis/Django, цикл с участием great_circle был бы заменен вызовом st_distance.

Ответ 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

Возможно, вы захотите использовать Ускорение переноса в ведре для различных причины, в том числе следующие:

  • У вас есть клиенты, которые загружаются в централизованное ведро со всего мира.
  • Вы регулярно переводите гигабайты в терабайты данных на разных континентах.
  • Вы недоиспользовали доступную пропускную способность через Интернет при загрузке на Amazon S3.

Ответ 4

С помощью Boto вы можете прочитать имя области из сеанса. Объект session:

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

Имя области определяется как session.get_config_variable ('region')