javascript - Hur man hämtar objekt från AWS S3 efter skapelsedatum
Jag vill fråga efter objekt från S3 inom en specifik undermapp i en bucket baserat på datum/tid när de lades till i S3. Jag har inte kunnat hitta någon tydlig dokumentation om detta, så jag undrar hur det kan göras?
De typer av frågor jag vill utföra ser ut så här...
- Returnera URL:en för den senast skapade filen i S3-bucket
imagesunder katalogenimages/user1/ - Returnera URL:erna för alla objekt skapade mellan datum och tid
Xoch datum och tidYi S3-bucketenimagesunder katalogenimages/user1
Svar #1
Uppdatering 19/3/2019
Tydligen tillåter s3api dig att göra detta ganska enkelt
En lösning skulle förmodligen vara att använda s3api. Det fungerar lätt om du har färre än 1000 objekt, annars behöver du arbeta med paginering.
s3api kan lista alla objekt och har en egenskap för lastmodified-attributet hos nycklar som importeras i s3. Det kan sedan sorteras, hitta filer efter eller före ett datum, matcha ett datum ...
Exempel på att köra ett sådant alternativ
alla filer för ett givet datum
DATE=$(date +%Y-%m-%d) aws s3api list-objects-v2 --bucket test-bucket-fh \ --query "Contents[?contains(LastModified, \`$DATE\`)]"alla filer efter ett visst datum
YESTERDAY=`date -d '-1 day' +%F` aws s3api list-objects-v2 --bucket test-bucket-fh \ --query "Contents[?LastModified > \`$YESTERDAY\`]"
s3api kommer att returnera några metadata så att du kan filtrera efter specifika element
DATE=$(date +%Y-%m-%d)
aws s3api list-objects-v2 --bucket test-bucket-fh \
--query "Contents[?contains(LastModified, \`$DATE\`)].Key"
GAMMALT SVAR
AWS-SDK/CLI borde verkligen implementera någon form av hämta-per-datum-flagga, det skulle göra livet lättare och billigare.
Om du inte har försett/försett dina filer med datum, kanske du också vill försöka använda flaggan
--start-after (string)
Om du vet den senaste filen du vill börja lista från kan du använda kommandot list-objects-v2 med flaggan --start-after.
"StartAfter är där du vill att Amazon S3 ska börja lista från. Amazon S3 börjar lista efter denna angivna nyckel. StartAfter kan vara vilken nyckel som helst i bucketen"
Så --start-after kommer kontinuerligt hämta dina objekt, så om du vill begränsa antalet objekt, försök att specificera en --max-items-flagga.
https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects-v2.html
Svar #2
S3 kan lista alla objekt i en bucket, eller alla objekt med ett prefix (såsom en "katalog"). Detta är dock inte en billig operation, det är definitivt inte avsett att göras vid varje förfrågan.
Generellt sett tjänar du bäst på ett databasskikt för detta. Det kan vara något lätt och snabbt (som Redis), men du bör veta vilka objekt du har och vilket du behöver för en viss begäran.
Du kan till viss del fuska genom att kopiera objekt två gånger - till exempel images/latest.jpg eller images/user1/latest.jpg. Men i exemplet med "datumsökning" bör du verkligen göra detta utanför S3.
