Aws-cli: aws s3 ls - ¿buscar archivos por fecha de modificación?

Creado en 21 ene. 2015  ·  87Comentarios  ·  Fuente: aws/aws-cli

Hola,
Nos gustaría poder buscar en un depósito con muchos miles (probablemente aumentando a cientos de miles) de objetos y carpetas / prefijos para encontrar objetos que se agregaron o actualizaron recientemente. Ejecutar aws s3 ls en todo el depósito varias veces al día y luego ordenar la lista parece ineficaz. ¿Hay alguna manera de solicitar simplemente una lista de objetos con un tiempo modificado <,>, = una determinada marca de tiempo?

Además, ¿se nos cobra una vez por la solicitud aws s3 ls o una vez por cada uno de los objetos devueltos por la solicitud?

Nuevo en github, ojalá supiera lo suficiente para contribuir con el código real ... agradezco la ayuda.

guidance

Comentario más útil

@jwieder Esto no ayuda al usuario a reducir el número de llamadas de lista a s3. Digamos que todos los días almacena ~ 1000 artículos de noticias en un cubo. Luego, en el lado del cliente, desea obtener artículos de los últimos 3 días de forma predeterminada (y más solo si se solicita explícitamente). Tener que buscar una lista de todos los artículos desde el principio de los tiempos, digamos 100k, lleva tiempo y acumula costos de red (porque una sola llamada a la lista devolverá solo hasta 1000 artículos). Sería mucho mejor poder decir "Dame una lista de elementos creados / modificados desde hace 3 días".

Todos 87 comentarios

La API de S3 no admite esto, por lo que la única forma de hacerlo simplemente usando S3 es hacer una clasificación del lado del cliente.

En cuanto a los precios de S3 , usamos una solicitud ListObjects que devuelve 1000 objetos a la vez. Por lo tanto, se le cobrará una solicitud LIST por cada 1000 objetos cuando use aws s3 ls .

Otra alternativa es almacenar un índice auxiliar fuera de S3, por ejemplo, dynamodb. Avíseme si tiene alguna otra pregunta.

Gracias

Aunque esta funcionalidad parece estar ausente en aws-cli, es bastante fácil escribirla en bash. Por ejemplo:

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

@jwieder Esto no ayuda al usuario a reducir el número de llamadas de lista a s3. Digamos que todos los días almacena ~ 1000 artículos de noticias en un cubo. Luego, en el lado del cliente, desea obtener artículos de los últimos 3 días de forma predeterminada (y más solo si se solicita explícitamente). Tener que buscar una lista de todos los artículos desde el principio de los tiempos, digamos 100k, lleva tiempo y acumula costos de red (porque una sola llamada a la lista devolverá solo hasta 1000 artículos). Sería mucho mejor poder decir "Dame una lista de elementos creados / modificados desde hace 3 días".

¡Exactamente!

El domingo 17 de enero de 2016 a las 11:53 p.m., PuchatekwSzortach <
[email protected]> escribió:

@jwieder https://github.com/jwieder Esto no ayuda a que el usuario disminuya
número de listas de llamadas a s3. Di que todos los días almacenas ~ 1000 noticias
artículos en un balde. Luego, en el lado del cliente, desea obtener artículos de los últimos 3
días de forma predeterminada (y más solo si se solicita explícitamente). Tener que buscar un
lista de todos los artículos desde el principio de los tiempos, digamos 100k, lleva tiempo
y acumula costos de red (porque una sola lista de llamadas solo devolverá
hasta 1000 artículos). Sería mucho mejor poder decir "Dame una lista de
elementos creados / modificados desde hace 3 días ".

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172425517.

@PuchatekwSzortach @ChrisSLT Tienes razón, lo siento por mi respuesta

mientras lee -r nombreArchivo
hacer
if ["$ fileName" == "$ HOY"]; luego
aws s3 sync $ BUCKETURL / some / local / directorio --excluir "*" --incluir "$ fileName"
fi
hecho <"$ FILE"

Donde $ FILE es su índice de nombre de archivo local y $ TODAY es la fecha que está buscando. Deberá cambiar la condición en este bucle, pero es de esperar que esto le pueda dar una idea.

Hacer las cosas de esta manera lo libera de cualquier cargo relacionado con la inclusión de los archivos en su depósito; pero también depende del cliente que está realizando la búsqueda para tener acceso a la lista de archivos locales ... dependiendo de la arquitectura de su aplicación / sistema que podría hacer que este tipo de enfoque sea inviable. De todos modos, espero que esto ayude y me disculpo de nuevo por mi respuesta anterior.

De acuerdo y gracias

El martes 19 de enero de 2016 a las 10:00 a. M., Josh Wieder [email protected]
escribió:

@PuchatekwSzortach https://github.com/PuchatekwSzortach @ChrisSLT
https://github.com/ChrisSLT Tienes razón, lo siento por mi pobre respuesta; y
Estoy de acuerdo en que este tipo de funcionalidad sería muy útil en aws-cli. los
combinación de dejar de lado esta función básica y facturación de listados de archivos
es muy sospechoso. Hasta que AWS deje de gastar dinero e introduzca la lista de
propiedades del archivo, aquí hay otra idea que he usado que es más relevante
a este hilo, entonces mi primera respuesta: para archivos que necesitan ser rastreados en este
De esta forma, los archivos se nombran con una marca de tiempo. Una lista de archivos se almacena en un local
archivo de texto (o podría ser db si tiene miles de millones de archivos de los que preocuparse).
La búsqueda de una fecha implica abrir el archivo, buscar nombres de archivo
que coincida con la fecha de hoy podría verse así:

mientras lee -r nombreArchivo
hacer
if ["$ fileName" == "$ HOY"]; luego
aws s3 sync $ BUCKETURL / some / local / directorio --excluir "*" --incluir
"$ fileName"
fi
hecho <"$ FILE"

Donde $ FILE es su índice de nombre de archivo local y $ TODAY es la fecha en la que está
buscando. Deberá cambiar la condición en este bucle, pero
Con suerte, esto puede darte una idea.

Hacer las cosas de esta manera lo libera de cualquier cargo relacionado con la inclusión de
archivos en su cubo; pero también depende del cliente que estés realizando
la búsqueda de tener acceso a la lista de archivos locales ... dependiendo de su
arquitectura de aplicación / sistema que podría hacer que este tipo de enfoque
inviable. De todos modos, espero que esto ayude y me disculpo de nuevo por mi
respuesta burlona.

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

Hay una forma de hacer esto con s3api y la función --query. Esto se prueba en OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contenido [? LastModified> = 2016-05-20 ] []. {Key: Key}'
luego puede filtrar usando jq o grep para hacer el procesamiento con las otras funciones de s3api.

Editar: no estoy seguro de por qué no aparecen, pero debe usar comillas invertidas para rodear la fecha que está consultando

¿Es posible que cree carpetas para cada día y de esa manera, accederá solo a los archivos de hoy o, como máximo, a las carpetas de ayer para obtener los archivos más recientes?

si. Aunque puede que le resulte más fácil simplemente usar un prefijo de fecha para sus claves (no puede consultar una combinación de nombre de depósito / nombre de carpeta con la opción --bucket). El uso del prefijo de fecha le permitirá usar la marca --prefix en la cli y acelerar sus consultas, como recomienda AWS, usar números o hashes al principio de los nombres de las claves para aumentar los tiempos de respuesta.

@willstruebing , su solución aún no reduce la cantidad de llamadas a la API de S3, la complejidad de las consultas del lado del servidor o la cantidad de datos enviados por cable. El parámetro --query realiza únicamente el filtrado de jmespath del lado del cliente.

@kislyuk Estoy completamente de acuerdo en que no responde a los problemas de eficiencia. Sin embargo, mi intención era responder a la pregunta específica:

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

Esa pregunta básica es cómo terminé en este hilo, por lo que pensé que era razonable incluir una respuesta. El problema está etiquetado como "aws s3 ls - ¿buscar archivos por fecha de modificación?".

Me encantaría escuchar las ideas de cualquiera sobre las partes de eficiencia de la pregunta, ya que yo mismo no tengo una y todavía tengo curiosidad.

#for i en s3cmd ls | awk {'print $3'} ; hacer aws s3 ls $ i --recursive; hecho >> s3-full.out

¿Cuál es el valor predeterminado para los archivos de retorno de AWS? ¿Los devuelve en orden alfabético, o por la modificación más reciente, o cuál es el criterio que se utiliza cuando solicita su primer lote de 1000 nombres de archivo?

Estoy de acuerdo en que ciertamente debería haber algún tipo de filtro (ordenar por fecha, por nombre, etc.) que pueda usar cuando solicite archivos ... definitivamente una característica que falta. :(

Estoy de acuerdo en que este filtrado debe ser del lado del servidor y es una necesidad básica.

+1 para consultas / filtrado del lado del servidor

+1 para el filtrado del lado del servidor

Todavía es muy necesario, +1

De acuerdo con @chescales y el resto, +1 al filtrado del lado del servidor

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

¿Cómo es que esto ya no es una característica?

+100000

+ 1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

El comentario de @willstruebing funcionó para mí, por ejemplo:

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

oh no importa - ¡Después de ver el tráfico de red desde este comando, veo que todas las claves aún se están descargando desde s3 y aws cli está haciendo el filtrado del lado del cliente!

+1

+1

+1

+1

¿Qué pasa con los filtros --excluir e --incluir?

! / bin / bash

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

+1

+1

+1 millón

+1

+ ∞

+ ∞ + 1

+1

+1

+1

++

+1

+1

+1

+1 :( :(

Creo que es parte del modelo de precios de AWS, almacenamiento súper barato pero de pago para acceder. Bueno para archivos grandes, pero lo arruinará si desea consultar / administrar millones de archivos pequeños.

+1

Supongo que por eso crearon Atenea. ¿Otra forma de facturar mientras se agregan algunas campanas y silbidos?

+1

+1

+1

Tengo que enumerar los objetos del cubo s3 que se modifican entre dos fechas, por ejemplo. 2019-06-08 hasta 2019-06-11

alguna idea alguien?

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" y luego use JQ o su herramienta preferida para filtrar después del 2019-06-11

Eso no elimina las llamadas a la API. Esas consultas son del lado de los clientes.

El martes 11 de junio de 2019 a las 2:07 p.m. willstruebing [email protected]
escribió:

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query
"Contenido [? LastModified> = '2019-06-08'] []. {Key: Key, LastModified:
LastModified} "y luego use JQ o su herramienta preferida para filtrar después
2019-06-11

-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMW5AFAU5BUNM7FEMZ3PZ7SV3A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DVDMVREXWWK3TUL52HS4DFVVORXWWK3TUL52HS4DFVVREXWG43 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@dmead Estoy completamente de acuerdo. Sin embargo, la funcionalidad para hacer el filtrado del lado del servidor no existe actualmente (creo que es por eso que tanta gente termina en esta publicación en particular), por lo que esta es la única solución que conozco para completar la tarea en cuestión. ¿Tiene alguna forma de hacerlo del lado del servidor o es solo una observación sobre la solución propuesta? Me encantaría escuchar información sobre cómo hacerlo Y reducir la cantidad de llamadas a la API.

Si tiene tiempo, buscaría seleccionar metadatos en Athena. I
Yo mismo no he tenido la oportunidad, pero eso parecía una posible solución.

El miércoles 12 de junio de 2019 a las 10:28 a.m. willstruebing [email protected]
escribió:

@dmead https://github.com/dmead Estoy completamente de acuerdo. sin embargo, el
La funcionalidad para hacer el filtrado del lado del servidor no existe actualmente (creo
es por eso que tantas personas terminan en esta publicación en particular), así que esta es la
única solución alternativa que conozco para completar la tarea en cuestión. Tienes un
forma de hacerlo del lado del servidor o es sólo una observación sobre la propuesta
¿solución? Me encantaría escuchar opiniones sobre cómo hacerlo Y reducir la cantidad de
Llamadas a API.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMTQZD6OWVH4KDMSJPLP2EBY7A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DVDMVREXWWK3TUL52HS4DVDMVREXWWK3TUL52HS4DFVVREXWG43 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

Todos los que votan a favor de esto, archivarlo con AWS CLI no ayuda. AWS CLI está vinculado por S3. Presente el archivo con el equipo de S3 en lugar de con el github de una herramienta si desea que se solucione: P

@ mike-bailey OK, ¿y cómo lo hago?

Si fuera yo personalmente, presentaría un ticket de AWS para que llegue al equipo de servicio. Pero no trabajo para AWS. Solo sé que comentar '+1' sobre esto no va a ser el cambio.

Hay una forma de hacer esto con s3api y la función --query. Esto se prueba en OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contenido [? LastModified> = 2016-05-20 ] []. {Key: Key}'
luego puede filtrar usando jq o grep para hacer el procesamiento con las otras funciones de s3api.

Editar: no estoy seguro de por qué no aparecen, pero debe usar comillas invertidas para rodear la fecha que está consultando

Asegúrese de tener la última versión de awscli antes de probar esta respuesta. Yo actualicé
awscli 1.11.47 -> 1.16.220
e hizo el temido filtrado del lado del cliente, pero funcionó.
+1 para filtrado del lado del servidor.

+1

+1

Por favor, lea el hilo, +1 no hace nada

No puede hacer esto fácilmente, pero enterrado en estos comentarios se encuentra el siguiente consejo:

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

Esto sigue siendo del lado del cliente y realizará muchas solicitudes.

Sin embargo, como se señaló anteriormente, lo maneja del lado del cliente. De modo que todavía potencialmente golpea el cubo con llamadas.

El filtrado debe ser del lado del servidor y es una necesidad básica, creo.

A continuación, se muestra un ejemplo en el que se utiliza aws s3 sync para que solo se descarguen archivos nuevos. Combina los registros en un archivo de registro y elimina los comentarios antes de guardar el archivo. Luego puede usar grep y cosas para obtener datos de registro. En mi caso, necesitaba contar visitas únicas a un archivo específico. Este código a continuación fue adaptado de este enlace: https://shapeshed.com/aws-cloudfront-log/ El comando sed también funciona en Mac y es diferente de lo que está en el artículo. ¡Espero que esto ayude!

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

Sé que es un problema antiguo, pero para dejar una solución elegante aquí:

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

¿Fue útil esta página
0 / 5 - 0 calificaciones