как добавить управление кешем в AWS S3?

Я переместил 20000 файлов на AWS S3 с помощью команды s3cmd. Теперь я хочу добавить кеш-контроль для всех изображений (.jpg).

Эти файлы находятся в (s3: // bucket-name / images /). Как я могу добавить кеш-контроль для всех изображений с помощью s3cmd или есть другой способ добавить заголовок?

Спасибо


person Rajaraman    schedule 19.03.2014    source источник


Ответы (10)


Попробуйте текущую главную ветку восходящего потока (https://github.com/s3tools/s3cmd), так как она теперь есть команда modify, используемая следующим образом:

./s3cmd --recursive modify --add-header="Cache-Control:max-age=86400" s3://yourbucket/
person user3440362    schedule 20.03.2014
comment
Привет, спасибо за ответ, я попробовал это и получаю сообщение об ошибке, например ERROR: Invalid command: u'modify ' - person Rajaraman; 20.03.2014
comment
@Rajaraman, ты что-нибудь об этом знаешь ?? после этого шага показывается, что доступ запрещен - person shajin; 18.09.2014
comment
Это работает ... проверено с s3cmd версии 1.5.0-rc1 НО !: это изменяет заголовок Content-type объекта на двоичный / октетный поток! Протестировано с одним файлом PNG. - person Hardy; 16.10.2014
comment
У меня возникла та же проблема, что и у @Hardy. Это также сделало все мои файлы доступными для чтения. Осторожно. - person Andrew B.; 30.11.2014
comment
@shajin, у меня была аналогичная ошибка при использовании синхронизации, и она сработала после того, как я зашел в исходный каталог и использовал ./ вместо указания пути к каталогу. - person Rene Wooller; 15.12.2015
comment
Есть новости по этому поводу? @AndrewBadr - person anothercoder; 26.01.2016
comment
Похоже, что Content-Type ошибка была исправлена ​​с помощью # 406. - person josh3736; 09.03.2016
comment
Работает хорошо, просто убедитесь, что вы действительно клонируете из github, в моем случае apt-get не сработало - person Beowulfenator; 02.08.2016
comment
Хорошо работал с объектами '* .jpeg'. Что интересно, заголовок не применялся к css, js или svgs. s3cmd версии 2.0.1 - person bbeecher; 15.05.2019
comment
Применимы ли эти изменения к будущим загрузкам? например, когда вы загружаете файл через s3 API или просто вручную в веб-консоли, чтобы сохранить Cache-Control, установленный в папке / ведре - person Andrei F; 07.10.2020

Также с собственным клиентом AWS:

aws s3 sync /path s3://yourbucket/ --cache-control max-age=604800
person user31208    schedule 13.09.2014
comment
Это работает, если вы загружаете в AWS с локального пути на своем компьютере и хотите, чтобы все сохраняло надлежащий контроль кеширования. - person youanden; 23.09.2014
comment
Это работает для установки заголовков кеша во время начальной синхронизации, но не обновляет существующие файлы. Вы можете принудительно обновить так find . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800 - person Matt Byrne; 24.09.2014
comment
OP просит обновить существующие файлы в S3, а не загружать новые файлы - person Beowulfenator; 02.08.2016
comment
--recursive все еще нужен? Документация CLI, похоже, не приводит это в качестве аргумента. docs.aws.amazon.com/cli/latest/reference/ s3 / sync.html - person Corey McMahon; 05.05.2017
comment
@MattByrne Параметр --recursive необходимо опустить с версии 1.7.12 github .com / aws / aws-cli / blob / develop / CHANGELOG.rst # 1712. - person Bernhardt Scherer; 22.08.2017
comment
@boernard - отметил, и спасибо, что указали на это, чтобы держать ответ в актуальном состоянии для других, смотрящих на это. Мой ответ был актуальным, когда я сделал это в 2014 году, а эта версия была от февраля 2015 года ;-) - person Matt Byrne; 22.08.2017
comment
Использование touch '{}', как упомянуто выше, изменит дату модификации файла, что может быть нежелательным. Чтобы установить cache-control для существующих файлов, см. Ответ @ rodrigo-silveira ниже. - person Fabien Snauwaert; 30.08.2017
comment
Проблема с этим заключается в том, что вы, возможно, не захотите устанавливать управление кешем для всех файлов при синхронизации (например: при копировании статического веб-сайта на S3 вам, вероятно, понадобится длинный контроль кеша для imgs и CSS. файлы, но не html или другое содержимое, которое может часто меняться). - person Adam Parkin; 22.04.2018

В моем ведре есть файлы в форматах mp4, jpg и другие. Файлы, которые я хотел обновить, хранятся во «вспомогательной корзине» (например, https://s3.amazonaws.com/my.bucket/sub-directory/my-video.mp4). В моем случае я хотел обновить только управление кешем для файлов mp4:

aws s3 cp \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive

Чтобы проверить, что это будет делать, вы можете использовать флаг --dryrun:

aws s3 cp --dryrun \
   s3://my.bucket/sub-directory/ s3://my.bucket/sub-directory/ \
   --exclude '*.jpg' --exclude '*.png' \
   --cache-control 'max-age=31104000' \
   --recursive
person rodrigo-silveira    schedule 06.10.2016
comment
Я получаю эту ошибку: при вызове операции CopyObject: этот запрос копирования является незаконным, потому что он пытается скопировать объект себе без изменения метаданных объекта, класса хранения, местоположения перенаправления веб-сайта или атрибутов шифрования. - person Flimm; 24.11.2016
comment
Чтобы это исправить, пришлось добавить --metadata-directive REPLACE --acl public-read. - person Flimm; 24.11.2016
comment
Изначально я использовал директиву метаданных для выполнения этой работы, но это закончилось тем, что изменил тип содержимого объектов, а не просто добавил --acl public-read - person Matt Gaunt; 29.07.2020

Чтобы настроить метаданные, такие как управление кешем для объекта в S3, без необходимости его повторной загрузки и без использования каких-либо сторонних инструментов, вы можете сделать следующее с помощью интерфейса командной строки AWS. Он копирует объект в себя, заменяя метаданные выбранными вами настройками:

aws s3api copy-object --copy-source <bucket-name>/<file> --bucket <bucket-name> --key <file> --metadata-directive REPLACE --cache-control "max-age=3600"

Обработайте эту команду в find, чтобы сделать это с существующим набором файлов, который уже существует в корзине, как вы упомянули:

find . -type f -exec aws s3api copy-object --copy-source <bucket-name>/{} --bucket <bucket-name> --key {} --metadata-directive REPLACE --cache-control "max-age=3600"

замените <bucket-name> названием вашего ведра

ПРЕДУПРЕЖДЕНИЕ: это перезапишет все ваши существующие метаданные в файлах, таких как acl, просто добавьте в команду дополнительные флаги, чтобы установить то, что вам нужно, например, --acl public-read, чтобы предоставить полный общедоступный доступ. (спасибо @jackson)

person Joel Duckworth    schedule 02.06.2016
comment
Это установило мои заголовки кеша, хотя и удалило публичные разрешения, которые я установил для файлов (делая их недоступными для просмотра на моем сайте, размещенном на s3). Чтобы файлы оставались общедоступными, мне пришлось запустить команду с --acl public-read. - person Jackson; 20.10.2016

Если вы хотите избежать использования сторонних инструментов, а это разовая задача, вы можете использовать консоль AWS.

  1. Перейдите к своему ведру s3
  2. Выберите все объекты, которые хотите изменить
  3. Нажмите Действия -> Изменить метаданные.
  4. Выберите Cache-Control для ключа, введите любой элемент управления, который хотите, в качестве значения
  5. Сохранять
person mattdedek    schedule 19.08.2019
comment
Как вы можете внести эти изменения для будущих загрузок? например, когда вы загружаете файл через s3 API или просто вручную в веб-консоли, чтобы сохранить Cache-Control, установленный в папке / ведре - person Andrei F; 07.10.2020

PUT / ObjectName HTTP/1.1 
Host: BucketName .s3.amazonaws.com 
Date: date 
x-amz-meta-Cache-Control : max-age= <value in seconds> 
Authorization: signatureValue 

Каждый параметр метаданных содержит пару "ключ-значение". Ключ метаданных управления кешем - «Cache-Control», а значение - “max-age=<time for which you want your object to be accessed from cache in seconds>”.

Вы можете установить настраиваемый заголовок управления кешем для объектов Amazon S3, отправив HTTP-запрос PUT на сервер Amazon S3 с соответствующими заголовками двумя способами:

Задайте метаданные управления кешем с помощью Amazon S3 REST API PUT Object Request. Если вы программист, вы можете написать свою собственную программу для использования Amazon S3 REST или SOAP API для установки пользовательских заголовков с помощью PUT Object Request. Этот веб-сайт относится только к API-интерфейсам REST Amazon S3. Подробные сведения об использовании API-интерфейсов SOAP см. На веб-сайте документации AWS. Установите метаданные управления кешем с помощью пользовательского интерфейса Bucket Explorer. Если вам нравится настраивать пользовательские HTTP-заголовки, такие как Cache Control, с помощью щелчков мыши вместо написания программы, вы можете использовать для этого пользовательский интерфейс Bucket Explorer. С помощью этого настраиваемого заголовка HTTP вы можете указать поведение кэширования, которому должна следовать цепочка запросов / ответов, и предотвратить вмешательство кешей в запрос или ответ.

для получения дополнительной информации проверьте Как установить заголовок управления кешем для объекта Amazon S3?`

person Laxmikant Ratnaparkhi    schedule 19.03.2014

(Поскольку OP попросил другой способ)

Вы также можете сделать это через aws-cli, например. (v: aws-cli/1.8.8 Python/2.7.2 Darwin/12.5.0):

aws s3api put-object \
--bucket mybucket \
--key my/key \
--cache-control max-age=1 \
--body myfile.txt

Хотя учтите, что вы перепишете любой существующий объект.

person Jose Alban    schedule 22.10.2015

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

aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
person Yoda    schedule 19.03.2021

Просто обновите s3cmd до версии 1.5.1, и проблема исчезнет.

person Monika Bhadauria    schedule 14.05.2015

Еще один очень простой способ сделать это - использовать браузер S3: http://s3browser.com/ Вы можете просто щелкните с зажатой клавишей Shift или ctrl + a, чтобы выбрать все нужные изображения; затем просто перейдите на вкладку «Заголовки HTTP» и нажмите «Добавить новый заголовок», а затем «Применить изменения». Он автоматически сохранил все мои другие разрешения и заголовки.

Если вы много используете S3; В любом случае это прекрасное приложение, особенно если у вас огромные загрузки (нет ничего лучше в мире ftp, dropbox или других!)

person Reece    schedule 25.09.2017
comment
почему отрицательные голоса? OP сказал s3cmd или есть какой-нибудь другой способ добавить заголовок. s3browser отлично подходит для массового редактирования заголовков; намного лучше, чем веб-интерфейс консоли AWS. - person Reece; 23.03.2019
comment
Я не голосовал против вас, но это плохая идея, потому что ее невозможно поддерживать. Вы должны делать это вручную каждый раз, когда кто-то добавляет новый файл (или пытается научить их делать это). Лучшим решением было бы запустить этот скрипт для загрузки ваших файлов, и он всегда работает правильно. Нет необходимости в ручном вмешательстве и следующих шагах. - person Ryan Shillington; 15.05.2019
comment
Почему люди стараются использовать ftp-клиенты gui (s), такие как filezilla или cyberduck, когда есть команда linux sftp? Тоже плохая идея? Теоретически вы можете создать сценарий практически для любого программного решения, которое есть в существующем решении с графическим интерфейсом. Я хотел бы думать, что то, что квалифицирует его как хорошую или плохую идею, - это контекст использования. Я считаю браузер s3 полезным инструментом, не думаю, что это помешает представить его в качестве опции. - person Reece; 16.05.2019