С точки зрения соединения «что-то» должно отвечать на ваши запросы (GET, POST, PUT, все). Прежде всего, у вас есть TCP-соединение, и «что-то» должно убедиться, что оно понимает уровень 7 и имеет смысл из байтов, которые отправляет клиент. Только на этом этапе можно обрабатывать запросы GET иначе, чем запросы POST или один URL-адрес, чем другой URL-адрес. Таким образом, в конце концов вам нужен сервис, способный понимать и маршрутизировать HTTP. Следующие сервисы способны сделать это: CloudFront ELB / ALB API Gateway (ограничение наступит позже)
API Gateway использует CloudFront для внутреннего использования (не давая вам возможности на самом деле что-либо настраивать на уровне CloudFront) - это означает, что невозможно запустить CloudFront и API Gateway параллельно, так как в конечном итоге это будет означать, что вы запустите CloudFront с CloudFront бок о бок.
CloudFront дает вам возможность выбирать разные источники на основе шаблонов - но вы можете выбрать только S3 или ELB / ALB в качестве источника, а не функции Lambda (помимо функциональности Lambda @ Edge).
ALB / ELB может использовать только экземпляры EC2 в качестве бэкэнда - здесь нет лямбды или S3.
Единственное, что я могу придумать, что может сделать то, что вы хотите сделать, это:
- Вы используете API-шлюз и маршрутизируете конкретный путь «актива» в функцию Lambda, которая выполняет роль обратного прокси-сервера для S3 (так что передача статических активов через лямбду) - узнайте о затратах для Lambda здесь!
- Вы можете сделать то же самое, но вместо того, чтобы передавать ресурс через Lambda, просто сгенерируйте подписанный URL-адрес внутри Lambda и перенаправьте напрямую на S3 для обслуживания (может быть более экономичным)
- Использование других поддоменов для ваших активов, чем для остальной части вашего приложения - это очень распространенный шаблон, так как вы можете легко разделить на уровне DNS и использовать разные сервисы для разных вариантов использования (CloudFront для активов и API Gateway для нестатических части)
Поэтому мой вызов будет последним вариантом, но это означает, что вам нужно указать клиентам / браузерам отдельный поддомен для всех статических активов (или для всех запросов POST).
Звучит так, будто вы хотите взглянуть на такие технологии, как AngularJS или React, чтобы создать в браузере действительно управляемое API-приложение. При таком подходе вы запускаете настоящий API, который обрабатывает все «динамические» запросы со шлюзом API и доставляет само приложение из S3 в качестве статического ресурса. Возможно, просмотр этих может помочь вам найти свой путь - даже если вы их не используете, архитектурный паттерн о том, как создавать такие вещи, - это то, что вы просите imho.