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

Виртуальный контент Cloudfront + подписанная архитектура URL-адресов

Позвольте мне начать с краткого введения в архитектуру системы, которую я планирую перейти на S3 + Cloudfront.

У нас есть число сущностей порядка в дереве. Листья дерева имеют несколько ресурсов (jpg-изображения должны быть конкретными), обычно в порядке 20-5000, со средним значением ~ 200. Каждый ресурс имеет уникальный URL-адрес, который сегодня доступен в нашей настройке колонок.

Я мог бы просто перенести все эти ресурсы на S3, настроить Cloudfront поверх этого и сделать это. Если бы мне не пришлось защищать ресурсы.

Большинство объектов являются общедоступными (то есть ~ 99%), остальные af защищены одним из многих способов (логин, ip, время и т.д.). Когда объект защищен, все ресурсы также должны быть защищены, и их можно получить только после того, как было выполнено действительное авторизацию.

Я мог бы решить это, создав два ведра S3 - одну частную и одну публику. Для личного контента я бы сгенерировал подписанный URL Cloudfront после того, как пользователь был авторизован. Однако состояние субъекта может быть изменено от публичного до частного произвольно, и наоборот. Администратор системы может изменить объект на любом уровне дерева сущностей, что приведет к каскадным изменениям по всему дереву. Одно изменение может вызвать изменение ~ 20 тыс. Сущностей, умноженное на 200 ресурсов, что повлияет на 4 миллиона ресурсов.

Я мог бы запустить службу в фоновом мониторинге для изменений состояния, но это было бы громоздким, и изменение ACL с 4 миллионами элементов S3 займет значительное время, и в то время как это произойдет, у нас либо будет незащищенный частный контент, либо общедоступный контент, который нам нужно будет генерировать подписанные URL-адреса для.

Другая возможность - сделать все ресурсы закрытыми по умолчанию. При каждом запросе, полученном для сущности, мы создадим настраиваемую политику, предоставляющую доступ для этого конкретного пользователя всем ресурсам, содержащимся в объекте (с использованием шаблона подстановочных знаков в пользовательской политике). Это потребовало бы создания политики для каждого посетителя, для каждого объекта - это не было бы проблемой. Однако это означает, что наши пользователи больше не смогут кэшировать что-либо, поскольку URL-адрес будет изменяться для каждого нового сеанса. Хотя это не проблема для частного контента, для нас было бы отбросить все кэширование для ~ 99% общедоступных объектов.

Еще одним вариантом было бы сохранить все содержимое конфиденциальным и использовать вышеуказанный подход для частных лиц. Для публичных объектов мы могли бы создать единую настраиваемую политику для каждого публичного объекта, которую все пользователи разделили бы. Если мы установим срок службы 6 часов и обеспечим создание новой политики через 5 часов, пользователю будет гарантирован срок действия политики не менее одного часа. Это имеет преимущество, позволяя кэшировать до 6 часов, позволяя частному контенту, возможно, быть открытым до 6 часов после изменения состояния. Это было бы приемлемо, но я не уверен, что это того стоит (мы пытаемся найти соотношение кеширования/ударов в настоящее время). Очевидно, мы могли бы настроить границу 5/6 часов, чтобы обеспечить более длительный/более короткий кеш за счет более длительного/более короткого воздействия на частные объекты.

Кто-нибудь развернул аналогичное решение? Любые функции AWS, с которыми я не обращаю внимания, могут быть полезны? Любые комментарии вообще?

4b9b3361

Ответ 1

Основываясь на популярном запросе, я сам отвечаю на этот вопрос.

После сбора соответствующих показателей и выполнения некоторых вычислений мы закончили вывод, что мы могли бы жить с меньшим кэшированием, компенсируя более быструю скорость обслуживания объектов CloudFront. Фактическая реализация подробно описана в моем блоге: Как настроить и обслуживать личный контент с помощью S3 и Amazon CloudFront

Ответ 2

Активы в одном ведре могут иметь разные политики конфиденциальности. Таким образом, вы можете иметь публичные и частные активы в одном ковше.

При загрузке просто установите настройку конфиденциальности.

Затем просто подпишите URL-адрес для доступа к частным активам.