Tengo un caso de uso en el que abro programáticamente una instancia EC2, copio un archivo ejecutable de S3, lo ejecuto y cierro la instancia (hecho en datos de usuario). Necesito obtener solo el último archivo agregado de S3. ¿Hay alguna forma de obtener el último archivo / objeto modificado de un depósito de S3 mediante la CLI?
amazon-web-services
amazon-ec2
amazon-s3
deseoso
fuente
fuente
Event/Lambda
en el objeto que se activaObjectCreation
. buscar el último objeto entre 2M + objetos usando s3 cli o api es mucho más lento.Respuestas:
Puede enumerar todos los objetos en el depósito con
aws s3 ls $BUCKET --recursive
:Están ordenados alfabéticamente por clave, pero esa primera columna es la última hora de modificación. Un rápido
sort
reordenará por fecha:tail -n 1
selecciona la última fila yawk '{print $4}'
extrae la cuarta columna (el nombre del objeto).Por último, pero no menos importante, suelte eso
aws s3 cp
para descargar el objeto:fuente
awk
deberá seleccionar el segundo elemento (en lugar del cuarto) y--recursive
será necesario, por ejemplo,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
el script anterior regresará"object"
Después de un tiempo hay una pequeña actualización de cómo hacerlo un poco elegante:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'sort_by(Contents, &LastModified)[-1].Key' --output=text
En lugar de una
reverse
función adicional , podemos obtener la última entrada de la lista a través de[-1]
Respuesta anterior:
Este comando simplemente hace el trabajo sin dependencias externas:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text
fuente
--query 'reverse(sort_by(Contents[?contains(Key, `myKey`)], &LastModified))[:1].Key'
--filter
opción regular se puede aplicar para reducir una listafuente
list-objects-v2
tiene un límite en los elementos máximos, por lo que si su cubo tiene más objetos que eso, es posible que esto no obtenga una respuesta precisaIsTruncated
establecido en verdadero si hay más claves disponibles para devolver.A continuación se muestra el script bash, que descarga el último archivo de un S3 Bucket. En su lugar, utilicé el comando AWS S3 Synch , de modo que no descargaría el archivo de S3 si ya existía.
--exclude, excluye todos los archivos
: incluye, incluye todos los archivos que coinciden con el patrón
ps Gracias @David Murray
fuente
Si se trata de un archivo recién cargado, puede utilizar Lambda para ejecutar un fragmento de código en el nuevo objeto S3.
Si realmente necesita obtener el más reciente, puede nombrar sus archivos con la fecha primero, ordenar por nombre y tomar el primer objeto.
fuente