AWS admite la eliminación masiva de hasta 1000 objetos por solicitud utilizando la API REST de S3 y sus diversos contenedores. Este método supone que conoce las claves de objeto S3 que desea eliminar (es decir, no está diseñado para manejar algo como una política de retención, archivos que tienen un tamaño determinado, etc.).
La API REST de S3 puede especificar que se eliminen hasta 1000 archivos en una sola solicitud, lo que debe ser más rápido que realizar solicitudes individuales. Recuerde, cada solicitud es una solicitud HTTP (por lo tanto, TCP). Entonces cada solicitud lleva gastos generales. Solo necesita conocer las claves de los objetos y crear una solicitud HTTP (o usar un contenedor en el idioma que elija). AWS proporciona gran información sobre esta función y su uso . ¡Simplemente elija el método con el que se sienta más cómodo!
Supongo que su caso de uso implica que los usuarios finales especifiquen una cantidad de archivos específicos para eliminar de una vez. En lugar de iniciar una tarea como "purgar todos los objetos que se refieren a archivos de imágenes" o "purgar todos los archivos anteriores a una fecha determinada" (que creo que es fácil de configurar por separado en S3).
Si es así, conocerá las claves que necesita eliminar. También significa que al usuario le gustará recibir más comentarios en tiempo real sobre si su archivo se eliminó con éxito o no. Se supone que las referencias a claves exactas son muy rápidas, ya que S3 fue diseñado para escalar eficientemente a pesar de manejar una cantidad extremadamente grande de datos.
Si no, puede buscar llamadas API asíncronas. Puedes leer un poco sobre cómo funcionarían en general en esta publicación de blog o buscar cómo hacerlo en el idioma que elijas. Esto permitiría que la solicitud de eliminación tome su propio hilo, y el resto del código puede ejecutarse sin hacer que un usuario espere. O bien, puede descargar la solicitud a una cola. . . Pero ambas opciones complican innecesariamente su código (el código asincrónico puede ser molesto) o su entorno (necesitaría un servicio / demonio / contenedor / servidor para manejar la cola. Así que evitaría este escenario si es posible).
Editar: no tengo la reputación de publicar más de 2 enlaces. Pero puede ver los comentarios de Amazon sobre la tasa de solicitud y el rendimiento aquí: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html Y el faq s3 comenta que la eliminación masiva es la camino a seguir si es posible.
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
y luego eliminar objetos (esto fue suficiente para que al pasar 1 proceso paralelo alcance los límites de velocidad para la eliminación de objetos):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
_
al final :) Me lo perdí y luego me llevó bastante tiempo entender por qué se omite el primer elemento. El punto es quebash -c
pasa todos los argumentos como parámetros posicionales, comenzando con$0
, mientras que "$ @" solo procesa parámetros que comienzan con$1
. Por lo tanto, se necesita el guión bajo para llenar la posición de$0
.split -l 1000
dividir mi archivo de claves en 1000 lotes de claves. Ahora para cada archivo puedo emitir el comando de eliminar y luego eliminar el archivo. Si algo sale mal, puedo continuar.aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
que sería más simple y puede agregar una| grep
para filtrar eso desde allí.Estaba frustrado por el rendimiento de la consola web para esta tarea. Descubrí que el comando AWS CLI hace esto bien. Por ejemplo:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
Para una jerarquía de archivos grande, esto puede llevar una cantidad considerable de tiempo. Puede configurar esto en una sesión
tmux
oscreen
sesión y volver más tarde.fuente
aws s3 rm --recursive
comando elimina archivos individualmente. Aunque es más rápido que la consola web, al eliminar muchos archivos, podría ser mucho más rápido si se elimina de forma masivaUn buen truco es usar reglas de ciclo de vida para manejar la eliminación por usted. Puede poner en cola una regla para eliminar el prefijo u objetos que desee y Amazon solo se encargará de la eliminación.
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
fuente
Sin saber cómo está administrando los buckets de s3, esto puede o no ser particularmente útil.
Las herramientas de AWS CLI tienen una opción llamada "sincronización" que puede ser particularmente efectiva para garantizar que s3 tenga los objetos correctos. Si usted o sus usuarios administran S3 desde un sistema de archivos local, es posible que pueda ahorrar una tonelada de trabajo para determinar qué objetos deben eliminarse utilizando las herramientas CLI.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
fuente
Ya se mencionó sobre el
s3 sync
comando antes, pero sin ejemplo y palabra sobre la--delete
opción.Encontré la forma más rápida de eliminar el contenido de la carpeta en el
S3
cubomy_bucket
por:fuente