Рекурсивное изменение типа контента для файлов с заданным расширением в 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
Это хороший вопрос. Определенно стоит попробовать в одноразовом ведре. Я надеюсь, что запрос на замену только метаданных не
сместит
Я провел тест, и оказалось, что версии остаются, однако модифицированная метаданными версия становится последней версией, более старые версии имеют предыдущие метаданные. Сейчас я пытаюсь найти способ рекурсивного изменения метаданных всех версий, то есть без создания сложного сценария, который будет перечислять каждую версию и затем изменять ее метаданные ...
Joze
Эта команда сбрасывает acl. Если вам нужно значение не по умолчанию, добавьте--acl=...
Василий Зверев
3

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

Вот документация для s3api.

Само собой разумеется, что вы должны сначала проверить это, прежде чем запускать его рекурсивно на всем вашем ведре.

EEAA
источник
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
gilm
источник
Это заменяет только один файл. Как выполнить эту команду для всех файлов типа .apk?
Барт
@bart см. мой ответ для рекурсивного пути.
t1m0