Saltar al contenido

La forma más eficiente de eliminar archivos S3 por lotes

Nuestro team de especialistas pasados ciertos días de investigación y de recopilar de información, obtuvieron la respuesta, esperamos que te sea útil para tu plan.

Solución:

Solución 1:

los terriblemente lento la opción es s3 rm --recursive si realmente te gusta esperar.

Corriendo en paralelo s3 rm --recursive con diferente --include patrones es un poco más rápido, pero todavía se pierde mucho tiempo esperando, ya que cada proceso recupera individualmente todo el key lista para realizar localmente --include la coincidencia de patrones.

Ingrese eliminación masiva.

Descubrí que podía obtener la mayor velocidad al eliminar 1000 keys a la vez usando aws s3api delete-objects.

He aquí un ejemplo:

cat file-of-keys | xargs -P8 -n1000 bash -c 'aws s3api delete-objects --bucket MY_BUCKET_NAME --delete "Objects=[$(printf "Key=%s," "[email protected]")],Quiet=true"' _
  • los -P8 opción en xargs controla el paralelismo. Son ocho en este caso, lo que significa 8 instancias de 1000 eliminaciones a la vez.
  • los -n1000 la opción dice xargs para empaquetar 1000 keys para cada aws s3api delete-objects llama.
  • Eliminando ,Quiet=true o cambiarlo a false arrojará respuestas del servidor.
  • Nota: hay un _ al final de esa línea de comando. @VladNikiforov publicó un excelente comentario de para qué sirve en el comentario, así que solo voy a vincularlo.

Pero como llegas file-of-keys?

Si ya tiene su lista de keys, bien por usted. Trabajo completado.

Si no es así, supongo que hay una forma:

aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | sed -nre "s|[0-9-]+ [0-9:]+ +[0-9]+ |SOME_SUB_DIR|p" >file-of-keys

Solucion 2:

AWS admite la eliminación masiva de hasta 1000 objetos por solicitud mediante la API REST de S3 y sus diversos contenedores. Este método asume que conoce el objeto S3 keys desea eliminar (es decir, no está diseñado para manejar algo como una política de retención, archivos que superan un cierto tamaño, 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). Por tanto, cada solicitud conlleva gastos generales. Solo necesitas conocer los objetos ‘ keys y cree una solicitud HTTP (o use 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 a la vez. En lugar de iniciar una tarea como “purgar todos los objetos que hacen referencia 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í, sabrá el keys que necesita eliminar. También significa que al usuario le gustará más información en tiempo real sobre si su archivo se eliminó correctamente o no. Referencias exactas keys se supone que son muy rápidos, ya que S3 fue diseñado para escalar de manera eficiente a pesar de manejar una gran cantidad de datos.

De lo contrario, puede buscar llamadas a API asincrónicas. Puede 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 elija. Esto permitiría que la solicitud de eliminación tome su propio hilo, y el resto del código se puede ejecutar sin hacer esperar al usuario. O 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 las preguntas frecuentes de s3 comentan que la deleiton masiva es la camino a seguir si es posible.


Solucion 3:

Un 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 prefix 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


Solucion 4:

Estaba frustrado por el rendimiento de la consola web para esta tarea. Descubrí que el comando AWS CLI lo hace 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 para que se ejecute en un tmux o screen sesión y vuelva a consultar más tarde.


Solucion 5:

Ya menciono sobre s3 sync comando antes, pero sin ejemplo ni palabra sobre --delete opción.

Encontré la forma más rápida de eliminar el contenido de la carpeta en S3 Cubeta my_bucket por:

aws s3 sync --delete "local-empty-dir/" "s3://my_bucket/path-to-clear"

Más adelante puedes encontrar las interpretaciones de otros usuarios, tú además eres capaz mostrar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *