Actualizar
Como lo señaló alberge (+1), hoy en día, la excelente interfaz de línea de comandos de AWS proporciona el enfoque más versátil para interactuar con (casi) todas las cosas de AWS; mientras tanto, cubre la mayoría de las API de servicios y también presenta comandos S3 de nivel superior para tratar con su caso de uso específicamente, consulte la referencia de AWS CLI para S3 :
- sync : sincroniza directorios y prefijos S3. Su caso de uso está cubierto por el Ejemplo 2 (más bien granuloso uso con
--exclude
, --include
y gastos de prefijo etc. también está disponible):
El siguiente comando de sincronización sincroniza los objetos con un prefijo y un depósito especificados con los objetos con otro prefijo y un depósito especificados mediante la copia de los objetos s3. [...]
aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
Para completar, mencionaré que los comandos S3 de nivel inferior también están disponibles a través del subcomando s3api , lo que permitiría traducir directamente cualquier solución basada en SDK a la AWS CLI antes de adoptar eventualmente su funcionalidad de nivel superior.
Respuesta inicial
El movimiento de archivos entre depósitos de S3 se puede lograr mediante la API PUT Object - Copy (seguida de DELETE Object ):
Esta implementación de la operación PUT crea una copia de un objeto que ya está almacenado en Amazon S3. Una operación de copia PUT es lo mismo que realizar una GET y luego una PUT. Agregar el encabezado de la solicitud, x-amz-copy-source, hace que la operación PUT copie el objeto de origen en el depósito de destino. Fuente
Hay muestras respectivas para todos los SDK de AWS existentes disponibles; consulte Copia de objetos en una sola operación . Naturalmente, una solución basada en secuencias de comandos sería la primera opción obvia aquí, por lo que Copiar un objeto con AWS SDK para Ruby podría ser un buen punto de partida; Si prefiere Python en su lugar, también se puede lograr lo mismo a través de boto , por supuesto, consulte el método copy_key()
en la documentación de la API de S3 de boto .
PUT Object
solo copia archivos, por lo que deberá eliminar explícitamente un archivo a través de DELETE Object
todavía después de una operación de copia exitosa, pero serán solo unas pocas líneas más una vez que el script general que maneja el depósito y los nombres de archivo esté en su lugar (también hay ejemplos respectivos , consulte, por ejemplo, Eliminar un objeto por solicitud ).
La nueva AWS CLI oficial admite de forma nativa la mayor parte de la funcionalidad de
s3cmd
. Anteriormente había estado usandos3cmd
ruby AWS SDK para hacer cosas como esta, pero la CLI oficial funciona muy bien para esto.http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
fuente
aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 &
thegeekstuff.com/2010/12/5-ways-to-execute-linux-commandPara mover / copiar de un cubo a otro o al mismo cubo, uso la herramienta s3cmd y funciona bien. Por ejemplo:
fuente
Pasé días escribiendo mi propia herramienta personalizada para paralelizar las copias necesarias para esto, pero luego encontré documentación sobre cómo obtener el comando de sincronización de la CLI de AWS S3 para sincronizar depósitos con paralelización masiva . Los siguientes comandos le dirán a la AWS CLI que use 1,000 subprocesos para ejecutar trabajos (cada uno de ellos es un archivo pequeño o una parte de una copia de varias partes) y anticipa 100,000 trabajos:
Después de ejecutarlos, puede usar el comando de sincronización simple de la siguiente manera:
En una máquina m4.xlarge (en AWS - 4 núcleos, 16 GB de RAM), para mi caso (archivos de 3 a 50 GB) la velocidad de sincronización / copia pasó de aproximadamente 9,5 MiB / sa 700 + MiB / s, un aumento de velocidad de 70 veces superior a la configuración predeterminada.
Actualización: tenga en cuenta que S3CMD se ha actualizado a lo largo de los años y estos cambios ahora solo son efectivos cuando se trabaja con muchos archivos pequeños. También tenga en cuenta que S3CMD en Windows (solo en Windows) está seriamente limitado en el rendimiento general y solo puede alcanzar alrededor de 3Gbps por proceso sin importar el tamaño de instancia o la configuración que use. Otros sistemas como S5CMD tienen el mismo problema. Hablé con el equipo de S3 sobre esto y lo están investigando.
fuente
Ejemplo de .NET según lo solicitado:
con el cliente siendo algo como
Puede que haya una forma mejor, pero es solo un código rápido que escribí para transferir algunos archivos.
fuente
Si tiene un host Unix dentro de AWS, utilice s3cmd de s3tools.org. Configure los permisos para que su clave tenga acceso de lectura a su depósito de desarrollo. Entonces corre:
fuente
s3cmd cp
no acepta la--skip-existing
opción, sin embargo, puede ejecutarlos3cmd sync
con omitir existentePara mí, el siguiente comando simplemente funcionó:
fuente
Aquí hay una clase ruby para realizar esto: https://gist.github.com/4080793
Uso de ejemplo:
fuente
En realidad, recientemente solo uso la acción copiar + pegar en la interfaz de AWS s3. Simplemente navegue hasta los archivos que desea copiar, haga clic en "Acciones" -> "Copiar", luego navegue hasta el depósito de destino y "Acciones" -> "Pegar"
Transfiere los archivos bastante rápido y parece una solución menos complicada que no requiere ninguna programación, o soluciones superiores como esa.
fuente
Tuvimos este problema exacto con nuestros trabajos ETL en Snowplow , así que extrajimos nuestro código de copia de archivo paralelo (Ruby, construido sobre Fog ), en su propia gema Ruby, llamada Sluice:
https://github.com/snowplow/sluice
Sluice también se encarga de eliminar, mover y descargar archivos S3; todo en paralelo y con reintento automático si falla una operación (lo que ocurre sorprendentemente a menudo). ¡Espero que sea de utilidad!
fuente
Sé que este es un hilo antiguo, pero para otros que lleguen allí, mi sugerencia es crear un trabajo programado para copiar el contenido del depósito de producción al de desarrollo.
Puede usar Si usa .NET, este artículo podría ayudarlo
https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/
fuente
Para la nueva versión aws2.
fuente