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

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

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

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

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

решение1

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

решение2

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

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

решение3

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

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

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

решение4

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

Связанный контент