Frage

Ich verwende die CloudFront von Amazon, um statische Dateien meiner Web -Apps zu servieren.

Gibt es keine Möglichkeit, eine CloudFront -Verteilung mitzuteilen, dass sie ihre Datei aktualisieren oder auf eine einzelne Datei hinweisen muss, die aktualisiert werden sollte?

Amazon empfiehlt, dass Sie Ihre Dateien wie logo_1.gif, logo_2.gif usw. als Problemumgehung für dieses Problem, aber das scheint eine ziemlich dumme Lösung zu sein. Gibt es absolut keinen anderen Weg?

War es hilfreich?

Lösung

Gute Nachrichten. Amazon hat schließlich eine Ungültigmachungsfunktion hinzugefügt. Siehe die API -Referenz.

Dies ist eine Beispielanforderung aus der API -Referenz:

POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml

<InvalidationBatch>
   <Path>/image1.jpg</Path>
   <Path>/image2.jpg</Path>
   <Path>/videos/movie.flv</Path>
   <CallerReference>my-batch</CallerReference>
</InvalidationBatch>

Andere Tipps

Ab dem 19. März ermöglicht Amazon jetzt, dass Cloudfronts Cache TTL 0 Sekunden beträgt, sodass Sie (theoretisch) nie veraltete Objekte sehen sollten. Wenn Sie also Ihre Assets in S3 haben, können Sie einfach zu AWS Web Panel => S3 => Eigenschaften bearbeiten => metadaten und dann Ihren Wert "Cache-Control" auf "max-altern = 0" festlegen.

Dies ist direkt von der API -Dokumentation:

Um zu kontrollieren, ob Cloudfront ein Objekt zwischengeschnitten hat und wie lange es lange läuft, empfehlen wir Ihnen, den Cache-Kontroll-Header mit der Richtlinie max-altern zu verwenden. Cloudfront zwischengezogen das Objekt für die angegebene Anzahl von Sekunden. (Der Mindestwert beträgt 0 Sekunden.)

Mit der API für die Invalidierungs -API wird sie in wenigen Minuten aktualisiert.
Kasse PHP Invalidator.

Automatisches Update -Setup in 5 Minuten

Okay Leute. Die bestmögliche Möglichkeit für die automatische CloudFront -Update (Invalidierung) besteht darin, die Lambda -Funktion zu erstellen, die jedes Mal ausgelöst wird, wenn eine Datei in S3 Bucket hochgeladen wird (eine neue oder umgeschrieben).

Selbst wenn Sie noch nie Lambda-Funktionen verwendet haben, ist es wirklich einfach-folgen Sie einfach meinen Schritt-für-Schritt-Anweisungen und es dauert nur 5 Minuten:

Schritt 1

Gehe zu https://console.aws.amazon.com/lambda/home und klicken Sie Erstellen Sie eine Lambda -Funktion

Schritt 2

Klicke auf Leere Funktion (benutzerdefiniert)

Schritt 3

Klicken Sie auf leeres (gestreicheltes) Feld und wählen Sie aus S3 aus Combo

Schritt 4

Wähle Deine Eimer (Gleich wie bei der CloudFront -Verteilung)

Schritt 5

Setze an Ereignisart zu "Objekt erstellt (alle)" "

Schritt 6

Satz Präfix und Suffix Oder lassen Sie es leer, wenn Sie nicht wissen, was es ist.

Schritt 7

Prüfen Trigger aktivieren Kontrollkästchen und klicken Nächste

Schritt 8

Nennen Sie Ihre Funktion (so etwas wie: YourBucketNames3TocloudfrontonCreateall)

Schritt 9

Auswählen Python 2.7 (oder später) als Laufzeit

Schritt 10

Fügen Sie den folgenden Code anstelle des Standard -Python -Codes ein:

from __future__ import print_function

import boto3
import time

def lambda_handler(event, context):
    for items in event["Records"]:
        path = "/" + items["s3"]["object"]["key"]
        print(path)
        client = boto3.client('cloudfront')
        invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_',
            InvalidationBatch={
            'Paths': {
            'Quantity': 1,
            'Items': [path]
            },
            'CallerReference': str(time.time())
            })

Schritt 11

Offen https://console.aws.amazon.com/cloudfront/home In einer neuen Browser -Registerkarte und kopieren Sie Ihre CloudFront -Verteilungs -ID für die Verwendung im nächsten Schritt.

Schritt 12

Kehren Sie zur Registerkarte Lambda zurück und fügen Sie Ihre Verteilungs -ID anstelle von _your_distribution_id_ in den Python -Code ein. Umgebende Zitate weiterzumachen.

Schritt 13

Satz Handler: lambda_function.lambda_handler

Schritt 14

Klick auf das Rolle Combobox und auswählen Erstellen Sie eine benutzerdefinierte Rolle. Neue Registerkarte im Browser wird geöffnet.

Schritt 15

Klicken Richtliniendokument anzeigen, klicken bearbeiten, klicken OK und ersetzen Sie die Rollendefinition durch folgende (wie sie sind):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

Schritt 16

Klicken ermöglichen. Dies wird Sie zu einem Lambda zurückkehren. Überprüfen Sie, ob Sie diesen Rollennamen, den Sie gerade erstellt haben Bestehende Rolle Kombinationsfeld.

Schritt 17

Satz Speicher (MB) bis 128 und Auszeit bis 5 Sek.

Schritt 18

Klicken Nächste, dann klick Funktion erstellen

Schritt 19

Du bist startklar! Jedes Mal, wenn Sie jede Datei in S3 hochladen/wiederladen, wird sie an allen Cloudfront -Kantenorten ausgewertet.

PS - Stellen Sie beim Testen sicher, dass Ihr Browser Bilder aus CloudFront lädt, nicht aus lokalem Cache.

PSS - Bitte beachten Sie, dass nur die ersten 1000 -Dateien für die Ungültigkeit pro Monat kostenlos sind und jede Ungültigmachung über den Grenzwert 0,005 USD kostet. Es können auch zusätzliche Gebühren für die Lambda -Funktion gelten, ist jedoch äußerst billig.

Bucket Explorer Hat eine Benutzeroberfläche, die dies jetzt ziemlich einfach macht. Hier ist wie:

Klicken Sie mit der rechten Maustaste auf Ihren Eimer. Wählen Sie "Verteilungen verwalten".
Klicken Sie mit der rechten Maustaste auf Ihre Verteilung. Wählen Sie "CloudFront Invalidation List" abrufen und dann "Erstellen" aus Wählen, um eine neue Ungültigheitsliste zu erstellen. Wählen Sie die Dateien aus, um ungültig zu werden, und klicken Sie auf "Ungültige". Warten Sie 5-15 Minuten.

Wenn Sie haben Boto Installiert (das ist nicht nur für Python, sondern installiert auch eine Reihe nützlicher Befehlszeilen -Dienstprogramme), es bietet eine Befehlszeile, die speziell aufgerufen wurde. cfadmin oder "Cloud Front Admin", das die folgende Funktionalität bietet:

Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions

Sie nutzen Dinge, indem Sie laufen:

$sam# cfadmin invalidate <distribution> <path>

Posten Sie nur, um alle zu informieren, die diese Seite besuchen (erstes Ergebnis in der "CloudFront-Datei aktualisiert"), dass es einen benutzerfreundlichen+Zugriff gibt Online Invalidator erhältlich unter SWOOK.net

Dieser neue Invalidator ist:

  • Vollständig online (keine Installation)
  • Verfügbar 24x7 (von Google gehostet) und benötigt keine Mitgliedschaften.
  • Es gibt Verlaufsunterstützung und Pfadüberprüfung, um Sie Ihre Dateien mühelos ungültig zu machen. (Oft mit nur ein paar Klicks, nachdem sie zum ersten Mal ungültig gemacht haben!)
  • Es ist auch sehr sicher, wie Sie beim Lesen herausfinden werden Veröffentlichung Post.

Vollständige Offenlegung: Ich habe das gemacht. Habe Spaß!

Eine sehr einfache Möglichkeit, dies zu tun, ist die Ordnerversionierung.

Wenn Ihre statischen Dateien beispielsweise Hunderte sind, legen Sie einfach alle in einen Ordner mit dem Titel "By Year+Versioning".

Zum Beispiel verwende ich einen Ordner namens 2014_v1, in dem ich alle meine statischen Dateien habe ...

Also habe ich in meinem HTML immer den Verweis auf den Ordner gestellt. (Natürlich habe ich einen PHP -Enthält, wo ich den Namen des Ordners festgelegt habe.) Wenn Sie also in 1 Datei geändert werden, wird dies in allen meinen PHP -Dateien tatsächlich geändert.

Wenn ich eine vollständige Aktualisierung möchte, benenne ich den Ordner einfach in 2014_v2 in meine Quelle um und ändere mich innerhalb des PHP -Include in 2014_v2

Alle HTML ändern sich automatisch und fragen Sie den neuen Pfad, Cloudfront Miss Cache und fordern Sie ihn an die Quelle an.

Beispiel: Source.Mydomain.com ist meine Quelle, Cloudfront.mydomain.com ist Cname to CloudFront Distribution.

Der PHP nannte diese Datei CloudFront.mydomain.com/2014_v1/javaScript.js und wenn ich eine vollständige Aktualisierung möchte, benenne ich einfach den Ordner in die Quelle in "2014_v2" um und ändere den PHP, indem ich den Ordner in "2014_v2" einstellen kann. .

So gibt es keine Verzögerung für die Ungültigkeit und keine Kosten!

Dies ist mein erster Beitrag in Stackoverflow. Ich hoffe, ich habe es gut gemacht!

Stellen Sie TTL = 1 Stunde ein und ersetzen Sie

http://developer.amazonwebservices.com/connect/ann.jspa?annid=655

In Ruby mit dem Nebelstein

AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY']
AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID']

conn = Fog::CDN.new(
    :provider => 'AWS',
    :aws_access_key_id => AWS_ACCESS_KEY,
    :aws_secret_access_key => AWS_SECRET_KEY
)

images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg']

conn.post_invalidation AWS_DISTRIBUTION_ID, images

Sogar bei Ungültigmachung dauert es noch 5-10 Minuten, bis die Ungültigmachung alle Amazon Edge-Server verarbeitet und aktualisiert hat

Aktuelle AWS -CLI -Unterstützung im Vorschaubermodus. Führen Sie Folgendes einmal in Ihrer Konsole aus:

aws configure set preview.cloudfront true

Ich bereitete mein Webprojekt mit NPM bereit. Ich habe die folgenden Skripte in meinem package.json:

{
    "build.prod": "ng build --prod --aot",
    "aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
    "aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /",
    "deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}

Mit den oben genannten Skripten können Sie Ihre Website mit:

npm run deploy

Wenn Sie AWS verwenden, verwenden Sie wahrscheinlich auch das offizielle CLI -Tool (früher oder später). AWS CLI Version 1.9.12 oder oben unterstützt das Ungültige einer Liste von Dateinamen.

Vollständige Offenlegung: Ich habe das gemacht. Habe Spaß!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top