Nessuna intestazione Cache-Control per file da AWS CloudFront con S3 Origin


27

Siamo appena passati ad Amazon AWS. Al momento abbiamo un'istanza EC2 che funziona bene. Esegue Nginx davanti e Apache nel back-end. Funziona bene anche. Tutti i siti vengono avviati correttamente e include l'intestazione Cache-Control per i file forniti da EC2.

Il problema è con TUTTI i file statici che abbiamo inserito in Amazon S3 a cui si accede tramite CloudFront CDN . Possiamo accedere bene ai file (e nessun problema con CORS), ma a quanto pare CloudFront non serve i file con l'intestazione Cache-Control. Vogliamo sfruttare la memorizzazione nella cache del browser.

Per come la vedo io, l'istanza EC2 non svolge un ruolo qui poiché i file statici vengono serviti direttamente da S3 + CloudFront, la richiesta non va al Web Server in EC2.

Sono completamente perso.

Domanda: 1) Come posso impostare Cache-Control in questo caso? 2) È possibile impostare il Cache-Control? Da S3 o CloudFront?

Nota: ho toccato alcune pagine di Google in cui è possibile impostare l'intestazione in S3 per singoli oggetti. Questo non è davvero un modo produttivo per farlo specialmente perché nel mio caso stiamo parlando di diversi oggetti.

Grazie!


Inserisci un URL per un oggetto in S3 e l'URL CloudFront applicabile. Mi piacerebbe vedere il comportamento che mi descrivi. In alternativa, pubblicare CURL per entrambi, mostrando le intestazioni.
Tim

Sono stato in grado di aggiungere un'intestazione personalizzata "Scadenza: dom, 15 ott 2027 13:46:07 GMT" modificando l'origine in console.aws.amazon.com/cloudfront/home . Tuttavia non sembra funzionare. Come hai fatto finalmente?
Manolo,

Risposte:


31

Ho toccato alcune pagine di Google in cui è possibile impostare l'intestazione in S3 per singoli oggetti. Questo non è davvero un modo produttivo per farlo specialmente perché nel mio caso stiamo parlando di diversi oggetti.

Bene, "produttivo" o no, è così che effettivamente è progettato per funzionare.

CloudFront non aggiunge le Cache-Control: intestazioni.

CloudFront passa attraverso (e rispetta anche, se non diversamente configurato) le Cache-Control:intestazioni fornite dal server di origine, che in questo caso è S3.

Per ottenere le Cache-Control:intestazioni fornite da S3 quando un oggetto viene recuperato, devono essere fornite quando l'oggetto viene caricato in S3 o aggiunte ai metadati dell'oggetto mediante una successiva operazione put + copia, che può essere utilizzata per copiare internamente un oggetto in se stesso in S3, modificando i metadati nel processo. Questo è ciò che fa la console, dietro le quinte, se si modificano i metadati degli oggetti.

Inoltre, nel caso in cui non ti stia chiedendo, non esiste alcuna impostazione globale in S3 per forzare tutti gli oggetti in un bucket a restituire queste intestazioni: è un attributo per oggetto.


Aggiornamento: Lambda @ Edge è una nuova funzionalità di CloudFront che consente di attivare trigger contro richieste e / o risposte, tra visualizzatore e cache e / o cache e origine, eseguendo codice scritto in Node.js su una semplice struttura di oggetti richiesta / risposta esposto da CloudFront.

Una delle principali applicazioni di questa funzione è la manipolazione delle intestazioni ... quindi, sebbene quanto sopra sia ancora accurato - CloudFront stesso non aggiunge Cache-Control- è ora possibile per una funzione Lambda aggiungerle alla risposta che viene restituita da CloudFront.

Questo esempio aggiunge Cache-Control: public, max-age=86400solo se non è Cache-Controlgià presente un'intestazione sulla risposta.

L'uso di questo codice in un trigger di risposta all'origine lo farebbe scattare ogni volta che CloudFront recupera un oggetto dall'origine e modifica la risposta prima che CloudFront lo memorizzi nella cache.

'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);
};

Aggiornamento (20/06/2018): di recente ho inviato una richiesta di funzionalità al team CloudFront per consentire la configurazione delle intestazioni di risposta all'origine statica come attributi di origine, in modo simile al modo in cui è possibile aggiungere intestazioni di richiesta statica , ora ... ma con un twist, consentendo a ciascuna intestazione di essere configurata per essere aggiunta in modo condizionale (solo se l'origine non ha fornito quell'intestazione nella risposta) o incondizionatamente (aggiungendo l'intestazione e sovrascrivendo l'intestazione da allora origine, se presente).

Con le richieste di funzionalità, in genere non si riceve alcuna conferma del fatto che stiano effettivamente prendendo in considerazione l'implementazione della nuova funzionalità ... o anche se potrebbero aver già lavorato su di essa ... viene appena annunciato al termine. Quindi, non ho idea se questi saranno implementati. C'è un argomento da sostenere sul fatto che poiché questa funzionalità è già disponibile tramite Lambda @ Edge, non è necessario nella funzionalità di base ... ma il mio contro-argomento è che la base non è funzionalmente completa senza la possibilità di eseguire una semplice manipolazione dell'intestazione della risposta statica e che se questa è l'unica ragione per cui è necessario un trigger, la richiesta di trigger Lambda è un costo non necessario, finanziariamente e con una latenza aggiuntiva (anche se nessuno dei due è necessariamente un costo stravagante).


È comunque fastidioso.
Erica Kane,


1
Tada, davvero, @Kunal. Questo è un esempio di ciò che ho definito nella risposta come "aggiunto ai metadati dell'oggetto da una successiva operazione put + copia". Usalo con cautela e prova, perché ci sono avvertimenti. Ripristinerà tutti i tuoi datestamp e potrebbe avere implicazioni per la crittografia. Può anche cambiare gli etag degli oggetti da multiparte a formato di parte singola, che è un algoritmo diverso, e confonderà qualsiasi sistema che abbia archiviato gli etag altrove per futuri controlli di integrità. Se il controllo delle versioni è abilitato sul bucket, i costi di archiviazione raddoppiano a meno che non si ripuliscano le versioni precedenti.
Michael - sqlbot,

1
Il nuovo servizio Lambda @ Edge ora fornisce anche un meccanismo che consente di aggiungere al volo intestazioni di risposta Cache-Control (tra le altre cose). Ho aggiornato la risposta con un esempio funzionante di come farlo.
Michael - sqlbot,

1
@Broshi la "politica di fiducia" del ruolo deve elencare sia i servizi lambda che edgelambda. Dai un'occhiata a docs.aws.amazon.com/lambda/latest/dg/… .
Michael - sqlbot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.