Я размещаю эти статические ресурсы моего сайта на S3 и настраиваю CloudFront для их распространения. По сути, они содержат контент, который понадобится пользователям для любого запроса GET на моем сайте, к существующим путям, то есть с ловушкой для ошибок.
У меня также есть несколько запросов POST, которые мне нужно обработать. Форма подачи заявок, отправка электронных писем, уведомлений, взаимодействие с базой данных.
Как я могу настроить Lambda (или API-шлюз) рядом с CloudFront для того же домена, чтобы CloudFront обрабатывал запросы GET, а API-шлюз обрабатывал запросы с телом или запросами POST. Или я могу сделать это как-то по отдельному URL?
Вы можете создать лямбда-функцию, настроить шлюз API, а затем настроить CloudFront для пересылки определенных путей (например, / rest / *) к шлюзу API и обслуживать все остальное из корзины S3.
Вот полный обзор того, как это сделать: https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/
источник
С точки зрения соединения «что-то» должно отвечать на ваши запросы (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.
Единственное, что я могу придумать, что может сделать то, что вы хотите сделать, это:
Поэтому мой вызов будет последним вариантом, но это означает, что вам нужно указать клиентам / браузерам отдельный поддомен для всех статических активов (или для всех запросов POST).
Звучит так, будто вы хотите взглянуть на такие технологии, как AngularJS или React, чтобы создать в браузере действительно управляемое API-приложение. При таком подходе вы запускаете настоящий API, который обрабатывает все «динамические» запросы со шлюзом API и доставляет само приложение из S3 в качестве статического ресурса. Возможно, просмотр этих может помочь вам найти свой путь - даже если вы их не используете, архитектурный паттерн о том, как создавать такие вещи, - это то, что вы просите imho.
источник
У меня такая же настройка. Статические активы на S3, функции Lambda обслуживаются через шлюз API, и они имеют одно и то же доменное имя.
Я использую шлюз API, который уже использует CloudFront и предоставляет некоторые его функции, такие как кэширование. Затем я настраиваю URI, которые отображаются на статические ресурсы. В API Gateway ресурсом может быть функция Lambda, функция AWS, макет или другой URL-адрес. У меня есть они указывают на мои S3 URL.
URI также могут быть настроены для поиска подпутей, например
/assets/*
.источник
/assets/*
. Я должен удалить развертывание, щелкнуть правой кнопкой мыши на/assets/*
пути и развернуть оттуда.