AWS: обслуживайте несколько сайтов в одном домене

У меня есть доменное имя my-portal.com. Я хочу обслуживать статический веб-сайт от my-portal.com/site/a/. Я хочу обслуживать другой статический веб-сайт от my-portal.com/site/b/.

Как это сделать с помощью ресурсов, которые предоставляет AWS?

Я пытался настроить два веб-сайта как две отдельные корзины S3 с включенным статическим хостингом веб-сайтов, а затем создал шлюз API с ресурсами /site/a и /site/b, настроенными как HTTP-прокси для веб-сайтов S3.

Эта установка работала корректно в большинстве случаев. Но когда браузер пытается загрузить двоичный файл (шрифт, изображение и т. д.) с моего статического веб-сайта, шлюз API неправильно обрабатывает этот файл и отвечает поврежденным файлом (поскольку он ведет себя странно с двоичными файлами).

Какие еще способы добиться того же результата у меня есть?


person Girafa    schedule 16.01.2019    source источник


Ответы (3)


Этого легко добиться с помощью AWS CloudFront. Используйте поведение для выбора источника на основе пути. CloudFront имеет встроенную интеграцию с S3.

person cementblocks    schedule 16.01.2019
comment
Имея поведение, указывающее /site/a/* на корзину A, оно будет перенаправлять все запросы на A/site/a, поэтому мне нужно иметь папку /site/a в моей корзине A и /site/b в папке A. ведро B. Есть ли способ указать /site/a/* на корень ведра A? Я не хочу, чтобы мои ведра содержали эти подпути. - person Girafa; 17.01.2019
comment
@Girafa, чтобы перезаписать этот путь, вы можете использовать триггер Lambda@Edge Origin Request, чтобы перезаписать пути на обратной стороне CloudFront, прежде чем они будут отправлены в корзины. Совместное использование CloudFront и одного триггера Lambda@Edge по-прежнему является более дешевым решением, чем API Gateway. - person Michael - sqlbot; 17.01.2019
comment
Это звучит интересно. Я попробую. Спасибо - person Girafa; 18.01.2019

Вы можете создать поддомен (a и b) и использовать его на своем веб-сайте.

  1. my-portal.com
  2. a.my-portal.com
  3. b.my-portal.com

Если вы разместили свой домен за пределами Amazon, вы можете использовать маршрут 53 или адрес fwd в CNAME.

Пожалуйста, прочитайте следующие ссылки для деталей

person vaquar khan    schedule 16.01.2019
comment
Спасибо. По сути, причина, по которой я хочу, чтобы два веб-сайта находились в одном домене, заключается в том, что я хочу разделить между ними WebStorage. Наличие их в поддоменах нарушит это требование. Но все же спасибо за ваш ответ. - person Girafa; 16.01.2019
comment
Вы не хотите использовать nginx? - person vaquar khan; 16.01.2019
comment
поделиться веб-хранилищем ... что это значит? - person Michael - sqlbot; 17.01.2019
comment
@vaquarkhan, вы имеете в виду запуск nginx в контейнере Fargate вместо использования шлюза API более высокого уровня или других ресурсов? - person Girafa; 17.01.2019
comment
@Michael-sqlbot localStorage и sessionStorage - person Girafa; 17.01.2019
comment
Хорошо, я думаю, что нашел обходной путь. В API Gateway можно настроить типы mime двоичных файлов. При использовании */* APIG обрабатывает каждый ответ как двоичный файл. Он отлично работает для html/js/css/images/fonts и т. д. Но он ломает JSON API, если таковой имеется. Итак, единственное ограничение в данном случае — не смешивать JSON API со статикой. - person Girafa; 17.01.2019
comment
@Girafa о, да, конечно. Я думал об AWS и серверных компонентах и ​​не мог представить, о чем вы говорите в этом контексте. Виноват. Оба они ограничены одним источником, что действительно исключает субдомены. - person Michael - sqlbot; 17.01.2019
comment
Рад, что вы исправили проблему, однако, если вы добавите свой вопрос с ошибкой двоичного сжатия при побеге API или свое условие, почему вы хотите использовать Http Proxy, вы получите правильный ответ. Лучше всего вы можете добавить свой ответ здесь и отметить как правильный, чтобы помочь другим, кто столкнется с такой же проблемой в будущем. - person vaquar khan; 17.01.2019

Решение № 1. Используйте CloudFront + Lambda@Edge

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

  • https://my-portal.com/site/a => https://bucket-a.s3-website.amazonaws.com/site/a
  • https://my-portal.com/site/b => https://bucket-b.s3-website.amazonaws.com/site/b

Единственным ограничением является то, что каждая корзина S3 должна знать путь и предоставлять в ней одинаковую файловую структуру. Корзина для сайта A должна содержать папку /site/a, корзина B должна содержать папку /site/b.

Это ограничение можно обойти, используя Lambda@Edge.

Решение № 2. Настройка MIME-типов двоичных файлов в шлюзе API

Шлюз API позволяет настраивать типы mime бинарных файлов. Но для этого требуются запросы, чтобы заголовок Accept был совместим с настроенными типами mime.

Так, например, если вы настроите image/* в качестве двоичного MIME-типа в APIG, ваши запросы на изображения должны иметь заголовок Accept со значением image/png, image/jpg или просто image/*. Если заголовок отсутствует или имеет другое значение, APIG не будет рассматривать ответ как двоичный файл.

Проблема здесь в том, что браузеры обычно отправляют Accept: */*, когда пытаются загрузить ресурсы, импортированные из CSS.

Таким образом, единственным решением было бы настроить */* как двоичный MIME-тип. Это сломает все недвоичные ответы, обслуживаемые этим шлюзом API, например ответы JSON.

Решение № 3. Размещайте бинарные файлы отдельно

Это комбинация двух предыдущих подходов. Вы можете просто создать отдельный хостинг для статических веб-сайтов и поместить туда свои бинарные файлы.

person Girafa    schedule 18.01.2019