Рекурсивно змінюється тип вмісту для файлів заданого розширення на Amazon S3


12

У мене є велике відро S3 з вкладеною структурою "папки", що містить (серед іншого) статичні файли .json та .md. Файли тез обслуговуються S3 як text/plainшвидше, ніж правильні application/jsonта text/markdown.

Я оновив налаштування за замовчуванням, щоб нові завантаження мали правильний тип вмісту.

Який найкращий спосіб пройти по "дереву" та оновити тип вмісту для файлів, що відповідають певному розширенню?

Відповіді:


25

Ось приклад, як це зробити за допомогою інструменту aws cli. Інструмент cp дозволяє використовувати рекурсивні параметри, що, на мою думку, не може зробити інструмент s3api. У цьому випадку я виправляю купу SVG-файлів. Видаліть параметри --dryrun, коли ви будете готові його розблокувати.

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

Я розумію основну концепцію команди. Але чи видалить це версії файлу, оскільки це директива про заміну? У моєму відрі налаштовано версію, і кожен файл має кілька версій. Замінивши його, вилучите всі версії та створите новий файл, чи він врахує всі версії під час заміни?
Жозе

Це гарне запитання. Однозначно варто тестувати у викидальному відрі. Я сподіваюсь, що запит на заміну лише метаданих не підірве версії, але ...
t1m0

Я зробив тест, і виявляється, що версії залишаються, проте модифікована версія метаданих стає останньою версією, старіші версії мають попередні метадані. Я намагаюся знайти спосіб рекурсивно модифікувати метадані всіх версій зараз, тобто без створення складного сценарію, який буде перераховувати кожну версію, а потім змінювати її метадані ...
Joze

Ця команда скидає acl. Якщо вам потрібне значення за замовчуванням, додайте--acl=...
Василь Зверев

3

Якщо ви не хочете бруднити руки , використовуючи Boto / пітона чи інший AWS API, я підозрюю , що вам краще всього було б використовувати $ aws s3api copy-objectз --content-typeпрапором , щоб скопіювати об'єкт сам по собі, встановивши новий тип контенту.

Ось документація на s3api.

Само собою зрозуміло, що ви повинні перевірити це спочатку, перш ніж запускати рекурсивно на весь відро.


1
Щодо тестування, використовуйте прапор "сухого пробігу" в Amazon CLI.
барт

3

Після деякого копання я виявив, що s3cmdінструмент може це зробити. Наприклад, для встановлення файлів JSON для application / json:

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

3

Як згадувалося раніше, ви можете використовувати awsінструмент Amazon і використовувати s3api для копіювання об'єкта на себе, а також використовувати metadata-directive=REPLACEдля зміни типу вмісту.

Я вкладаю це сюди, тому що іноді ви хочете повторити імена файлів, які зберігаються в базі даних, і ось як це можна зробити через 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

Це замінює лише один файл. Як виконати цю команду проти всіх файлів типу .apk?
барт

@bart дивіться мою відповідь рекурсивно.
t1m0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.