Pregunta ¿La mejor forma de mover archivos entre las cubetas S3?


Me gustaría copiar algunos archivos de un depósito de producción a un cubo de desarrollo a diario.

Por ejemplo: Copiar productionbucket / feed / feedname / date a developmentbucket / feed / feedname / date

Debido a que los archivos que quiero son tan profundos en la estructura de la carpeta, lleva demasiado tiempo ir a cada carpeta y copiar / pegar.

He jugado con unidades de montaje para cada segmento y escribiendo un script de lote de Windows, pero eso es muy lento y descarga innecesariamente todos los archivos / carpetas al servidor local y hace una copia de seguridad nuevamente.


74
2018-03-12 09:56


origen


Respuestas:


Actualizar

Como señalado por alberge (+1), hoy en día el 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 características comandos de nivel superior S3 para tratar su caso de uso específicamente, vea el Referencia de AWS CLI para S3:

  • sincronización - Sincroniza directorios y prefijos S3. Su caso de uso está cubierto por Ejemplo 2 (uso de grano más fino con --exclude, --include y el manejo de prefijos, etc. también está disponible):

    El siguiente comando de sincronización sincroniza objetos bajo un prefijo especificado y un depósito a objetos bajo otro prefijo y cubo especificados al copiar objetos s3. [...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

Para completar, mencionaré que el comandos de nivel inferior S3 también están todavía disponibles a través de la s3api subcomando, que permitiría traducir directamente cualquier solución basada en SDK a la CLI de AWS antes de adoptar finalmente su funcionalidad de nivel superior.


Respuesta inicial

El movimiento de archivos entre segmentos S3 se puede lograr mediante el Objeto PUT - Copiar API (seguido por ELIMINAR objeto)

Esta implementación de la operación PUT crea una copia de un objeto   eso ya está almacenado en Amazon S3. Una operación de copia PUT es la misma   como realizar un GET y luego un PUT. Agregar el encabezado de solicitud   x-amz-copy-source, hace que la operación PUT copie el objeto fuente en   el cubo de destino Fuente

Hay muestras respectivas para todos los SDK de AWS existentes disponibles, consulte Copiar objetos en una sola operación. Naturalmente, una solución basada en scripts sería la primera opción obvia aquí, entonces Copie un objeto utilizando AWS SDK para Ruby podría ser un buen punto de partida; si prefieres Python, lo mismo se puede lograr a través de boto también, por supuesto, ver el método copy_key() dentro de boto Documentación de la API S3.

PUT Object solo copia archivos, por lo que deberá eliminar explícitamente un archivo a través de DELETE Object aún después de una operación de copia exitosa, pero eso será solo unas pocas líneas una vez que el script general maneje los nombres de los depósitos y archivos esté en su lugar (también hay ejemplos respectivos, ver p. Eliminar un objeto por solicitud)


89
2018-03-12 11:32



El nuevo oficial CLI de AWS admite nativamente la mayor parte de la funcionalidad de s3cmd. Anteriormente había estado usando s3cmd o el 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

aws s3 sync s3://oldbucket s3://newbucket

61
2018-01-12 23:55



Para mover / copiar de un cubo a otro o al mismo cubo, uso la herramienta s3cmd y funciona bien. Por ejemplo:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1

25
2018-02-27 09:30



Ejemplo de .NET según lo solicitado:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

con el cliente siendo algo así como

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

Puede haber una manera mejor, pero es solo un código rápido que escribí para que se transfirieran algunos archivos.


12
2018-02-11 12:47



Pasé días escribiendo mi propia herramienta personalizada para paralelizar las copias requeridas para esto, pero luego encontré documentación sobre cómo obtener el comando de sincronización CLI de AWS S3 para sincronizar cubos con paralelización masiva. Los siguientes comandos le indicarán a la CLI de AWS que use 1,000 hilos para ejecutar trabajos (cada uno es un archivo pequeño o una parte de una copia de varias partes) y anticipa 100.000 trabajos:

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

Después de ejecutar esto, 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), en mi caso (archivos de 3-50 GB), la velocidad de sincronización / copia pasó de aproximadamente 9.5Mib a 700+ MiB / s, un aumento de velocidad de 70x sobre la configuración predeterminada.


11
2017-10-26 19:09



Si tiene un host Unix dentro de AWS, entonces use s3cmd desde s3tools.org. Configure los permisos para que su clave tenga acceso de lectura a su cubo de desarrollo. Entonces corre:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname

8
2018-05-16 14:20



Aquí hay una clase de ruby ​​para realizar esto: https://gist.github.com/4080793

Ejemplo de uso:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform

6
2017-11-15 20:02



Para mí, el siguiente comando simplemente funcionó:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive

6
2018-05-17 22:46



En realidad, recientemente utilicé la acción de copiar y pegar en la interfaz AWS s3. Simplemente vaya a los archivos que desea copiar, haga clic en "Acciones" -> "Copiar", navegue hasta el depósito de destino y "Acciones" -> "Pegar"

Transfiere los archivos bastante rápido y parece una solución menos intrincada que no requiere programación, o soluciones exageradas como esa.


5
2017-10-21 21:12