Ich habe einen Anwendungsfall, in dem ich programmgesteuert eine EC2-Instanz aufrufe, eine Datei aus S3 kopiere und ausführbar mache, sie ausführe und die Instanz herunterfahre (in Benutzerdaten). Ich muss nur die zuletzt hinzugefügte Datei von S3 erhalten. Gibt es eine Möglichkeit, die zuletzt geänderte Datei / das zuletzt geänderte Objekt mithilfe der CLI aus einem S3-Bucket abzurufen?
80
Event/Lambda
Objekt zu erstellen , das ausgelöst wirdObjectCreation
. Das Abrufen des letzten Objekts unter 2M + Objekten mit s3 cli oder api ist viel zu langsam.Antworten:
Sie können alle Objekte im Bucket auflisten mit
aws s3 ls $BUCKET --recursive
:Sie sind alphabetisch nach Schlüsseln sortiert, aber diese erste Spalte ist die letzte geänderte Zeit. Ein kurzer
sort
wird sie nach Datum neu ordnen:tail -n 1
wählt die letzte Zeile aus undawk '{print $4}'
extrahiert die vierte Spalte (den Namen des Objekts).Zu guter Letzt legen Sie dies ab,
aws s3 cp
um das Objekt herunterzuladen:quelle
awk
muss das zweite Element (anstelle des vierten) auswählen und--recursive
wird benötigt, z. B.KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $2}'` ; aws s3 cp s3://$BUCKET/$KEY ./latest-object --recursive
aws s3 cp s3://$BUCKET/$KEY ./latest-object
Das vorherige Skript wird zurückgegeben"object"
Nach einer Weile gibt es ein kleines Update, wie man es ein bisschen elegant macht:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text
Anstelle einer zusätzlichen
reverse
Funktion können wir den letzten Eintrag aus der Liste über erhalten[-1]
Alte Antwort:
Dieser Befehl erledigt den Job einfach ohne externe Abhängigkeiten:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text
quelle
--query 'reverse(sort_by(Contents[?contains(Key, `myKey`)], &LastModified))[:1].Key'
--filter
Option kann angewendet werden, um eine Liste zu reduzierenquelle
list-objects-v2
gibt eine Begrenzung für die maximale Anzahl von Gegenständen. Wenn Ihr Eimer also mehr Objekte enthält - dies wird möglicherweise keine genaue Antwort erhaltenIsTruncated
auf true gesetzt wurde, wenn mehr Schlüssel für die Rückgabe verfügbar sind.Es folgt ein Bash-Skript, das die neueste Datei von einem S3-Bucket herunterlädt. Ich habe stattdessen den Befehl AWS S3 Synch verwendet, damit die Datei nicht von S3 heruntergeladen wird, wenn sie bereits vorhanden ist.
--exclude, schließt alle Dateien aus
--include, enthält alle Dateien, die dem Muster entsprechen
ps Danke @ David Murray
quelle
Wenn es sich um eine frisch hochgeladene Datei handelt, können Sie mit Lambda einen Code für das neue S3-Objekt ausführen.
Wenn Sie wirklich die neueste benötigen, können Sie Ihre Dateien mit dem Datum zuerst benennen, nach Namen sortieren und das erste Objekt übernehmen.
quelle