лучшие практики для потоковой передачи изображений в S3 клиентам через сервер - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь найти лучшую практику для потоковой передачи изображений из s3 в клиентское приложение.

Я создал макет в виде сетки, используя флаттер на мобильном устройстве (аналогично Instagram). Как мой клиент может получить доступ ко всем своим изображениям?

Вот моя текущая настройка: клиент открывает экран своего профиля (который содержит сетку, подобную макету, для всех изображений, отсортированных по метке времени). Это автоматически запрашивает все изображения с сервера. Мой бэкэнд-сервер python3 использует boto3 для доступа к таблицам S3 и Dynamodb. В таблице Dynamodb есть список всех загруженных клиентом путей к изображениям, отсортированный по отметкам времени. Как только я получаю пути, я использую их, чтобы сначала загрузить все изображения на свой сервер, а затем отправить их клиенту.

В основном мой сервер является посредником, загружающим изображения обратно клиенту. Это правильный способ сделать это? Кажется, что если клиент обращается к S3 напрямую, это будет быстрее, но я не уверен, безопасно ли это. Кроме того, я не знаю, как я могу предоставить клиентам доступ к S3, не предоставляя им aws учетные данные ...

Любые предложения будут оценены. Заранее спасибо!

1 Ответ

1 голос
/ 09 мая 2020

То, что вы делаете, будет работать, и это, вероятно, лучший вариант, если вы оптимизируете для того, чтобы что-то работало быстро, не слишком беспокоясь о трате ресурсов сервера, ненужных вычислениях и если у вас нет проблем с масштабируемостью .

Однако, если вы беспокоитесь о масштабируемости и меньшей задержке, а также о безопасном доступе к этим ресурсам изображения, вы можете улучшить свою текущую архитектуру.

Once I получить пути, я использую это, чтобы сначала загрузить все изображения на мой сервер, а затем отправить их клиенту.

Эта часть - первая часть, от которой я бы попытался избавиться, поскольку вы этого не делаете действительно нужен ваш бэкэнд для загрузки этих изображений и их потоковой передачи. Тем не менее, по-прежнему необходимо контролировать доступ к ресурсам в зависимости от того, кому они принадлежат. Я бы подумал о том, чтобы переключить это на настройку ниже, чтобы уменьшить задержку и потратить меньше ресурсов сервера, чтобы выполнить эту работу:

  • Как только я получу пути в вашей серверной службе, сгенерируйте предварительно подписанные URL-адреса для объектов s3, которые предоставят вашему клиенту временный доступ к этим ресурсам (в зависимости от ваших потребностей вы можете настроить временные рамки того, как долго вы хотите, чтобы URL-доступ работал).
  • Затем отправьте эти ссылки на ваш клиент, чтобы он мог напрямую передавать URL-адреса из S3, вместо того, чтобы ваш сервер стал для этого посредником.

После того, как эта настройка заработает, я бы попытался рассмотреть возможность использования Amazon CloudFront для улучшения доступа к вашим объектам с помощью возможностей CDN, которые предоставляет CloudFront, особенно если ваши клиенты находятся в разных географических регионах. AFA Я вижу, вы также можете заставить CloudFront работать с заранее заданными URL-адресами .

Это правильный способ сделать это? Кажется, что если клиент обращается к S3 напрямую, это будет быстрее, но я не уверен, безопасно ли это

Предписанные URL-адреса - это ваш способ смягчить неконтролируемый доступ к вашим объектам S3. Однако вам, вероятно, нужно беспокоиться о крайних случаях (например, как клиенты должны действовать, когда их доступ к объекту S3 истек, чтобы пользователи этого не заметили, et c.). Все это затраты на создание чего-то масштабируемого, если у вас есть проблемы с масштабируемостью.

...