Немає кеша кеш-керування для файлів з AWS CloudFront з S3 Origin


27

Ми просто перейшли на Amazon AWS. Наразі у нас є екземпляр EC2, який працює добре. Він працює з Nginx спереду та Apache ззаду. Це теж добре працює. Усі сайти запускаються належним чином і включає в себе заголовок кеша-керування для файлів, які подаються з EC2.

Проблема полягає у ВСІХ статичних файлах, які ми розмістили в Amazon S3 , до яких можна отримати доступ через CloudFront CDN . Ми можемо отримати доступ до файлів добре (і проблем із CORS немає), але, очевидно, CloudFront не обслуговує файли з заголовком кеша-керування. Ми хочемо використовувати кешування браузера.

Як я це бачу, екземпляр EC2 тут не грає ролі, оскільки статичні файли подаються безпосередньо S3 + CloudFront, запит не надходить на веб-сервер в EC2.

Я в цілковитій програші.

Питання: 1) Як встановити кеш-контроль у цьому випадку? 2) Чи можливо встановити кеш-контроль? З S3 чи CloudFront?

Примітка. Я потрапив на кілька сторінок у Google, де ви можете встановити заголовка в S3 для окремих об’єктів. Це дійсно не продуктивний спосіб зробити це спеціально, оскільки в моєму випадку ми говоримо про декілька об'єктів.

Спасибі!


Будь ласка, опублікуйте URL-адресу для об’єкта в S3 та відповідну URL-адресу CloudFront. Я хотів би побачити поведінку, яку ви описуєте себе. По черзі розміщуйте CURL для обох, показуючи заголовки.
Тім

Мені вдалося додати спеціальний заголовок "Термін дії: недіє, 15 жовтня 2027, 13:46:07 GMT", відредагувавши походження в console.aws.amazon.com/cloudfront/home . Однак, схоже, це не працює. Як ти це зробив нарешті?
Маноло

Відповіді:


31

Я потрапив на кілька сторінок у Google, де ви можете встановити заголовка в S3 для окремих об’єктів. Це дійсно не продуктивний спосіб зробити це спеціально, оскільки в моєму випадку ми говоримо про декілька об'єктів.

Ну, "продуктивний" чи ні, саме так він і насправді покликаний працювати.

CloudFront не додає Cache-Control: заголовків.

CloudFront проходить наскрізний (а також відносини, якщо іншої не налаштоване) в Cache-Control:заголовках , що надається сервер походження, який в даному випадку є S3.

Щоб отримати Cache-Control:заголовки, надані S3 під час отримання об’єкта, вони повинні бути надані, коли об’єкт завантажений у S3, або доданий до метаданих об'єкта шляхом подальшої операції put + copy, яку можна використовувати для внутрішньої копіювання об'єкта в себе в S3, змінюючи метадані в процесі. Це те, що робить консоль поза кадром, якщо ви редагуєте метадані об’єкта.

Також у випадку, якщо вам цікаво, у S3 немає глобальної настройки, щоб змусити всі об’єкти у відрі повертати ці заголовки - це атрибут per-object.


Оновлення: Lambda @ Edge - це нова функція в CloudFront, яка дозволяє запускати тригери проти запитів та / або відповідей, між переглядачем і кешем та / або кешем та початком, запущеним кодом, записаним у Node.js, проти простої структури запиту / відповіді піддаються CloudFront.

Одне з головних застосувань для цієї функції - це маніпулювання заголовками ... тому поки вищевикладене все ще точно - CloudFront сам не додає Cache-Control- тепер функція Lambda може додавати їх до відповіді, що повертається з CloudFront.

Цей приклад додається, Cache-Control: public, max-age=86400лише якщо у відповіді вже немає Cache-Controlзаголовка.

Використання цього коду в тригері відповіді про вихід може призвести до того, що він запускається кожного разу, коли CloudFront отримує об'єкт із джерела, та змінює відповідь, перш ніж CloudFront кешуватиме його.

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

Оновлення (2018-06-20): Нещодавно я подав запит функції в команді CloudFront дозволити конфігурацію статичного походження відгуку заголовків як атрибути походження, подібно до того, як статичні запиту заголовки можуть бути додані, тепер ... але з скручувати, дозволяючи конфігурувати кожен заголовок умовно (лише якщо джерело не вказало цей заголовок у відповіді) або безумовно (додавання заголовка та перезапис заголовка з тодішнього джерела, якщо воно є).

Що стосується запитів на функції, ви, як правило, не отримуєте ніякого підтвердження того, чи дійсно вони розглядають можливість впровадження нової функції ... або навіть, можливо, вони вже працювали над нею ... це просто оголошується, коли вони будуть виконані. Отже, я не маю уявлення, чи вони будуть реалізовані. Слід аргументувати, що оскільки ця можливість вже доступна через Lambda @ Edge, в її базовій функціональності немає необхідності ... але мій зустрічний аргумент полягає в тому, що база функціонально не є повноцінною без можливості виконайте просту маніпуляцію із заголовком статичної відповіді, і якщо це єдина причина, коли потрібен тригер, то вимагати тригерів Lambda - це непотрібна вартість, фінансово та з додатковою затримкою (навіть якщо це не обов'язково є чудовими витратами).


Це все ще дратує.
Еріка Кейн


1
Тада, справді, @Kunal. Це приклад того, що я згадував у відповіді як "доданий до метаданих об'єкта шляхом подальшої операції put + copy". Використовуйте це з обережністю і тестуйте, бо є застереження. Він скине всі ваші позначки дат і може мати наслідки для шифрування. Він також може змінити етапи об'єкта з багаточастинного на формат однієї частини, що є різним алгоритмом, і заплутає будь-яку систему, яка зберігала етаги в іншому місці для подальшої перевірки цілісності. Якщо в коді включена версія, вартість вашої пам’яті подвоюється, якщо ви не очистите старі версії.
Майкл - sqlbot

1
Новий сервіс Lambda @ Edge тепер також пропонує механізм, який дозволяє додавати заголовки відповідей Cache-Control (серед інших) на ходу. Я оновив відповідь робочим прикладом того, як це можна зробити.
Michael - sqlbot

1
@Broshi в "політиці довіри" ролі потрібно перераховувати як послуги лямбда, так і крайові лямбда. Погляньте на docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.