Umieszczam te statyczne zasoby mojej witryny na S3 i konfiguruję CloudFront do ich dystrybucji. Zawierają one w zasadzie treść, której użytkownicy potrzebowaliby do każdego żądania GET w mojej witrynie, do istniejących ścieżek, czyli z błędem.
Mam też kilka żądań POST, które muszę obsłużyć. Przesyłanie formularzy, wysyłanie e-maili, powiadomień, interakcja z bazą danych.
Jak mogę skonfigurować Lambda (lub API Gateway) obok CloudFront dla tej samej domeny, aby CloudFront obsługiwał żądania GET, a API API obsługuje żądania z treścią lub żądaniami POST. Czy mogę to zrobić w jakiś sposób według indywidualnego adresu URL?
Możesz utworzyć funkcję lambda, skonfigurować bramę API, a następnie skonfigurować CloudFront, aby przekazywał określone ścieżki (np. / Rest / *) do bramy API i obsługiwał wszystko inne z segmentu S3.
Oto pełna instrukcja pokazująca, jak to zrobić: https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/
źródło
Z punktu widzenia połączenia „coś” musi odpowiadać na twoje żądania (GET, POST, PUT, wszystko). Przede wszystkim masz połączenie TCP i „coś” musi upewnić się, że rozumie warstwę 7 i ma sens w bajtach wysyłanych przez klienta. Tylko w tym momencie można obsługiwać żądania GET inaczej niż żądania POST lub jeden adres URL niż inny adres URL. W końcu potrzebujesz usługi, która jest w stanie zrozumieć i przekierować HTTP. Są w stanie to zrobić: CloudFront ELB / ALB API Gateway (ograniczenie pojawia się później)
API Gateway korzysta z CloudFront wewnętrznie (bez możliwości faktycznej konfiguracji czegokolwiek na poziomie CloudFront) - oznacza to, że nie ma sposobu, aby uruchomić CloudFront i API Gateway obok siebie, ponieważ w końcu oznaczałoby to uruchomienie CloudFront z CloudFront ramię w ramię.
CloudFront daje Ci możliwość wyboru różnych źródeł na podstawie wzorców - ale możesz tylko wybrać S3 lub ELB / ALB jako źródło - nie funkcje Lambda (oprócz funkcji Lambda @ Edge).
ALB / ELB może wykorzystywać tylko instancje EC2 jako backend - nie ma tutaj Lambda ani S3.
Jedyne sposoby, które mogę wymyślić, które mogłyby zrobić to, co chcesz zrobić, to:
Moje połączenie byłoby ostatnią opcją - ale oznacza to, że musisz skierować klientów / przeglądarki do osobnej subdomeny dla wszystkich zasobów statycznych (lub wszystkich żądań POST).
Wygląda na to, że chcesz przyjrzeć się technologiom takim jak AngularJS lub React, aby zbudować w przeglądarce aplikację opartą na interfejsie API. Dzięki takiemu podejściu uruchamiasz prawdziwy interfejs API, który obsługuje wszystkie „dynamiczne” żądania za pomocą interfejsu API Gateway i dostarcza samą aplikację z S3 jako zasób statyczny. Może spojrzenie na te może pomóc ci znaleźć drogę - nawet jeśli ich nie używasz, to wzór architektoniczny, w jaki sposób budować takie rzeczy, jest tym, o co prosisz imho.
źródło
Mam taką samą konfigurację. Zasoby statyczne w S3, funkcje Lambda obsługiwane przez bramę API i mają tę samą nazwę domeny.
Korzystam z bramy API, która już korzysta z CloudFront i udostępnia niektóre z jego funkcji, takich jak buforowanie. Następnie konfiguruję identyfikatory URI, które są mapowane na zasoby statyczne. W API Gateway zasób może być funkcją Lambda, funkcją AWS, próbą lub innym adresem URL. Mam je wskazać na moje adresy URL S3.
Identyfikatory URI można również ustawić, aby wyświetlały podścieżki, np
/assets/*
.źródło
/assets/*
. Muszę usunąć wdrożenie i kliknąć prawym przyciskiem myszy/assets/*
ścieżkę i wdrożyć stamtąd.