amazon-s3 - servidor - que es simple storage service
¿La mejor forma de mover archivos entre las cubetas S3? (11)
Actualizar
Como señaló alberge (+1), hoy en día la excelente AWS Command Line Interface proporciona el enfoque más versátil para interactuar con (casi) todas las cosas AWS, mientras tanto cubre la mayoría de las API de servicios y también cuenta con comandos S3 de nivel superior para manejar su Específicamente, consulte la referencia de la CLI de AWS para S3 :
- sync - Sincroniza directorios y prefijos S3. Su caso de uso está cubierto por el Ejemplo 2 (también está disponible un uso más detallado con
--include
,--include
y prefix handling, etc.):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 los comandos S3 de nivel inferior también están disponibles a través del sub comando s3api , lo 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
Mover archivos entre segmentos S3 se puede lograr mediante el objeto PUT - Copiar API (seguido por el objeto DELETE ):
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 copiado PUT es lo mismo que realizar un GET y luego un PUT. Al agregar el encabezado de solicitud, x-amz-copy-source, la operación PUT copia el objeto de origen en el depósito de destino. Source
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 secuencias de comandos sería la primera opción obvia aquí, por lo que copiar un objeto utilizando AWS SDK para Ruby podría ser un buen punto de partida; si prefiere Python en su lugar, lo mismo puede lograrse a través de copy_key()
, por supuesto, vea el método copy_key()
dentro de la documentación API de S3 de boto.
PUT Object
solo copia archivos, por lo que tendrá que 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 el cubo y los nombres de archivo estén en su lugar (hay ejemplos respectivos también, ver, por ejemplo, eliminar un objeto por solicitud ).
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.
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
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.
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.
Para mí, el siguiente comando simplemente funcionó:
aws s3 mv s3://bucket/data s3://bucket/old_data --recursive
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
Pasé varios 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.
Sé que este es un hilo viejo, pero para otros que llegan allí, mi sugerencia es crear un trabajo programado para copiar el contenido del cubo de producción al de desarrollo uno.
Puede usar Si usa .NET, este artículo podría ayudarlo
http://www.codewithasp.net/2015/03/aws-s3-copy-object-from-one-bucket-or.html
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
Tuvimos este problema exacto con nuestros trabajos de ETL en Snowplow , por lo que extrajimos nuestro código de copia de archivo paralelo (Ruby, construido encima de Fog ), en su propia gema de Ruby, llamada Sluice:
https://github.com/snowplow/sluice
Sluice también maneja la eliminación, traslado y descarga del archivo S3; todos paralelizados y con reintentos automáticos si una operación falla (lo cual sorprende sorprendentemente). ¡Espero que sea útil!