Rekurencyjnie zmienia się typ zawartości plików danego rozszerzenia na Amazon S3


12

Mam duży segment S3 z zagnieżdżoną strukturą „folderów” zawierającą (między innymi) statyczne pliki .json i .md. Te pliki są obsługiwane przez S3, text/plaina nie poprawne application/jsoni text/markdown.

Zaktualizowałem ustawienia domyślne segmentu, aby nowe przesyłane pliki miały prawidłowy typ zawartości.

Jaki jest najlepszy sposób przejścia „drzewa” i zaktualizowania typu zawartości dla plików pasujących do określonego rozszerzenia?

Odpowiedzi:


25

Oto przykład, jak to zrobić za pomocą narzędzia aws cli. Narzędzie cp pozwala na korzystanie z opcji rekurencyjnych, czego nie sądzę, że może zrobić narzędzie s3api. W tym przypadku naprawiam kilka plików SVG. Usuń opcje --dryrun, gdy będziesz gotowy, aby ją uwolnić.

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/

Rozumiem podstawową koncepcję polecenia. Ale czy spowoduje to usunięcie wersji pliku, ponieważ jest to dyrektywa zastępująca? Mój segment jest skonfigurowany z wersjonowaniem, a każdy plik ma kilka wersji. Zastąpienie go spowoduje usunięcie wszystkich wersji i utworzenie nowego pliku, czy uwzględni wszystkie wersje podczas zastępowania?
Joze

To dobre pytanie. Zdecydowanie warte przetestowania w wysuwanym wiadrze. Mam nadzieję, że prośba o zastąpienie tylko metadanych nie
rozwali

Zrobiłem test i okazało się, że wersje pozostają, jednak wersja zmodyfikowana metadanych staje się najnowszą wersją, starsze wersje mają poprzednie metadane. Próbuję teraz znaleźć sposób na rekurencyjną modyfikację metadanych wszystkich wersji teraz, to znaczy bez robienia skomplikowanego skryptu, który wyświetli każdą wersję, a następnie zmodyfikuje jej metadane ...
Joze

To polecenie resetuje acl. Jeśli potrzebujesz innej niż domyślna wartości, dodaj--acl=...
Vasiliy Zverev

3

Jeśli nie chcesz, aby uzyskać brudne ręce przy użyciu boto / Python lub innego AWS API, podejrzewam, najlepiej byłoby skorzystać $ aws s3api copy-objectz --content-typeflagą skopiować obiekt do siebie, wyznaczając nowy typ zawartości.

Oto dokumentacja dla s3api.

Jest rzeczą oczywistą, że powinieneś najpierw to przetestować, zanim uruchomisz go rekurencyjnie na całym wiadrze.


1
Jeśli chodzi o testowanie, użyj flagi „testowania na sucho” w Amazon CLI.
bart

3

Po pewnym kopaniu odkryłem, że s3cmdnarzędzie to potrafi. Na przykład, aby ustawić pliki JSON na application / json:

s3cmd --recursive modify --acl-public \
       --add-header='content-type':'application/json' \
       --exclude '' --include '.json' \
       s3://bucket/

3

Jak wspomniano wcześniej, możesz użyć awsnarzędzia Amazon i użyć s3api, aby skopiować obiekt na siebie i użyć metadata-directive=REPLACEdo zmiany typu zawartości.

Kładę to tutaj, ponieważ czasami chciałbyś iterować nazwy plików przechowywane w bazie danych, i tak możesz to zrobić za pomocą cli.

aws s3api copy-object \
          --content-type="application/vnd.android.package-archive" \
          --metadata-directive="REPLACE" \
          --copy-source "MYBUCKET/FILE.apk" \
          --bucket "MYBUCKET" \
          --key "FILE.apk" \
          --acl public-read

Zastępuje tylko jeden plik. Jak wykonać to polecenie dla wszystkich plików typu .apk?
bart

@bart zobacz moją odpowiedź na rekursywny sposób.
t1m0,
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.