AWS Lambda@Edge – obsługa niestandardowych nagłówków w Amazon CloudFront

Udostępnianie zawartości bucketów w usłudze Amazon S3 poprzez sieci CDN (Content Delivery Network) takie jak CloudFlare, Amazon CloudFront, Akamai itp. jest powszechnie stosowanych rozwiązaniem dla osób szukających sposobu na udostępnienie treści online.

4 minuty czytania

Modyfikacja nagłówków z AWS Lambda@Edge

W przypadku wykorzystywania rozwiązać wyłącznie AWSowych możemy spotkać się z pewną przeszkoda, ponieważ CloudFront nie umożliwia manipulowania treścią nagłówków http które przez niego przechodzą. Operowanie nagłówkami może okazać się kluczowe, gdy chcemy osiągnąć jeden z poniższych przykładowych efektów:

  • Sprawdzić pliki cookie, aby przepisać adresy URL do różnych wersji witryny pod kątem testów A/B.
  • Wysyłać różne obiekty do swoich użytkowników na podstawie nagłówka User-Agent, który zawiera informacje o urządzeniu, które przesłało żądanie. Na przykład możesz wysyłać obrazy w różnych rozdzielczościach do użytkowników na podstawie ich urządzeń.
  • Sprawdzić nagłówki lub autoryzowane tokeny, wstawianie odpowiedniego nagłówka i zezwalanie na kontrolę dostępu przed przekazaniem żądania do źródła.
  • Dodawać, usuwać i modyfikować nagłówki oraz przepisuj ścieżkę adresu URL, aby kierować użytkowników do różnych obiektów w pamięci cache.

W takim przypadku możemy skorzystać z innego dostawcy CDN albo wykorzystać pośredniczący serwer np. NGINX. Jednak wykorzystanie w tej sytuacji instancji EC2 pozbawia nas głównej zalety jaką jest bezserwerowość tego rozwiązania.

Czy mamy w tej sytuacji inne narzędzia które mogą nam pomóc rozwiązaniu tej kwestii ?

AWS Lambda@Edge

Tak, dla rozwiązania takiej sytuacji możemy wykorzystać właśnie AWS Lambda@Edge.
W dużym uproszczeniu polega to na stworzeniu zwykłej funkcji lambda, a następnie doklejeniu jej do edge lokacji naszej dystrybucji CDN aby przechwytywać i manipulować nagłówkami w zapytaniach i odpowiedziach.  

Tworząc Lambdę należy pamiętać o kilku ograniczeniach, które należy spełnić aby móc taką funkcję wykorzystać do manipulacji nagłówkami.

Pierwszym znaczącym ograniczeniem jest  lista technologii jakie możemy wybrać do stworzenia funkcji. Jest ona ograniczona do funkcji działających w oparciu o języki Python oraz JavaScript. Poniżej znajduję się lista aktualnie wspieranych wersji.

  • Python 3.8
  • Python 3.7
  • Node.js 12
  • Node.js 10
  • Node.js 8 and Node.js 6 ( dostępne jest wsparcie dla już stworzonych funkcji w oparciu o te konkretne wersje, tworzenie nowych funkcji nie jest wspierane )

Przykładowa treść funkcji dodająca kilka headerów do zwracanej odpowiedzi.

'use strict';
exports.handler = (event, context, callback) => {

//Get contents of response
const response = event.Records[0].cf.response;
const headers = response.headers;

//Set new headers
headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}];
headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}];
headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}];
headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}];
headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}];
headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}];

//Return modified response
callback(null, response);
};

Następnym istotnym wymaganiem jest region w którym tworzymy swoją funkcję, jest on ograniczony do N.Viriginia. Po utworzeniu funkcji należy pamiętać aby dodać odpowiednie uprawnienia konieczne podczas korzystania z funkcji jako Lambda@Edge, mianowicie konieczne jest dodanie „edgelambda.amazonaws.com” do trusted policy, która jest przypisana do naszej funkcji.

Konfiguracja Amazon CloudFront

Tak przygotowaną funkcję jesteśmy w stanie dołączyć do naszej dystrybucji CloudFront.
Aby to zrobić należy przejść do zakładnik Behaviors w konsoli zarządzania usługą CloudFront, wybrać interesującą nas pozycję z listy i przejść do Edycji. Na dole strony znajdziemy miejsce, aby dodać i skonfigurować funkcję Lambda. Upewnijmy się, że wklejamy ARN funkcji wraz z numerem jej wersji. Następnie wybieramy Event Type który odpowiada naszym potrzebom.

Po zatwierdzeniu zmian należy poczekać aż nasza funkcja rozpropaguje się pomiędzy edge lokalizacjami, w których pracuje nasza dystrybucja CloudFronta.

Podsumowanie

Można zatem stwierdzić, że AWS Lambda@Edge jest idealnym rozwiązaniem, kiedy potrzebujemy manipulować treścią nagłówków, a nie chcemy się bawić w robienie tego na zwykłych serwerach, którymi potem trzeba zarządzać.

Komentarze