6

Mam wiadro S3, na którym znajduje się CloudFront CDN.S3/CloudFront, wyświetlaj wszystkie pliki z nagłówkiem "Cache-Control: max-age = 365000000, niezmienny"

To wiadro S3 jest "niezmienne", co oznacza, że ​​po przesłaniu tam pliku, nigdy go nie usuwam ani nie aktualizuję. Wtedy jest bezpiecznie, że wszyscy klienci buforują pliki pochodzące z S3/CloudFront bardzo agresywnie.

Obecnie Etagi działają świetnie, a klienci najczęściej trafiają do 304 odpowiedzi. Jednak uzyskanie odpowiedzi 304 nadal wiąże się z obietnicą, której można uniknąć dzięki bardziej agresywnemu buforowaniu.

Więc chciałbym ten problem:

  • CloudFront CDN cache nigdy nie powinien dostać unieważnione, ponieważ S3 cache nigdy się nie zmienia. CloudFront nie musi ponownie pytać S3 o plik więcej niż jeden raz. Myślę, że udało mi się skonfigurować to za pomocą ustawień dystrybucji CloudFront.

  • CloudFront powinny służyć wszystkie pliki z nagłówka Cache-Control: max-age=365000000, immutable (immutable to nowy, częściowo wspierane wartość od 2016)

Nie rozumiem, w jaki sposób można osiągnąć pożądany rezultat. Czy powinienem sobie z tym poradzić na poziomie CloudFront lub S3? Czytałem kilka rzeczy o konfigurowaniu odpowiedniego nagłówka dla każdego pliku S3. Czy nie ma globalnego ustawienia dla wszystkich plików z niestandardowym nagłówkiem http, którego mógłbym użyć?

Odpowiedz

13

Czy powinienem sobie z tym poradzić na poziomie CloudFront lub S3?

Obecnie nie ma globalnego ustawienia dodawania własnych nagłówków HTTP w Cloudfront lub w S3. Aby dodać nagłówki HTTP do obiektów, muszą one być ustawione w S3, oddzielnie dla każdego obiektu w wiadrze. Są one przechowywane w metadanych obiektu i można je znaleźć w sekcji Metadane dla każdego obiektu w konsoli AWS S3.

Zazwyczaj najłatwiej jest ustawić nagłówki podczas dodawania obiektu do zasobnika - dokładny mechanizm tego zależy od używanej aplikacji klienckiej lub sdk.

np. z AWS CLI polecenia użyć --cache-control option:

aws s3 cp test.txt s3://mybucket/test2.txt \ 
    --cache-control max-age=365000000,immutable 

Aby zmodyfikować istniejące obiekty, narzędzie s3cmd ma modify opcję jak opisano w tym SO odpowiedzieć: https://stackoverflow.com/a/22522942/6720449

Albo można użyć polecenia AWS S3 skopiuj obiekty na siebie, modyfikując metadane, jak wyjaśniono w tej odpowiedzi SO: https://stackoverflow.com/a/29280730/6720449. na przykład zastąpić metadane na wszystkich obiektach w wiadrze:

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \ 
    --cache-control max-age=365000000,immutable 

CloudFront CDN cache nigdy nie powinno się unieważnić

Jest to dość rygorystyczne wymaganie - nie można zapobiec cache CloudFront z historii zostaje unieważniony.Oznacza to, że nie ma ustawienia, które uniemożliwiłoby utworzenie unieważnienia Cloudfront, jeśli użytkownik tworzący ma wystarczające uprawnienia. Tak więc, w okrężny sposób, możesz zapobiec unieważnianiu, upewniając się, że żadni użytkownicy, role ani grupy nie mają uprawnień do tworzenia unieważnienia w dystrybucji przy użyciu uprawnienia IAM z cloudfront:CreateInvalidation - prawdopodobnie nie jest to możliwe.

Istnieje jednak kilka powodów, dla których Cloudfront może unieważnić pamięć podręczną z naruszeniem kontroli pamięci podręcznej backendu - np. jeśli ustawienie Maximum TTL jest ustawione i jest mniejsze niż maksymalny wiek.

+0

dzięki. Pójdę z poleceniem modyfikacji. Jeśli CloudFront czasami coś nie w porządku, to nie jest dobre, ale i tak nie jest to wielka sprawa. –

+0

Masz całkowitą rację, że * "Pamięć podręczna CDN CloudFront nigdy nie powinna zostać unieważniona" * jest bardzo rygorystyczna. W rzeczywistości nie jest to po prostu uzasadnione oczekiwanie. Nie ma jednej monolitycznej pamięci podręcznej - jest jedna na każdej krawędzi, a każda krawędź obsługująca żądanie obiektu pobiera ją początkowo od początku. Przedmioty mogą być również eksmitowane z dowolnej granicy ze względu na brak częstego dostępu ("popularność"). To pamięć podręczna ... z definicji zmienna, ale ogólnie bardzo spójna. Zobacz także [Dlaczego Cloudfront eksmituje obiekty z pamięci podręcznej w ciągu zaledwie kilku godzin?] (Http://stackoverflow.com/a/32878535/1695906) –