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.

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!


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ę.


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/

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

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


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 /


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.