Ustaw automatycznie kontrolę pamięci podręcznej dla całego zasobnika S3 (używając zasad zasobnika?)

124

Muszę ustawić nagłówki kontroli pamięci podręcznej dla całego segmentu s3, zarówno istniejących, jak i przyszłych plików i miałem nadzieję, że zrobię to w ramach zasad zasobnika. Wiem, że mogę edytować istniejące i wiem, jak je określić, jeśli sam je prześlę, ale niestety aplikacja, która je przesyła, nie może ustawić nagłówków, ponieważ używa s3fs do kopiowania tam plików.

thattommyhall
źródło

Odpowiedzi:

208

Teraz można to zrobić na 3 sposoby: za pośrednictwem konsoli AWS , wiersza poleceń lub narzędzia wiersza poleceń s3cmd .


Instrukcje konsoli AWS

To jest teraz zalecane rozwiązanie. Jest to proste, ale może zająć trochę czasu.

  • Zaloguj się do konsoli zarządzania AWS
  • Przejdź do wiadra S3
  • Wybierz wszystkie pliki według trasy
  • Z menu wybierz „Więcej”
  • Wybierz „Zmień metadane”
  • W polu „Klucz” wybierz „Cache-Control” z menu rozwijanego max-age = 604800Enter (7 days) for Value
  • Naciśnij przycisk „Zapisz”

( dzięki @biplob - poniżej okaż mu trochę miłości )


Rozwiązanie wiersza poleceń AWS

Pierwotnie, kiedy tworzyłem te zasady dotyczące wiadra, nie było wyjścia, więc pomyślałem, jak to zrobić za pomocą aws-cli i jest całkiem sprytny. Podczas badań nie mogłem znaleźć żadnych przykładów na wolności, więc pomyślałem, że opublikuję kilka moich rozwiązań, aby pomóc potrzebującym.

UWAGA: Domyślnie aws-cli kopiuje tylko bieżące metadane pliku, NAWET JEŚLI OKREŚLISZ NOWE METADANE.

Aby użyć metadanych określonych w wierszu poleceń, należy dodać flagę „--metadata-Directive REPLACE”. Oto kilka przykładów.

Dla jednego pliku

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Dla całego zasobnika (uwaga - flaga rekurencyjna):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Trochę gotcha, które znalazłem, jeśli chcesz zastosować go tylko do określonego typu pliku, musisz wykluczyć wszystkie pliki, a następnie dołączyć te, które chcesz.

Tylko jpg i png:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Oto kilka linków do instrukcji, jeśli potrzebujesz więcej informacji:

Znane problemy:

"Unknown options: --metadata-directive, REPLACE"

może to być spowodowane nieaktualnym awscli - zobacz odpowiedź @ eliotRosewater poniżej


Narzędzie S3cmd

S3cmd to „narzędzie wiersza poleceń do zarządzania usługami Amazon S3 i CloudFront”. Chociaż to rozwiązanie wymaga git pull, może być prostszym i bardziej wszechstronnym rozwiązaniem.

Aby uzyskać pełne instrukcje, zobacz post @ ashishyadaveee11 poniżej


Mam nadzieję, że to pomoże!

Dan Williams
źródło
6
Dzięki za rzeczywiste przykłady tego, co robić. Miałem problem z odkryciem tego, co było nawet możliwe po prostu czytając dokumenty.
danneu
2
Otrzymuję komunikat „Nieznane opcje: --metadata-dyrektywa, WYMIANA”, gdy uruchamiam którekolwiek z powyższych poleceń. Proszę o pomoc.
user3722785
1
Uwaga, TERAZ JEST ŁATWIEJSZY SPOSÓB. Możesz teraz zmienić metadane dla WSZYSTKICH plików w zasobniku za pośrednictwem konsoli AWS. Zobacz odpowiedź CoderBoy poniżej: stackoverflow.com/a/47072736/2538952
Martin Tschammer
1
Zauważ, że użycie --meta-Directive REPLACE spowoduje nadpisanie wszelkich poprzednich metadanych, które nie zostały skopiowane w poleceniu! Na przykład „content-encoding gzip” zostanie usunięty, jeśli nie zostanie jawnie dodany do polecenia cp.
Harmen Janssen
1
Czy cppobieranie i ponowne przesyłanie wszystkiego?
mlissner
37

Teraz można go łatwo zmienić z konsoli AWS.

  • Zaloguj się do konsoli zarządzania AWS
  • Przejdź do wiadra S3
  • Wybierz wszystkie pliki według trasy
  • Z menu wybierz „Więcej”
  • Wybierz „Zmień metadane”
  • W polu „Klucz” wybierz z menu rozwijanego opcję „Kontrola pamięci podręcznej”
  • max-age = 604800 Wprowadź (7 dni) dla wartości
  • Naciśnij przycisk „Zapisz”

Wykonanie zajmuje trochę czasu, w zależności od plików zasobnika. Ponów od początku, jeśli przypadkowo zamkniesz przeglądarkę.

biplob
źródło
6
Co oznacza „wybierz wszystkie pliki według trasy”?
Tamzin Blake
1
Wybierz wszystkie / niektóre pliki z katalogu, który chcesz ustawić meta
biplob
Przepraszam za spóźnioną odpowiedź. Nie, to nieprawda. Powinieneś to ustawić w swojej aplikacji.
biplob
Czy to zastępuje poprzednie metadane, czy też je uzupełnia? (Nie chcę stracić wszystkich typów treści!)
Chris,
Właśnie potwierdziłem, że NIE usuwa istniejących wartości. Ustawia tylko klucze określone przez Ciebie (nadpisanie klucza, jeśli istnieje)
rynop
21

kroki

  1. git clone https://github.com/s3tools/s3cmd
  2. Uruchom s3cmd --configure (zostaniesz poproszony o dwa klucze - skopiuj i wklej je z wiadomości e-mail z potwierdzeniem lub ze strony konta Amazon. Zachowaj ostrożność podczas ich kopiowania! Wielkość liter jest rozróżniana i musi być wprowadzona dokładnie, w przeciwnym razie będziesz otrzymywać błędy dotyczące nieprawidłowego podpisy itp. Pamiętaj, aby dodać s3:ListAllMyBucketsuprawnienia do kluczy, w przeciwnym razie AccessDeniedpodczas testowania dostępu wystąpi błąd).
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
ashishyadaveee11
źródło
Super odpowiedź. Dziękuję Ci! Czy istnieje sposób, aby zaktualizować TYLKO te, które nie mają jeszcze tego ustawienia nagłówka?
PKHunter,
Czy ktoś ma podobne rozwiązanie do użytku z S3Express w oknie?
Joe
12

Gdyby moja reputacja wynosiła> 50, skomentowałbym tylko. Ale to nie jest (jeszcze), więc oto kolejna pełna odpowiedź.


Od jakiegoś czasu walę głową w ten problem. Dopóki nie znalazłem i nie przeczytałem dokumentacji. Udostępnianie tego tutaj na wypadek, gdyby pomogło to komukolwiek innemu:

To polecenie okazało się dla mnie niezawodne. Wybrałem 1-sekundowy czas wygaśnięcia na testowanie w celu zweryfikowania oczekiwanych wyników:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEjest wymagany, " cp" modyfikując metadane w istniejącym pliku w S3
  • max-age ustawia wiek pamięci podręcznej przeglądarki w sekundach
  • s-maxage ustawia buforowanie CloudFront w kilka sekund

Podobnie, jeśli ustawisz te wartości nagłówka Cache-Control w pliku podczas przesyłania do S3, polecenie będzie wyglądać następująco:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file
roens
źródło
8

Nie sądzę, aby można było to określić na poziomie zasobnika, ale istnieje kilka obejść.

  1. Skopiuj obiekt do siebie na S3, ustawiając odpowiednie cache-controlnagłówki dla operacji kopiowania.

  2. Określ nagłówki odpowiedzi w adresie URL do plików . Aby to zadziałało, musisz użyć wstępnie podpisanych adresów URL, ale możesz określić określone nagłówki odpowiedzi w kwerendzie, w tym cache-controli expires. Pełną listę dostępnych opcji można znaleźć pod adresem : http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Geoff Appleford
źródło
Dzięki Geoff, wiedziałem o (1), ale nie (2). Nie to, na co liczyłem (choć obawiam się, że to niemożliwe)
Tommyhall
Czy masz przykładowe polecenie interfejsu wiersza polecenia AWS dotyczące sposobu wykonania # 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm
3

Zawsze możesz skonfigurować lambdę z wyzwalaczem na PUTOBJECT na S3, lambda po prostu zmieni nagłówek tego konkretnego obiektu, który właśnie został wstawiony.

Następnie możesz po raz ostatni uruchomić wspomniane powyżej polecenie kopiowania, a wszystkie nowe obiekty zostaną naprawione przez lambdę.

AKTUALIZACJA:

Oto dobre miejsce do rozpoczęcia: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /

Ibrahim Bou Ncoula
źródło
Czy możesz podać więcej szczegółów, jak zrobić tę lambę? Brzmi jak świetne rozwiązanie.
Wouter
1
@Wouter Jasne, znalazłem dla Ciebie link, który może pomóc Ci łatwo się tam dostać, aaronfagan.ca/blog/2017/… Jeśli potrzebujesz pomocy lub wsparcia, chętnie pomogę.
Ibrahim Bou Ncoula
Wiem, że to jest stare, ale uznałem, że ten zasób jest przydatny w przypadku tego, czego szukałem. Dziękuję Ci za to. głosy za ciebie mój koleś!
castaway2000
1

Do tych, którzy próbują użyć odpowiedzi Dana i otrzymują błąd:

„Nieznane opcje: --metadata-dyrektywa, WYMIANA”

Natknąłem się na problem, a problem polegał na tym, że zainstalowałem awscli przy użyciu

sudo apt-get install awscli

To zainstalowało starą wersję awscli, w której brakuje polecenia --metadata-dyrektywy. Więc użyłem sudo apt-get remove awscli, aby go usunąć.

Następnie ponownie zainstalowano zgodnie z procedurą z amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

Jedyną różnicą jest to, że musiałem użyć sudo -H ze względu na problemy z uprawnieniami, na które mogą również napotkać inni.

eliotRosewater
źródło