¿Cómo mover archivos entre dos cubos S3 con un costo mínimo?

44

Tengo millones de archivos en un bucket de Amazon S3 y me gustaría mover estos archivos a otros buckets y carpetas con un costo mínimo o sin costo, si es posible. Todos los cubos están en la misma zona.

¿Cómo podría hacerlo?

Daniel Cukier
fuente

Respuestas:

53

Millones es un gran número, volveré a eso más tarde.

Independientemente de su enfoque, el mecanismo subyacente debe estar copiando directamente de un depósito a otro; de esta forma (dado que sus depósitos están en la misma región) no se le cobrará ningún cargo por el ancho de banda. Cualquier otro enfoque es simplemente ineficiente (por ejemplo, descargar y volver a cargar los archivos).

La copia entre cubos se logra utilizando 'PUT copy', que es una solicitud PUT que incluye el encabezado 'x-amz-copy-source', creo que esto se clasifica como una solicitud COPY. Esto copiará el archivo y, por defecto, los metadatos asociados. Debe incluir un 'x-amz-acl' con el valor correcto si desea establecer la ACL al mismo tiempo (de lo contrario, se establecerá en privado de forma predeterminada). Se le cobrará por sus solicitudes de COPIA ($ 0.01 / 1,000 solicitudes). Puede eliminar los archivos innecesarios después de que se hayan copiado (las solicitudes DELETE no se cobran). (Un punto que no tengo muy claro es si una solicitud de COPIA también incurre en el cargo de una solicitud GET, ya que el objeto primero debe recuperarse del depósito de origen; si lo hace, el cargo será de $ 0.01 / 10,000 adicionales peticiones).

Los cargos anteriores son aparentemente inevitables: para un millón de objetos que está mirando alrededor de $ 10 (o $ 11). Dado que al final debe crear los archivos en el depósito de destino, otros enfoques (p. Ej., Comprimir los archivos con tar, Amazon Import / Export, etc.) no evitarán este costo. Sin embargo, podría valer la pena contactar a Amazon si tiene más de un par de millones de objetos para transferir.

Dado lo anterior (precio inevitable), lo siguiente a considerar es el tiempo, que será un factor importante al copiar 'millones de archivos'. Todas las herramientas que pueden realizar la copia directa entre cubos incurrirán en el mismo cargo. Desafortunadamente, necesita una solicitud por archivo (para copiar), una solicitud para eliminar y posiblemente una solicitud para leer los datos de ACL (si sus archivos tienen ACL variadas). La mejor velocidad vendrá de lo que pueda ejecutar las operaciones más paralelas.

Hay algunos enfoques de línea de comando que podrían ser bastante viables:

  • La modificación s3cmd (esa solicitud de extracción específica) incluye comandos paralelos cp y mv y debería ser una buena opción para usted.
  • La consola de AWS puede realizar la copia directamente, aunque no puedo hablar de cuán paralela es.
  • El guión aws de Tim Kay puede hacer la copia, pero no es paralelo, tendrá que guiarlo para ejecutar la copia completa que desee (probablemente no sea la mejor opción en este caso, aunque es un gran guión).
  • CloudBerry S3 Explorer , Bucket Explorer y CloudBuddy deberían poder realizar la tarea, aunque no sé cómo se acumula la eficiencia de cada uno. Sin embargo, creo que las características de subprocesos múltiples de la mayoría de estas requieren la compra del software.
  • Crea tu propio script usando uno de los SDK disponibles.

Existe la posibilidad de que s3fs pueda funcionar, es bastante paralelo, admite copias entre el mismo depósito, NO admite copias entre diferentes depósitos, pero puede admitir movimientos entre diferentes depósitos.

Comenzaría con la modificación s3cmd y vería si tiene algún éxito o si me pongo en contacto con Amazon para obtener una mejor solución.

cyberx86
fuente
Bucket Explorer parece estar funcionando bien para mí (mover archivos entre dos cubos en este momento)
Fideos
3
¿Dónde aws s3 sync s3://source s3://destinationencaja?
Olivier Lalonde
7

Tema anterior, pero esto es para cualquiera que esté investigando el mismo escenario. Junto con el tiempo que me llevó, para más de 20,000 objetos. Se ejecuta en AWS Linux / Centos, cada objeto es imágenes en su mayor parte, junto con algunos videos y varios archivos multimedia.

Uso de las herramientas de AWS CLI para copiar los archivos del depósito A al depósito B.

A. Crear el nuevo cubo

$ aws s3 mb s3://new-bucket-name

B. Sincronice el depósito antiguo con el depósito nuevo

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

Copiando más de 20,000 objetos ...

Iniciado 17:03

Finalizado 17:06

Tiempo total para más de 20,000 objetos = aproximadamente 3 minutos

Una vez que el nuevo depósito está configurado correctamente, es decir, permisos, políticas, etc. y desea eliminar el depósito anterior.

C. Eliminar / eliminar el cubo antiguo

$ aws s3 rb --force s3://old-bucket-name
usuario1360528
fuente
Salvador de la vida. Estoy copiando más de 300 GB. Un consejo: si copia desde cubos en la misma región es mucho más rápido que en otra región (y leí que es menos costoso).
Marcelo Agimóvel
Tuve un problema con su método: la privacidad de los archivos se configuró como PRIVADA, incluso la mayoría de los objetos son públicos, ¿qué sucedió?
Marcelo Agimóvel
5

No estoy seguro de que sea el mejor enfoque, pero la consola de administración de AWS tiene una función de cortar / copiar / pegar. Muy fácil de usar y eficiente.

Itikos Kleinos
fuente
66
No es probable que funcione bien con un millón de archivos.
James
@James puede confirmar dolorosamente eso;)
robar
3

Me imagino que probablemente ya haya encontrado una buena solución, pero para otros que se encuentran con este problema (como lo hice hace poco), he creado una utilidad simple específicamente para reflejar un cubo S3 a otro en Una manera muy concurrente, pero eficiente de CPU y memoria.

Está en github bajo una licencia de Apache aquí: https://github.com/cobbzilla/s3s3mirror

Si decide intentarlo, avíseme si tiene algún comentario.

Cobbzilla
fuente
Tuve una gran experiencia con s3s3mirror. Pude configurarlo en un nodo EC2 m1.small y copiar 1,5 millones de objetos en aproximadamente 2 horas. La configuración fue un poco difícil, debido a mi desconocimiento con Maven y Java, pero solo necesité unos pocos comandos apt-get en Ubuntu para instalar todo. Una última nota: si (como yo) le preocupa ejecutar un script desconocido en un gran e importante bucket s3, cree un usuario especial con acceso de solo lectura en el bucket de copia y use esas credenciales. Cero posibilidades de eliminación accidental.
Micah
¿Se puede aplicar esto a los depósitos entre diferentes cuentas?
Oliver Burdekin
@OliverBurdekin sí, hay una --cross-account-copyopción ( -Cpara abreviar) para hacer esto. Tenga en cuenta que al copiar entre cuentas, las ACL no se copian; El propietario del depósito de destino tendrá permisos completos para los datos copiados.
cobbzilla
Gracias @rfcreader ¿Cómo puedo estimar el costo de esto? Soy consciente de la calculadora de costos de AWS, pero no tengo idea de lo que implicará este proceso en términos de cantidad de solicitudes de obtención de ls, etc. Me imagino que es bastante fácil contar estas métricas usando CLI, pero si sabe más, póngase en contacto. El soporte de AWS sugirió "el solicitante paga". ¡decir ah!
Oliver Burdekin
@OliverBurdekin s3s3mirror realiza un seguimiento de la cantidad de solicitudes de AWS por tipo (GET, COPY, DELETE, etc.). Estas estadísticas se imprimen periódicamente cuando se ejecutan, y una última vez al final. Podría hacer una ejecución limitada / de prueba para copiar un pequeño subconjunto de los objetos, esto debería darle una idea general de cuántas solicitudes totales se requerirán para copiar todo el conjunto de datos.
cobbzilla
2

AWS CLI proporciona una forma de copiar un depósito a otro en procesos paralelos. Tomado de https://stackoverflow.com/a/40270349/371699 :

Los siguientes comandos le indicarán a la AWS CLI que use 1,000 subprocesos para ejecutar trabajos (cada uno un archivo pequeño o una parte de una copia multiparte) y anticipará 100,000 trabajos:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Después de ejecutarlos, puede usar el comando de sincronización simple de la siguiente manera:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

En una máquina m4.xlarge (en AWS - 4 núcleos, 16 GB de RAM), para mi caso (archivos de 3-50 GB) la velocidad de sincronización / copia pasó de aproximadamente 9.5MiB / sa 700 + MiB / s, un aumento de velocidad de 70x sobre la configuración predeterminada.

Tiempo de volar
fuente
0

En el depósito perdedor, seleccione los archivos que desea copiar a otro depósito.

  • En Acciones, elija 'Copiar'.
  • Ve al cubo de ganancia.
  • En Acciones, elija 'Pegar'
John
fuente
1
¿Por qué repetir una solución que otros han mencionado un año antes?
Benjamin