Aws-cli: aws s3 ls - Dateien nach Änderungsdatum suchen?

Erstellt am 21. Jan. 2015  ·  87Kommentare  ·  Quelle: aws/aws-cli

Hi,
Wir möchten in der Lage sein, einen Bucket mit vielen Tausenden (wahrscheinlich Hunderttausenden) von Objekten und Ordnern/Präfixen zu durchsuchen, um Objekte zu finden, die kürzlich hinzugefügt oder aktualisiert wurden. Es erscheint ineffizient, aws s3 ls mehrmals täglich für den gesamten Bucket auszuführen und dann die Liste zu durchsuchen. Gibt es eine Möglichkeit, einfach eine Liste von Objekten mit einer geänderten Zeit <, >, = einem bestimmten Zeitstempel anzufordern?

Wird uns auch einmal für die aws s3 ls-Anfrage oder einmal für jedes der von der Anfrage zurückgegebenen Objekte in Rechnung gestellt?

Neu bei github, ich wünschte, ich wüsste genug, um tatsächlichen Code beizutragen ... schätze die Hilfe.

guidance

Hilfreichster Kommentar

@jwieder Dies hilft dem Benutzer nicht, die Anzahl der Listenaufrufe an s3 zu verringern. Angenommen, Sie speichern jeden Tag ~1000 Nachrichtenartikel in einem Eimer. Dann möchten Sie auf Client-Seite standardmäßig Artikel der letzten 3 Tage erhalten (und mehr nur, wenn explizit angefordert). Das Abrufen einer Liste aller Artikel seit Beginn der Zeit, sagen wir 100.000, kostet Zeit und verursacht Netzwerkkosten (weil ein einzelner Listenaufruf nur bis zu 1000 Artikel zurückgibt). Es wäre viel schöner, sagen zu können "Geben Sie mir eine Liste der Elemente, die seit 3 ​​Tagen erstellt / geändert wurden".

Alle 87 Kommentare

Die S3-API unterstützt dies nicht, daher besteht die einzige Möglichkeit, dies nur mit S3 zu tun, darin, eine clientseitige Sortierung durchzuführen.

Was die S3-Preise angeht , verwenden wir eine ListObjects Anfrage, die 1000 Objekte gleichzeitig zurückgibt. Bei Verwendung von aws s3 ls wird Ihnen also eine LIST-Anfrage pro 1000 Objekte in Rechnung gestellt.

Eine andere Alternative besteht darin, einen Hilfsindex außerhalb von S3 zu speichern, zB dynamodb. Lassen Sie es mich wissen, wenn Sie weitere Fragen haben.

Dankeschön

Obwohl diese Funktionalität in aws-cli zu fehlen scheint, ist es ziemlich einfach, sie in bash zu skripten. Zum Beispiel:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ | grep ${DATE}

@jwieder Dies hilft dem Benutzer nicht, die Anzahl der Listenaufrufe an s3 zu verringern. Angenommen, Sie speichern jeden Tag ~1000 Nachrichtenartikel in einem Eimer. Dann möchten Sie auf Client-Seite standardmäßig Artikel der letzten 3 Tage erhalten (und mehr nur, wenn explizit angefordert). Das Abrufen einer Liste aller Artikel seit Beginn der Zeit, sagen wir 100.000, kostet Zeit und verursacht Netzwerkkosten (weil ein einzelner Listenaufruf nur bis zu 1000 Artikel zurückgibt). Es wäre viel schöner, sagen zu können "Geben Sie mir eine Liste der Elemente, die seit 3 ​​Tagen erstellt / geändert wurden".

Genau!

Am So, 17.01.2016 um 23:53 Uhr, PuchatekwSzortach <
[email protected]> schrieb:

@jwieder https://github.com/jwieder Das hilft nicht beim Abnehmen
Anzahl der Listenaufrufe an s3. Sagen Sie, dass Sie jeden Tag ~1000 Nachrichten speichern
Artikel in einem Eimer. Dann möchten Sie auf der Client-Seite Artikel für die letzten 3
Tage standardmäßig (und mehr nur auf ausdrücklichen Wunsch). holen müssen
Liste aller Artikel seit Beginn der Zeit, sagen wir 100k, braucht Zeit
und es fallen Netzwerkkosten an (da ein einzelner Listenaufruf nur nach oben zurückkehrt)
bis 1000 Artikel). Es wäre viel schöner, sagen zu können "Geben Sie mir eine Liste von
Artikel erstellt/geändert seit 3 ​​Tagen".


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/aws/aws-cli/issues/1104#issuecomment -172425517.

@PuchatekwSzortach @ChrisSLT Sie haben Recht, sorry für meine lahme Antwort; und ich stimme zu, dass diese Art von Funktionalität in aws-cli sehr hilfreich wäre. Die Kombination aus Weglassen dieser Basisfunktion und Abrechnung von Dateilisten ist höchst suspekt. Bis AWS aufhört zu sparen und eine Auflistung nach Dateieigenschaften einführt, hier ist eine andere Idee, die ich verwendet habe und die für diesen Thread relevanter ist als meine erste Antwort: Für Dateien, die auf diese Weise verfolgt werden müssen, werden Dateien mit einem Zeitstempel benannt . Eine Liste von Dateien wird in einer lokalen Textdatei gespeichert (oder könnte db sein, wenn Sie Unmengen von Dateien haben, um die Sie sich kümmern müssen). Die Suche nach einem Datum beinhaltet dann das Öffnen der Datei, die Suche nach Dateinamen, die dem heutigen Datum entsprechen, könnte etwa so aussehen:

while read -r Dateiname
tun
if [ "$fileName" == "$TODAY" ]; dann
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include "$fileName"
fi
fertig < "$DATEI"

Dabei ist $FILE Ihr lokaler Dateinamenindex und $TODAY das Datum, nach dem Sie suchen. Sie müssen die Bedingung in dieser Schleife ändern, aber das kann Ihnen hoffentlich eine Idee geben.

Auf diese Weise werden Sie von allen Gebühren im Zusammenhang mit der Auflistung der Dateien in Ihrem Bucket befreit. aber es hängt auch vom Client ab, auf dem Sie die Suche durchführen, um Zugriff auf die lokale Dateiliste zu haben ... abhängig von Ihrer Anwendung / Systemarchitektur, die diese Art von Ansatz möglicherweise unmöglich macht. Wie auch immer, hoffe das hilft und entschuldigt mich nochmal für meine frühere Derpy-Antwort.

Einverstanden und danke

Am Dienstag, 19. Januar 2016 um 10:00 Uhr, Josh Wieder [email protected]
schrieb:

@PuchatekwSzortach https://github.com/PuchatekwSzortach @ChrisSLT
https://github.com/ChrisSLT Sie haben Recht, sorry für meine lahme Antwort; und
Ich stimme zu, dass diese Art von Funktionalität in aws-cli sehr hilfreich wäre. Die
Kombination aus Weglassen dieser Basisfunktion und Abrechnung für Dateilisten
ist höchst verdächtig. Bis AWS aufhört, Geld zu sparen und eine Listung einführt von
Dateieigenschaften, hier ist eine andere Idee, die ich verwendet habe, die relevanter ist
zu diesem Thread dann meine 1. Antwort: Für Dateien, die in diesem nachverfolgt werden müssen
Dateien werden mit einem Zeitstempel benannt. Eine Liste von Dateien wird in einem lokalen
Textdatei (oder könnte db sein, wenn Sie Millionen von Dateien haben, um die Sie sich kümmern müssen).
Die Suche nach einem Datum beinhaltet dann das Öffnen der Datei und das Suchen nach Dateinamen
die mit dem heutigen Datum übereinstimmen, könnte etwa so aussehen:

while read -r Dateiname
tun
if [ "$fileName" == "$TODAY" ]; dann
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include
"$Dateiname"
fi
fertig < "$DATEI"

Dabei ist $FILE Ihr lokaler Dateinamenindex und $TODAY das Datum, an dem Sie sich befinden
auf der Suche nach. Sie müssen die Bedingung in dieser Schleife ändern, aber
hoffentlich kann dir das eine idee geben.

Auf diese Weise werden Sie von allen Gebühren im Zusammenhang mit der Auflistung der
Dateien in Ihrem Eimer; aber es hängt auch von dem Kunden ab, den du dirigierst
die Suche nach Zugriff auf die lokale Dateiliste ... abhängig von Ihrem
Anwendungs-/Systemarchitektur, die einen solchen Ansatz ermöglichen könnte
undurchführbar. Wie auch immer, hoffe das hilft und entschuldigt mich nochmal für mein früheres
derpy-Antwort.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

Es gibt eine Möglichkeit, dies mit der s3api- und der --query-Funktion zu tun. Dies wird auf OSX getestet
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
Sie können dann mit jq oder grep filtern, um die Verarbeitung mit den anderen s3api-Funktionen durchzuführen.

Bearbeiten: Ich bin mir nicht sicher, warum sie nicht angezeigt werden, aber Sie müssen das abgefragte Datum mit Backticks umgeben

Ist es möglich, Ordner für jeden Tag zu erstellen und auf diese Weise nur auf die Dateien von heute oder höchstens auf die Ordner von gestern zuzugreifen, um die neuesten Dateien zu erhalten.

Jawohl. Obwohl Sie es möglicherweise einfacher finden, einfach ein Datumspräfix für Ihre Schlüssel zu verwenden (Sie können eine Kombination aus Bucketname/Ordnername nicht mit der Option --bucket abfragen). Wenn Sie das Datumspräfix verwenden, können Sie das Flag --prefix in der cli verwenden und Ihre Abfragen beschleunigen, da AWS die Verwendung von Zahlen oder Hashes am Anfang von Schlüsselnamen für längere Antwortzeiten empfiehlt.

@willstruebing , Ihre Lösung reduziert immer noch nicht die Anzahl der S3-API-Aufrufe, die serverseitige Kabel gesendeten Daten. Der Parameter --query führt nur die clientseitige jmespath-Filterung durch.

@kislyuk Ich stimme voll und ganz zu, dass dies die Effizienzprobleme nicht beantwortet. Meine Absicht war es jedoch, die konkrete Frage zu beantworten:

Is there a way to simply request a list of objects with a modified time <, >, = a certain timestamp?

Diese grundlegende Frage ist, wie ich zu diesem Thread gekommen bin, und daher hielt ich es für vernünftig, eine Antwort darauf aufzunehmen. Das Problem trägt die Bezeichnung "aws s3 ls - Dateien nach Änderungsdatum suchen?".

Ich würde gerne die Ideen von irgendjemandem zu den Effizienzteilen der Frage hören, da ich selbst keine habe und immer noch neugierig bin.

#für i in s3cmd ls | awk {'print $3'} ; do aws s3 ls $i --recursive ; fertig >> s3-full.out

Was ist die Standardeinstellung für AWS-Rückgabedateien? Gibt es sie in alphabetischer Reihenfolge oder nach der letzten Änderung zurück oder nach welchen Kriterien wird Ihr erster Stapel von 1000 Dateinamen angefordert?

Ich stimme zu, dass es sicherlich eine Art Filter geben sollte (nach Datum, nach Name usw. sortieren), den Sie verwenden können, wenn Sie Dateien anfordern ... definitiv eine fehlende Funktion. :(

Ich stimme zu, dass diese Filterung serverseitig erfolgen sollte und ein Grundbedürfnis ist.

+1 für serverseitige Abfrage/Filterung

+1 für serverseitige Filterung

Immer noch sehr gebraucht, +1

Einverstanden mit @chescales und dem Rest, +1 für die serverseitige Filterung

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Wieso ist das noch kein Feature?

+100.000

+1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

Der Kommentar von

aws s3api list-objects --bucket "mybucket" --prefix "some/prefix" --query "Contents[?LastModified>=`2018-08-22`].{Key: Key}"

oh egal - ich sehe, nachdem ich den Netzwerkverkehr von diesem Befehl aus beobachtet habe, dass alle Schlüssel immer noch von s3 heruntergeladen werden und aws cli die Client-Seite filtert!

+1

+1

+1

+1

Was ist mit den Filtern --exclude und --include?

!/bin/bash

DATUM=$(Datum +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ --exclude " " --include " ${DATE}*"

+1

+1

+1 Million

+1

+∞

+∞+1

+1

+1

+1

++

+1

+1

+1

+1 :( :(

Ich denke, das ist Teil des Preismodells von AWS, supergünstiger Speicher, aber für den Zugriff bezahlt. Gut für große Dateien, wird Sie jedoch ruinieren, wenn Sie Millionen kleiner Dateien abfragen/verwalten möchten.

+1

Ich denke, deshalb haben sie Athena erschaffen? eine andere Möglichkeit, eine Rechnung zu erstellen, während Sie ein paar Schnickschnack hinzufügen?

+1

+1

+1

Ich muss die s3-Bucket-Objekte auflisten, die zwischen zwei Daten geändert werden, z. 2019-06-08 bis 2019-06-11

irgendjemand eine idee?

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" und verwenden Sie dann JQ oder Ihr bevorzugtes Tool, um nach dem 11.06.2019 herauszufiltern

Das eliminiert API-Aufrufe nicht. Diese Abfragen sind clientseitig

Am Di, 11. Juni 2019, 14:07 willstruebing [email protected]
schrieb:

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query
"Inhalt[?LastModified>='2019-06-08'][].{Key: Key,LastModified:
LastModified}" und verwenden Sie dann JQ oder Ihr bevorzugtes Tool, um nach zu filtern
2019-06-11


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMW5AFAU5BUNM7FEMZ3PZ7SV3A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXGOZ500DXA2
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@dmead Ich stimme voll und ganz zu. Die Funktionalität für die serverseitige Filterung existiert jedoch derzeit nicht (ich denke, das ist der Grund, warum so viele Leute in diesem bestimmten Beitrag landen), daher ist dies die einzige Problemumgehung, die mir bekannt ist, um die vorliegende Aufgabe abzuschließen. Haben Sie eine Möglichkeit, dies serverseitig zu tun, oder ist dies nur eine Beobachtung der vorgeschlagenen Lösung? Ich würde gerne Input dazu hören, wie es geht UND die Anzahl der API-Aufrufe reduzieren.

Wenn Sie die Zeit haben, würde ich in Athena Metadaten auswählen. ich
Ich hatte selbst noch keine Gelegenheit, aber das schien eine mögliche Lösung zu sein.

Am Mi, 12. Juni 2019 um 10:28 willstruebing [email protected]
schrieb:

@dmead https://github.com/dmead Ich stimme voll und ganz zu. Allerdings ist die
Funktionalität für die serverseitige Filterung ist derzeit nicht vorhanden (glaube ich
Deshalb landen so viele Leute bei diesem bestimmten Beitrag), also ist dies der
einzige mir bekannte Problemumgehung, um die anstehende Aufgabe zu erledigen. Hast du ein
Möglichkeit, dies serverseitig zu tun, oder ist dies nur eine Beobachtung über das vorgeschlagene?
Lösung? Ich würde gerne einen Beitrag dazu hören, wie es geht UND die Menge an reduzieren
API-Aufrufe.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMTQZD6OWVH4KDMSJPLP2EBY7A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNWW50Menge
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

Jeder, der dies befürwortet und es mit AWS CLI einreicht, hilft nicht. AWS CLI ist an S3 gebunden. Datei mit dem S3-Team statt mit dem Github eines Tools, wenn Sie es reparieren möchten: P

@mike-bailey OK, und wie mache ich das?

Wenn ich persönlich wäre, würde ich ein AWS-Ticket einreichen, damit es an das Serviceteam gelangt. Aber ich arbeite nicht für AWS. Ich weiß nur, dass das Kommentieren von "+1" nicht die Änderung sein wird.

Es gibt eine Möglichkeit, dies mit der s3api- und der --query-Funktion zu tun. Dies wird auf OSX getestet
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
Sie können dann mit jq oder grep filtern, um die Verarbeitung mit den anderen s3api-Funktionen durchzuführen.

Bearbeiten: Ich bin mir nicht sicher, warum sie nicht angezeigt werden, aber Sie müssen das abgefragte Datum mit Backticks umgeben

Stellen Sie sicher, dass Sie die neueste Version von awscli bevor Sie diese Antwort versuchen. Ich habe aufgerüstet
awscli 1.11.47 -> 1.16.220
und es hat die gefürchtete clientseitige Filterung durchgeführt, aber es funktionierte.
+1 für serverseitige Filterung.

+1

+1

Bitte den Thread lesen, +1 bringt nichts

Sie können dies nicht einfach tun, aber in diesen Kommentaren ist der folgende Tipp versteckt:

 aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>=`2016-05-20`][].{Key: Key}'

Dies ist immer noch clientseitig und wird viele Anfragen ausführen.

Wie bereits erwähnt, wird dies jedoch clientseitig behandelt. Sie schlagen also möglicherweise immer noch den Eimer mit Anrufen zu.

Die Filterung sollte serverseitig erfolgen und ist meiner Meinung nach ein Grundbedürfnis.

Hier ist ein Beispiel mit aws s3 sync, sodass nur neue Dateien heruntergeladen werden. Es kombiniert die Protokolle in einer Protokolldatei und entfernt die Kommentare, bevor die Datei gespeichert wird. Sie können dann grep und Things verwenden, um Protokolldaten abzurufen. In meinem Fall musste ich eindeutige Treffer für eine bestimmte Datei zählen. Dieser Code unten wurde von diesem Link angepasst: https://shapeshed.com/aws-cloudfront-log/ Der sed-Befehl funktioniert auch auf dem Mac und unterscheidet sich von dem, was im Artikel steht. Hoffe das hilft!

aws s3 sync s3://<YOUR_BUCKET> .
cat *.gz > combined.log.gz
gzip -d combined.log.gz
sed -i '' '/^#/ d' combined.log

# counts unique logs for px.gif hits
grep '/px.gif' combined.log | cut -f 1,8 | sort | uniq -c | sort -n -r

# above command will return something like below. The total count followed by the date and the file name.
17 2020-01-02 /px.gif
 9 2020-01-03 /px.gif

Ich weiß, es ist ein altes Problem, aber um hier eine elegante Lösung zu hinterlassen:

aws s3api list-objects --output=text --query "Contents[?LastModified >= <DATE_YOU_WANT_TO_START> ].{Key: Key}"

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen