Amazon S3- und Cloudfront-Cache, wie der Cache geleert oder der Cache synchronisiert wird


73

Ich habe einen Cron-Job, der alle 10 Minuten ausgeführt wird und den Inhaltstyp und das x-amz-Meta aktualisiert. Aber seit gestern scheint es so, als ob Amazon nach dem Ausführen des Cron-Jobs die vorgenommenen Änderungen nicht aufnimmt (Aktualisierung seines Caches).

Ich habe die Änderungen sogar manuell vorgenommen, aber keine Änderung ...

Wenn ein Video hochgeladen wird, hat es einen application/x-mp4Inhaltstyp und der Cron-Job ändert ihn in video/mp4.

Obwohl S3 den richtigen Inhaltstyp video/mp4hat, zeigt Cloudfront application/x-mp4(alter Inhaltstyp) ....

Der Cron-Job hat in den letzten 6 Monaten problemlos funktioniert.

Was ist los mit Amazon Caching? Wie kann ich das Caching synchronisieren?


4
Vielleicht eine Antwort auswählen ;-)
Bob van Luijt

Antworten:


69

Verwenden Sie Invalidierungen, um den Cache zu löschen. Sie können den Pfad zu den Dateien festlegen, die Sie löschen möchten, oder einfach Platzhalter verwenden, um alles zu löschen.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api

Dies kann auch über die API erfolgen! http://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html

Das AWS PHP SDK verfügt jetzt über die folgenden Methoden. Wenn Sie jedoch etwas Leichteres verwenden möchten, lesen Sie diese Bibliothek: http://www.subchild.com/2010/09/17/amazon-cloudfront-php-invalidator/

Die Lösung von user3305600 funktioniert nicht, da das Setzen auf Null der Verwendung der Origin-Cache-Header entspricht.


2
Dies ist in der Tat eine bessere Antwort
Bob van Luijt

Diese Bibliothek scheint veraltet zu sein.
Phil Tune

@ PhilTune Post war von 2014
Neo

40

Bezüglich des tatsächlichen Codes

Rufen Sie Ihre CloudFront-Distributions-ID ab

aws cloudfront list-distributions

Machen Sie alle Dateien in der Distribution ungültig, sodass CloudFront neue abruft

aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /

Mein aktuelles Vollversionsskript ist

#!/usr/bin/env bash

BUCKET=mysite.com
SOURCE_DIR=dist/

export AWS_ACCESS_KEY_ID=xxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
export AWS_DEFAULT_REGION=eu-west-1


echo "Building production"
if npm run build:prod ; then
   echo "Build Successful"
else
  echo "exiting.."
  exit 1
fi


echo "Removing all files on bucket"
aws s3 rm s3://${BUCKET} --recursive


echo "Attempting to upload site .."
echo "Command:  aws s3  sync $SOURCE_DIR s3://$BUCKET/"
aws s3  sync ${SOURCE_DIR} s3://${BUCKET}/
echo "S3 Upload complete"

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths / --profile=myawsprofile

echo "Deployment complete"  

Verweise

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/get-invalidation.html

http://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html


Vielen Dank, dass Sie dies gepostet haben. Ich musste eine Distribution ungültig machen, um meine App vollständig von einer alten, überschriebenen Dateiversion zu befreien, die immer wieder auftauchte.
SexxLuthor

6
Anstatt zuerst alle Dateien im Bucket zu löschen, können Sie die --deleteOption verwenden aws s3 sync, dies für Sie zu tun. dhaws s3 sync ${SOURCE_DIR} s3://${BUCKET}/ --delete
Ryan McGeary

2
Erwähnenswert ist hier, dass im Pfad "/ *" alle Dateien im Bucket ungültig macht und "/ Ordnername / *", um Dateien im Ordnernamen ungültig zu machen. Ich denke auch, dass es Geld kostet
Blockwala

13

S3 wird nicht für die Echtzeitentwicklung verwendet, aber wenn Sie die Verwendung Ihrer frisch bereitgestellten Website wirklich testen möchten

http://yourdomain.com/index.html?v=2
http://yourdomain.com/init.js?v=2

Wenn Sie am Ende einen Versionsparameter hinzufügen, wird die zwischengespeicherte Version der Datei nicht mehr verwendet, und der Browser erhält eine neue Kopie der Datei aus dem Server-Bucket


8

Cloudfront speichert eine Datei / ein Objekt bis zum Ablauf des Caches zwischen. Standardmäßig ist es 24 Stunden. Wenn Sie dies auf einen großen Wert geändert haben, dauert es länger.

Wenn Sie den Cache jederzeit erzwingen müssen, verwenden Sie die Ungültigmachung . Es wird separat berechnet.

Eine andere Möglichkeit besteht darin, die URL (Objektschlüssel) so zu ändern, dass das neue Objekt immer abgerufen wird.


7

Wenn Sie nach einer minimalen Lösung suchen, die den Cache ungültig macht, sollte diese bearbeitete Version der Lösung von Dr. Manhattan ausreichen. Beachten Sie, dass ich das Stammverzeichnis / Verzeichnis angebe, um anzugeben, dass die gesamte Site aktualisiert werden soll.

export AWS_ACCESS_KEY_ID=<Key>
export AWS_SECRET_ACCESS_KEY=<Secret>
export AWS_DEFAULT_REGION=eu-west-1

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=<distributionId> --paths / --profile=<awsprofile>

Region Codes finden Sie hier

Sie müssen auch ein Profil mit der aws cli erstellen. Verwenden Sie die aws configure --profileOption. Unten finden Sie ein Beispiel-Snippet von Amazon.

$ aws configure --profile user2
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: text

5

Hier ist eine manuelle Methode, um den Cache für alle Dateien in CloudFront über AWS ungültig zu machen

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


1

(Bearbeiten: Funktioniert nicht) Ab 2014 können Sie Ihren Cache jederzeit löschen. Gehen Sie die Dokumentation gründlich durch oder gehen Sie einfach zu Ihren Verteilungseinstellungen> Verhalten> Bearbeiten

Objekt-Caching verwenden ( Origin-Cache-Header ) Anpassen

Minimale TTL = 0

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html


1
Ihre Lösung funktioniert nicht, da das Setzen auf Null der Verwendung der Origin-Cache-Header entspricht.
Neo

1
Es tut uns leid! Invalidierung ist der einzige Weg, dies zu tun! Ich denke
user3305600

0

Verwenden Sie keine Ungültigmachungen. Sie können nicht zurückgesetzt werden und werden Ihnen in Rechnung gestellt. Die einzige Möglichkeit, wie es bei mir funktioniert, besteht darin, die TTL zu reduzieren und zu warten.

Grüße


5
1000 Invalidierungen kostenlos. Ich denke, das ist nicht teuer;)
luigi7up

1
Was meinst du damit, dass sie nicht zurückgesetzt werden können? Wird der Cache bei der nächsten Anforderung nicht erneut gefüllt?
Flimm

1
Verwechseln Sie zunächst kein CDN mit einem Cache. Zweitens, nein, tut mir leid, ich habe das nicht so gemeint, ich habe gemeint, dass Sie die Ungültigmachung nicht abbrechen können, sobald Sie sie erstellt haben, aber sie gilt nur für die vorhandenen Objekte in der Distribution.
Héctor Valverde Pareja

5
Wie auch immer ... ein Jahr nach meinem Kommentar stimme ich mir nicht ganz zu, um ehrlich zu sein.
Héctor Valverde Pareja

0

Ich glaube, dass die Verwendung von * den gesamten Cache in der Distribution ungültig macht. Ich versuche es im Moment, ich würde es weiter aktualisieren

Anforderungs-Screenshot ungültig machen

Aktualisieren:

Es hat wie erwartet funktioniert. Bitte beachten Sie, dass Sie das gewünschte Objekt ungültig machen können, indem Sie den Objektpfad angeben.


Was macht der ungültige Cache eigentlich? Ich habe es in meiner Pipeline, aber ich muss meine Website immer neu laden, um die Änderungen zu sehen. Ich verwende S3-Synchronisierung, um Website-Dateien auf S3 zu aktualisieren. Ich denke, der ungültige Cache löscht nur Dateien vom Cloudfront Edge-Speicherort, nicht aber den Browser-Cache.
Haseeb Burki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.