Imposta automaticamente il controllo della cache per l'intero bucket S3 (utilizzando le policy del bucket?)


124

Ho bisogno di impostare le intestazioni di controllo della cache per un intero bucket s3, sia per i file esistenti che per quelli futuri e speravo di farlo in una policy del bucket. So di poter modificare quelli esistenti e so come specificarli in put se li carico da solo ma purtroppo l'app che li carica non può impostare le intestazioni in quanto utilizza s3fs per copiare i file lì.

Risposte:


208

Ora ci sono 3 modi per farlo: tramite la Console AWS , tramite la riga di comando o tramite lo strumento della riga di comando s3cmd .


Istruzioni per la console AWS

Questa è ora la soluzione consigliata. È semplice, ma può richiedere del tempo.

  • Accedi alla Console di gestione AWS
  • Vai nel secchio S3
  • Seleziona tutti i file per percorso
  • Scegli "Altro" dal menu
  • Seleziona "Modifica metadati"
  • Nel campo "Chiave", seleziona "Cache-Control" dal menu a discesa max-age = 604800Enter (7 days) for Value
  • Premere il pulsante "Salva"

( grazie a @biplob, per favore dagli un po 'di amore qui sotto )


Soluzione a riga di comando AWS

In origine, quando ho creato questo bucket, le policy non erano possibili, quindi ho capito come farlo utilizzando aws-cli, ed è piuttosto semplice. Durante la ricerca non sono riuscito a trovare alcun esempio in natura, quindi ho pensato di pubblicare alcune delle mie soluzioni per aiutare i bisognosi.

NOTA: per impostazione predefinita, aws-cli copia solo i metadati correnti di un file, ANCHE SE SPECIFICHI NUOVI METADATI.

Per utilizzare i metadati specificati sulla riga di comando, è necessario aggiungere il flag "--metadata-Directive REPLACE". Ecco alcuni esempi.

Per un unico file

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Per un intero bucket (nota: flag ricorsivo):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Ho trovato un piccolo trucco, se vuoi applicarlo solo a un tipo di file specifico, devi escludere tutti i file, quindi includere quelli che desideri.

Solo jpg e png:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Ecco alcuni link al manuale se hai bisogno di maggiori informazioni:

Problemi noti:

"Unknown options: --metadata-directive, REPLACE"

questo può essere causato da un awscli obsoleto - vedi la risposta di @ eliotRosewater di seguito


Strumento S3cmd

S3cmd è uno "strumento a riga di comando per la gestione dei servizi Amazon S3 e CloudFront". Sebbene questa soluzione richieda un git pull, potrebbe essere una soluzione più semplice e completa.

Per le istruzioni complete, vedere il post di @ ashishyadaveee11 di seguito


Spero che sia d'aiuto!


6
Grazie per gli esempi concreti di cosa esattamente fare. Avevo problemi a scoprire cosa fosse possibile anche solo leggendo i documenti.
danneu

2
Ricevo "Opzioni sconosciute: --metadata-Directive, REPLACE" quando eseguo uno dei comandi precedenti. Aiutami.
user3722785

1
Nota, ORA C'È UN MODO PIÙ SEMPLICE. Ora puoi modificare i metadati per TUTTI i file in un bucket tramite la Console AWS. Vedi la risposta di CoderBoy di seguito: stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
Nota che l'uso di --meta-direttiva REPLACE sovrascriverà tutti i metadati precedenti che non sono stati copiati nel comando! Ad esempio "content-encoding gzip" verrà rimosso se non viene aggiunto esplicitamente al comando cp.
Harmen Janssen

1
Fa lo cpscaricare e ri-upload tutto?
mlissner

37

Ora può cambiare facilmente dalla console AWS.

  • Accedi alla Console di gestione AWS
  • Vai nel secchio S3
  • Seleziona tutti i file per percorso
  • Scegli "Altro" dal menu
  • Seleziona "Modifica metadati"
  • Nel campo "Chiave", seleziona "Controllo cache" dal menu a discesa
  • max-age = 604800 Immettere (7 giorni) per Value
  • Premere il pulsante "Salva"

L'esecuzione richiede tempo dipende dai file del bucket. Ripeti dall'inizio se chiudi accidentalmente il browser.


6
Cosa significa "seleziona tutti i file per percorso"?
Tamzin Blake

1
Seleziona tutti / alcuni file dalla directory in cui desideri impostare meta
biplob

Perdonami per aver risposto tardi. No, non è così. Dovresti impostarlo dalla tua applicazione.
biplob

Questo sostituisce i metadati precedenti o li aggiunge? (Non voglio perdere tutti i miei tipi di contenuto!)
Chris

Ho appena confermato che NON rimuove i valori esistenti. Imposta solo le chiavi specificate (sovrascrivendo la chiave se esiste)
rynop

21

passaggi

  1. git clone https://github.com/s3tools/s3cmd
  2. Esegui s3cmd --configure (Ti verranno chieste le due chiavi: copiale e incollale dall'e-mail di conferma o dalla pagina del tuo account Amazon. Fai attenzione quando le copi! Fanno distinzione tra maiuscole e minuscole e devono essere inserite accuratamente o continuerai a ricevere errori di non valido firme o simili. Ricorda di aggiungere le s3:ListAllMyBucketsautorizzazioni alle chiavi o riceverai un AccessDeniederrore durante il test dell'accesso.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

Super risposta. Grazie! C'è un modo per aggiornare SOLO quelli che non hanno già questa impostazione di intestazione?
PKHunter

Qualcuno ha una soluzione simile da utilizzare con S3Express di Windows?
Joe

12

Se il mio punteggio di reputazione fosse> 50, commenterei. Ma non è (ancora) quindi ecco un'altra risposta completa.


Sto sbattendo la testa su questo problema da un po 'di tempo. Fino a quando non ho trovato e letto i documenti. Condividendolo qui nel caso in cui aiuti qualcun altro:

Quello che ha finito per funzionare in modo affidabile per me è stato questo comando. Ho scelto un tempo di scadenza di 1 secondo per i test per verificare i risultati attesi:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEè richiesto quando " cp" si modificano i metadati su un file esistente in S3
  • max-age imposta l'età della cache del browser, in secondi
  • s-maxage imposta la memorizzazione nella cache di CloudFront, in pochi secondi

Allo stesso modo, se si impostano questi valori di intestazione Cache-Control su un file durante il caricamento su S3, il comando sarà simile a:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file

8

Non penso che tu possa specificarlo a livello di bucket, ma ci sono alcune soluzioni alternative per te.

  1. Copia l'oggetto su se stesso su S3 impostando le cache-controlintestazioni appropriate per l'operazione di copia.

  2. Specificare le intestazioni di risposta nell'URL dei file . È necessario utilizzare URL pre-firmati affinché funzioni, ma è possibile specificare determinate intestazioni di risposta nella stringa di query tra cui cache-controle expires. Per un elenco completo delle opzioni disponibili, vedere: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


Grazie Geoff, sapevo di (1) ma non (2). Non quello che avevo sperato (anche se temo che non sia possibile)
che

Hai un comando AWS CLI di esempio su come eseguire # 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

Puoi sempre configurare un lambda con un trigger su PUTOBJECT su S3, il lambda cambierà semplicemente l'intestazione di questo particolare oggetto che è stato appena inserito.

Quindi puoi eseguire il comando di copia menzionato sopra un'ultima volta e tutti i nuovi oggetti verranno corretti da lambda.

AGGIORNARE:

Ecco un buon punto di partenza: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


Puoi fornire qualche dettaglio in più su come preparare questo lamba? Sembra un'ottima soluzione.
Wouter

1
@Wouter certo, ti ho trovato un link che effettivamente può aiutarti ad arrivarci facilmente, aaronfagan.ca/blog/2017/… Se hai bisogno di aiuto o supporto sarei più che felice di aiutarti.
Ibrahim Bou Ncoula

so che è vecchio ma ho trovato questa risorsa utile per quello che stavo cercando. grazie per questo. voti per te amico mio!
naufrago

1

A coloro che tentano di utilizzare la risposta di Dan e ottengono l'errore:

"Opzioni sconosciute: --metadata-Directive, REPLACE"

Mi sono imbattuto nel problema e il problema era che ho installato awscli usando

sudo apt-get install awscli

Questo ha installato una vecchia versione di awscli a cui manca il comando --metadata-Directive. Quindi ho usato sudo apt-get remove awscli per rimuoverlo.

Quindi reinstallato seguendo la procedura da amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

L'unica differenza è che ho dovuto usare sudo -H a causa di problemi di autorizzazione in cui potrebbero incorrere anche altri.

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.