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?
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?
Respuestas:
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:
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.
aws s3 sync s3://source s3://destination
encaja?
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
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.
--cross-account-copy
opción ( -C
para 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.
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.