Назад | Перейти на главную страницу

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

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

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

Как лучше всего пройти по «дереву» и обновить тип содержимого для файлов, соответствующих определенному расширению?

Вот пример того, как это сделать с помощью инструмента 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/

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

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

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

Покопавшись, я обнаружил, что s3cmd инструмент может это сделать. Например, чтобы установить файлы JSON в application / json:

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

Как упоминалось ранее, вы можете использовать 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