як додати керування кешем в AWS S3?


76

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

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

Дякую

Відповіді:


83

Будь ласка, спробуйте поточну головну гілку ( https://github.com/s3tools/s3cmd ), оскільки тепер у неї є modifyкоманда, яка використовується наступним чином:

./s3cmd --recursive modify --add-header="Cache-Control:max-age=86400" s3://yourbucket/

5
Привіт, дякую за відповідь, я спробував це, і я отримую повідомлення про помилку, наприклад ПОМИЛКА: Недійсна команда: u'modify '
Раджараман,

@Rajaraman ти щось про це знаєш ?? після цього кроку в показі відмовлено в доступі
shajin

2
Це працює .. перевірено на s3cmd версії 1.5.0-rc1 АЛЕ!: Це змінює заголовок типу Content на "binary / octet-stream"! Перевірено одним PNG-файлом.
Харді

1
Я відчував ту ж проблему, що і @Hardy. Це також видалило доступність для читання з усіх моїх файлів. Стережись.
Ендрю Б.

1
Здається, Content-Typeпомилку виправлено # 406 .
josh3736

62

Також із власним клієнтом AWS:

aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800

2
Це працює, якщо ви завантажуєте в AWS з локального шляху на вашому комп’ютері і хочете, щоб все зберігало належний кеш-контроль
youanden

24
Це працює для встановлення заголовків кешу під час початкової синхронізації, але не оновлює існуючі файли. Ви можете змусити оновити такfind . -type f -exec touch '{}' \;; aws s3 sync /path s3://yourbucket/ --recursive --cache-control max-age=604800
Matt Byrne

3
ОП просить оновити існуючі файли в S3, а не завантажувати нові файли
Beowulfenator

2
Чи --recursiveвсе ще потрібно? Здається, документація CLI не вказує це як аргумент. docs.aws.amazon.com/cli/latest/reference/s3/sync.html
Корі

1
Використання, touch '{}'як зазначено вище, змінить дату модифікації файлу, яка може бути небажаною. Щоб встановити cache-controlіснуючі файли, див. Відповідь @ rodrigo-silveira нижче.
Fabien Snauwaert

28

У моєму сегменті є файли 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

Я отримую таку помилку: "під час виклику операції CopyObject: Цей запит на копіювання є незаконним, оскільки він намагається скопіювати об'єкт на себе, не змінюючи метадані об'єкта, клас сховища, місце перенаправлення веб-сайту або атрибути шифрування."
Флімм

6
Щоб це виправити, довелося додати --metadata-directive REPLACE --acl public-read.
Флімм

Я спочатку використовував директиву метаданих, щоб зробити цю роботу, але це в кінцевому підсумку змінило тип вмісту об’єктів проти простого додавання--acl public-read
Метт Гонт

24

Щоб відрегулювати такі метадані, як кешування кешу на об’єкті в S3, не перезавантажуючи їх і не використовуючи сторонні інструменти, ви можете зробити наступне за допомогою AWS CLI. Він копіює об'єкт у себе, перекриваючи метадані за вибраними налаштуваннями:

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

Опрацюйте цю команду у пошуку, щоб зробити це на існуючому наборі файлів, який уже існує у сегменті, як ви вже згадуєте:

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)


7
Це встановило заголовки мого кешу, хоча і видалило "загальнодоступні" дозволи, які я встановив для файлів (роблячи їх невидимими на моєму сайті, розміщеному в s3). Щоб зробити файли загальнодоступними, мені довелося запустити команду за допомогою --acl public-read.
Джексон,

14

Якщо ви хочете уникати сторонніх інструментів, і це одноразове завдання, ви можете скористатися консоллю AWS.

  1. Перейдіть до свого відра s3
  2. Виберіть усі об’єкти, які потрібно змінити
  3. Клацніть Дії -> Змінити метадані
  4. Виберіть Кеш-контроль для клавіші, введіть будь-який елемент управління, який ви хочете, як значення
  5. Зберегти

Як ви можете внести ці зміни для майбутніх завантажень? наприклад, коли ви завантажуєте файл через API s3 або просто вручну на веб-консолі, щоб зберегти кеш-контроль у папці / сегменті
Андрій Ф

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

Кожне налаштування метаданих містить пару ключ-значення. Клавіша управління метаданими кеш-пам'яті - "Керування кешем", а значення -“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. Цей веб-сайт стосується лише API REST для Amazon S3. Будь ласка, зверніться до веб-сайту документації AWS, щоб отримати докладні відомості про те, як користуватися API SOAP. Встановіть метадані кешування кешування за допомогою інтерфейсу користувача Bucket Explorer - якщо ви хочете встановлювати власні заголовки HTTP, такі як кеш керування, за допомогою клацань миші замість написання програмного забезпечення, ви можете використовувати для цього інтерфейс користувача Bucket Explorer. За допомогою цього користувацького заголовка HTTP ви можете вказати поведінку кешування, якої слід дотримуватися в ланцюжку запитів / відповідей, а також запобігти втручанню кеш-пам’яті у запит чи відповідь.

для отримання додаткової інформації, будь ласка, перевірте Як встановити заголовок керування кешем для об’єкта Amazon S3? `


1

(Оскільки ОП просив про інший шлях)

Ви також можете зробити це 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

Хоча зауважте, що ви перепишете будь-який існуючий об’єкт.



0

Ще один простий спосіб зробити це - використовувати браузер S3: http://s3browser.com/ Ви можете просто натиснути клавішу Shift або Ctrl + A, щоб вибрати всі потрібні зображення; потім просто перейдіть на вкладку "Http заголовки" і натисніть - "Додати новий заголовок", а потім "Застосувати зміни". Він автоматично зберігав усі мої інші дозволи та заголовки.

Якщо ви багато використовуєте S3; це солодкий додаток у будь-якому випадку, особливо якщо у вас є величезні завантаження (немає нічого кращого у світі ftp, dropbox чи іншим чином!)


1
чому голоси проти? в інструкції з експлуатації сказано, що s3cmd або є інший спосіб додати заголовок s3browser чудово підходить для масового редагування заголовків; набагато кращий, ніж веб-інтерфейс консолі AWS.
Reece

1
Я не голосував проти вас, але це погана ідея, тому що це неможливо здійснити. Ви повинні робити це вручну кожного разу, коли хтось додає новий файл (або намагається навчити їх це робити). Кращим рішенням буде "запустити цей сценарій для завантаження файлів", і він завжди працює правильно. Немає необхідності проводити ручні втручання та наступні кроки.
Райан

2
чому люди заважають користуватися GUI (-ами) ftp-клієнтами, такими як filezilla або cyberduck, коли існує команда sftp для linux? Так само погана ідея? Теоретично ви можете написати майже будь-яке програмне рішення, яке є існуючим рішенням графічного інтерфейсу. Я хотів би думати, що те, що кваліфікує це як хорошу чи погану ідею, є контекстом використання. Я вважаю, що браузер s3 є корисним інструментом, не думаю, що боляче представляти його як варіант.
Reece
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.