Mam przypadek użycia, w którym programowo wywołuję instancję EC2, kopiuję i plik wykonywalny z S3, uruchamiam go i zamykam instancję (zrobione w danych użytkownika). Muszę pobrać tylko ostatni dodany plik z S3. Czy istnieje sposób na pobranie ostatnio zmodyfikowanego pliku / obiektu z zasobnika S3 przy użyciu interfejsu wiersza polecenia?
amazon-web-services
amazon-ec2
amazon-s3
życzliwy
źródło
źródło
Event/Lambda
obiektu na obiekcie, który jest wyzwalanyObjectCreation
. pobranie ostatniego obiektu spośród ponad 2 mln obiektów za pomocą s3 cli lub api jest o wiele wolniejsze.Odpowiedzi:
Możesz wyświetlić listę wszystkich obiektów w zasobniku za pomocą
aws s3 ls $BUCKET --recursive
:Są sortowane alfabetycznie według kluczy, ale ta pierwsza kolumna to czas ostatniej modyfikacji. Szybka zmiana
sort
kolejności ich według daty:tail -n 1
wybiera ostatni wiersz iawk '{print $4}'
wyodrębnia czwartą kolumnę (nazwę obiektu).Wreszcie, upuść to
aws s3 cp
do pobrania obiektu:źródło
awk
będziesz musiał wybrać drugi element (zamiast czwartego) i--recursive
będzie potrzebny, np.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
, powróci poprzedni skrypt"object"
Po chwili jest mała aktualizacja, jak to zrobić trochę elegancko:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text
Zamiast dodatkowej
reverse
funkcji możemy pobrać ostatni wpis z listy za pomocą[-1]
Stara odpowiedź:
To polecenie po prostu wykonuje zadanie bez żadnych zewnętrznych zależności:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text
źródło
--query 'reverse(sort_by(Contents[?contains(Key, `myKey`)], &LastModified))[:1].Key'
--filter
opcję można zastosować, aby zmniejszyć listęźródło
list-objects-v2
ma limit maksymalnej liczby przedmiotów, więc jeśli twoje wiadro ma więcej obiektów niż to - to może nie dać dokładnej odpowiedziIsTruncated
wartość true, jeśli dostępnych jest więcej kluczy do zwrócenia.Poniżej znajduje się skrypt bash, który pobiera najnowszy plik z S3 Bucket. Użyłem AWS S3 SynchZamiast tego , aby nie pobierał pliku z S3, jeśli już istnieje.
--exclude, wyklucza wszystkie pliki
--include, zawiera wszystkie pliki pasujące do wzorca
ps Dzięki @David Murray
źródło
Jeśli jest to świeżo przesłany plik, możesz użyć Lambda do wykonania fragmentu kodu na nowym obiekcie S3.
Jeśli naprawdę potrzebujesz najnowszego, możesz nazwać swoje pliki datą najpierw, posortować według nazwy i wybrać pierwszy obiekt.
źródło