web-dev-qa-db-fra.com

Le meilleur moyen de déplacer des fichiers entre des compartiments S3?

J'aimerais copier quotidiennement des fichiers d'un compartiment de production dans un compartiment de développement.

Par exemple: Copier productionbucket/feed/feedname/date dans developmentbucket/feed/feedname/date

Parce que les fichiers que je veux sont si profonds dans la structure des dossiers, il est trop fastidieux d’aller dans chaque dossier et de les copier/coller.

J'ai joué avec le montage de lecteurs sur chaque compartiment et l'écriture d'un script batch Windows, mais cela est très lent et le logiciel télécharge inutilement tous les fichiers/dossiers sur le serveur local et effectue une nouvelle sauvegarde.

83
Matt Dell

Mise à jour

Comme signalé par alberge (+1), l'excellent interface de ligne de commande AWS offre l'approche la plus polyvalente pour interagir avec (presque) tout ce qui se trouve à AWS - il couvre en revanche la plupart API de services et fonctionnalités commandes S3 de niveau supérieur permettant de traiter votre cas d'utilisation de manière spécifique, consultez le référence de l'AWS CLI pour S :

  • sync - Synchronise les répertoires et les préfixes S3. Votre cas d'utilisation est couvert par Exemple 2 (plus Une utilisation à grain fin avec --exclude, --include et la gestion des préfixes, etc. est également disponible):

    La commande de synchronisation suivante synchronise les objets sous un préfixe et un compartiment spécifiés avec des objets situés sous un autre préfixe et un compartiment spécifiés en copiant les objets s3. [...]

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

Pour être complet, je mentionnerai que les commandes de niveau inférieur S3 sont également disponibles via la sous-commande s3api , qui permettre de traduire directement toute solution basée sur un SDK sur l'AWS CLI avant d'adopter éventuellement ses fonctionnalités de niveau supérieur.


Réponse initiale

Le déplacement de fichiers entre des compartiments S3 peut être réalisé à l'aide de PUT Object - Copy API (suivi de DELETE Object ):

Cette implémentation de l'opération PUT crée une copie d'un objet déjà stocké dans Amazon S3. Une opération de copie PUT revient à effectuer une opération GET puis une opération PUT. L'ajout de l'en-tête de la demande, x-amz-copy-source, permet à l'opération PUT de copier l'objet source dans le compartiment de destination. Source

Des exemples respectifs sont disponibles pour tous les kits SDK AWS existants, voir Copie d'objets en une seule opération . Naturellement, une solution basée sur les scripts serait le premier choix évident ici, donc Copier un objet à l'aide du kit AWS SDK pour Ruby peut constituer un bon point de départ; si vous préférez Python au lieu de cela, vous pouvez obtenir la même chose via boto , bien sûr, voir la méthode copy_key() dans boto's S3 Documentation API .

PUT Object Ne copie que les fichiers; vous devrez donc supprimer explicitement un fichier via DELETE Object, Même après une opération de copie réussie. Toutefois, il ne restera que quelques lignes une fois que le script global gérant les noms de fichiers sont en place (il existe également des exemples respectifs, voir par exemple Suppression d'un objet par demande ).

103
Steffen Opel

Le nouvel officiel AWS CLI prend en charge la plupart des fonctionnalités de s3cmd. J'avais déjà utilisé s3cmd ou le Ruby AWS SDK pour procéder de la sorte, mais la CLI officielle fonctionne très bien pour cela.

http://docs.aws.Amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket
65
A B

Pour déplacer/copier d'un seau à un autre ou au même seau, j'utilise l'outil s3cmd et fonctionne bien. Par exemple:

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

J'ai passé des jours à écrire mon propre outil personnalisé pour paralléliser les copies requises à cet effet, mais j'ai ensuite rencontré la documentation sur comment obtenir la commande de synchronisation AWS S3 CLI pour synchroniser les compartiments avec une parallélisation massive . Les commandes suivantes indiqueront à l'AWS CLI d'utiliser 1 000 threads pour exécuter des travaux (chacun un petit fichier ou une partie d'une copie multipart) et d'anticiper 100 000 travaux:

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

Après les avoir exécutées, vous pouvez utiliser la commande de synchronisation simple comme suit:

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

Sur une machine m4.xlarge (dans AWS - 4 cœurs, 16 Go de RAM), dans mon cas (fichiers de 3 à 50 Go), la vitesse de synchronisation/copie est passée d’environ 9,5 Mo/s à 700 + MiB/s, soit une augmentation de la vitesse de 70 fois la configuration par défaut.

Mise à jour: Notez que S3CMD a été mis à jour au fil des ans et que ces modifications ne sont désormais efficaces que lorsque vous travaillez avec beaucoup de petits fichiers. Notez également que S3CMD sous Windows (uniquement sous Windows) est sérieusement limité en termes de débit global et ne peut atteindre que 3 Gbps par processus, quelle que soit la taille de l'instance ou les paramètres que vous utilisez. D'autres systèmes comme S5CMD ont le même problème. J'en ai parlé à l'équipe S3 et ils se sont penchés sur la question.

18
James

Exemple .NET à la demande:

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);
    }
}

avec le client étant quelque chose comme

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

Il y a peut-être un meilleur moyen, mais c'est juste un code rapide que j'ai écrit pour transférer des fichiers.

13
Matt Dell

Si vous avez un hôte Unix dans AWS, utilisez s3cmd à partir de s3tools.org. Configurez les autorisations de sorte que votre clé soit un accès en lecture à votre compartiment de développement. Puis lancez:

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

Pour moi, la commande suivante vient de fonctionner:

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

Voici une classe Ruby pour effectuer ceci: https://Gist.github.com/408079

Exemple d'utilisation:

$ 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
7
bantic

En fait, récemment, je viens d'utiliser l'action copier + coller dans l'interface AWS s3. Il vous suffit de naviguer vers les fichiers que vous souhaitez copier, de cliquer sur "Actions" -> "Copier", puis sur le compartiment de destination et "Actions" -> "Coller".

Il transfère les fichiers assez rapidement et cela ressemble à une solution moins compliquée qui ne nécessite aucune programmation, ni sur les meilleures solutions comme celle-là.

6
Justin Workman

Nous avions exactement ce problème avec nos travaux ETL à Snowplow , nous avons donc extrait notre code de copie de fichier parallèle (Ruby, construit au-dessus de Fog ), dans son propre Ruby gemme, appelé Sluice:

https://github.com/snowplow/sluice

Sluice gère également la suppression, le déplacement et le téléchargement de fichiers S3; tous sont parallélisés et réessayent automatiquement en cas d'échec d'une opération (ce qui est étonnamment souvent le cas). J'espère que c'est utile!

4
Alex Dean

Je sais que c’est un vieux fil conducteur, mais pour les autres, j’ai suggéré de créer un travail planifié pour copier le contenu du seau de production vers celui de développement.

Vous pouvez utiliser Si vous utilisez .NET cet article pourrait vous aider

https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/

1
Nikhil Gaur