Brak nagłówka kontroli pamięci podręcznej dla plików z AWS CloudFront z S3 Origin

27

Właśnie przeprowadziliśmy migrację do Amazon AWS. Obecnie mamy instancję EC2, która działa dobrze. Z przodu działa Nginx, a z tyłu Apache. To też działa dobrze. Wszystkie witryny są uruchamiane poprawnie i zawierają nagłówek Cache-Control dla plików obsługiwanych z EC2.

Problem dotyczy WSZYSTKICH plików statycznych, które umieściliśmy w Amazon S3 , do których dostęp jest uzyskiwany za pośrednictwem CloudFront CDN . Możemy uzyskać dostęp do plików w porządku (i nie ma problemu z CORS), ale najwyraźniej CloudFront nie obsługuje plików z nagłówkiem Cache-Control. Chcemy wykorzystać buforowanie przeglądarki.

Z mojego punktu widzenia instancja EC2 nie odgrywa tutaj roli, ponieważ pliki statyczne są obsługiwane bezpośrednio przez S3 + CloudFront, żądanie nie trafia do serwera WWW w EC2.

Jestem całkowicie zagubiony.

Pytanie: 1) Jak ustawić Cache-Control w tym przypadku? 2) Czy można ustawić Cache-Control? Z S3 lub CloudFront?

Uwaga: trafiłem na kilka stron w Google, gdzie możesz ustawić nagłówek w S3 dla poszczególnych obiektów. To naprawdę nie jest produktywny sposób, aby to zrobić specjalnie, ponieważ w moim przypadku mówimy o kilku przedmiotach.

Dzięki!

jarvis
źródło
Proszę opublikować adres URL obiektu w S3 i odpowiedni adres URL CloudFront. Chciałbym zobaczyć zachowanie, które sam opisujesz. Alternatywnie publikuj CURL dla obu, pokazując nagłówki.
Tim
Udało mi się dodać niestandardowy nagłówek „Wygasa: niedz., 15 października 2027 13:46:07 GMT”, edytując origin w console.aws.amazon.com/cloudfront/home . Jednak to nie działa. Jak to zrobiłeś w końcu?
Manolo,

Odpowiedzi:

31

Znalazłem kilka stron w Google, w których możesz ustawić nagłówek w S3 dla poszczególnych obiektów. To naprawdę nie jest produktywny sposób, aby to zrobić specjalnie, ponieważ w moim przypadku mówimy o kilku przedmiotach.

Cóż, „produktywne” czy nie, tak właśnie jest zaprojektowane.

CloudFront nie dodaje Cache-Control: nagłówków.

CloudFront przechodzi, przez (a także względem, o ile inaczej skonfigurowane) w Cache-Control:nagłówkowe serwera pochodzenia, która w tym przypadku jest S3.

Aby uzyskać Cache-Control:nagłówki dostarczone przez S3 podczas pobierania obiektu, należy je podać, gdy obiekt zostanie przesłany do S3 lub dodany do metadanych obiektu przez kolejną operację umieszczania i kopiowania, której można użyć do wewnętrznego skopiowania obiektu do siebie w S3, modyfikując metadane w procesie. To właśnie robi konsola poza sceną, jeśli edytujesz metadane obiektu.

Nie ma też (na wypadek, gdybyś się zastanawiał) żadnego globalnego ustawienia w S3, które zmusiłoby wszystkie obiekty w wiadrze do zwrócenia tych nagłówków - jest to atrybut na obiekt.


Aktualizacja: Lambda @ Edge to nowa funkcja w CloudFront, która pozwala uruchamiać wyzwalacze dla żądań i / lub odpowiedzi, między przeglądarką a pamięcią podręczną i / lub pamięcią podręczną i źródłem, uruchamiając kod napisany w Node.js w stosunku do prostej struktury obiektu żądania / odpowiedzi narażone przez CloudFront.

Jedną z głównych aplikacji dla tej funkcji jest manipulowanie nagłówkami ... więc chociaż powyższe jest nadal dokładne - sam CloudFront nie dodaje Cache-Control- możliwe jest teraz, aby funkcja Lambda dodała je do odpowiedzi zwróconej z CloudFront.

Ten przykład dodaje Cache-Control: public, max-age=86400tylko wtedy, gdy Cache-Controlnagłówek nie zawiera już odpowiedzi.

Użycie tego kodu w wyzwalaczu Origin Response spowoduje, że będzie on uruchamiany za każdym razem, gdy CloudFront pobierze obiekt od źródła, i zmodyfikuje odpowiedź, zanim CloudFront go buforuje.

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

Aktualizacja (2018-06-20): Niedawno wysłałem żądanie funkcji do zespołu CloudFront, aby umożliwić konfigurację statycznych nagłówków odpowiedzi na pochodzenie jako atrybutów pochodzenia, podobnie jak w przypadku dodawania statycznych nagłówków żądania , teraz ... ale z twist, umożliwiając skonfigurowanie dodawania każdego nagłówka warunkowo (tylko jeśli źródło nie podało tego nagłówka w odpowiedzi) lub bezwarunkowo (dodając nagłówek i nadpisując nagłówek z tego miejsca, jeśli jest obecny).

W przypadku żądań funkcji zazwyczaj nie otrzymujesz żadnego potwierdzenia, czy rozważają wdrożenie nowej funkcji ... lub nawet czy już nad nią pracowali ... jest to po prostu ogłaszane, kiedy skończą. Nie mam więc pojęcia, czy zostaną one wdrożone. Trzeba wysunąć argument, że ponieważ ta funkcja jest już dostępna za pośrednictwem Lambda @ Edge, nie ma takiej potrzeby w podstawowej funkcjonalności ... ale moim argumentem jest to, że podstawa funkcjonalnie nie jest kompletna bez funkcji wykonuj proste, statyczne operacje na nagłówkach odpowiedzi, i jeśli jest to jedyny powód, dla którego potrzebny jest wyzwalacz, to wymaganie wyzwalaczy Lambda jest niepotrzebnym kosztem, finansowym i dodatkowym opóźnieniem (chociaż nie jest to koniecznie koszt dziwaczny).

Michael - sqlbot
źródło
Nadal jest to irytujące.
Erica Kane
1
Tada, rzeczywiście, Kunal. Jest to przykład tego, o czym mówiłem w odpowiedzi jako „dodany do metadanych obiektu przez kolejną operację umieszczania i kopiowania”. Używaj go ostrożnie i testuj, ponieważ istnieją zastrzeżenia. Zresetuje wszystkie twoje znaczniki danych i może mieć wpływ na szyfrowanie. Może także zmieniać etagi obiektów z formatu wieloczęściowego na format jednoczęściowy, który jest innym algorytmem, i dezorientuje każdy system, który przechowywał etagi w innym miejscu do celów przyszłych kontroli integralności. Jeśli wersjonowanie jest włączone w segmencie, Twój koszt przechowywania podwaja się, chyba że wyczyścisz stare wersje.
Michael - sqlbot
1
Nowa usługa Lambda @ Edge udostępnia teraz także mechanizm, który umożliwia dodawanie nagłówków odpowiedzi Cache-Control (między innymi) w locie. Zaktualizowałem odpowiedź praktycznym przykładem tego, jak można to zrobić.
Michael - sqlbot
1
@Broshi w „polityce zaufania” roli należy wymienić zarówno usługi lambda, jak i edgelambda. Spójrz na docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot