98 votes

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

Je voudrais copier des fichiers à partir d'une production seau pour un développement seau quotidien.

Par exemple: Copie productionbucket/feed/feedname/date pour developmentbucket/feed/feedname/date

Parce que les fichiers que je veux sont si profonds dans la structure de dossiers, c'est beaucoup trop de temps pour aller à chaque dossier et copier/coller.

J'ai joué un peu avec le montage des disques de chaque compartiment et la rédaction d'un windows script de commandes, mais c'est très lent et il inutilement télécharge tous les fichiers/dossiers sur le serveur local et à nouveau de retour.

116voto

Steffen Opel Points 31067

Mise à jour

Comme l'a souligné alberge (+1), aujourd'hui l'excellente Interface de Ligne de Commande AWS fournit le plus polyvalent approche pour interagir avec (presque) toutes les choses AWS - il pendant ce temps couvre la plupart des services " Api et également des fonctionnalités de plus haut niveau S3 commandes pour traiter votre cas d'utilisation, en particulier, consultez le AWS CLI de référence pour les S3:

  • sync - Synchronisation des répertoires et S3 préfixes. Votre cas est couvert par l'Exemple 2 (plus fine de l'utilisation avec --exclude, --include et un préfixe de manutention etc. est également disponible):

    La suite de la commande sync synchronise les objets sous un préfixe spécifié et un seau pour les objets sous un autre préfixe spécifié et un seau en copiant les objets s3. [...]

    aws s3 sync s3://mybucket s3://mybucket2
    

Pour être complet, je vais mentionner que le niveau inférieur S3 commandes sont également toujours disponibles via le s3api sous commande, ce qui permettrait de traduire directement toute solution basée sur le SDK AWS CLI avant d'adopter son plus haut niveau de fonctionnalités par la suite.


Début De Réponse

Le déplacement de fichiers entre le S3 peut être atteint par des moyens de les METTRE l'Objet - Copie de l'API (suivi de SUPPRIMER l'Objet):

Cette mise en œuvre de l'opération crée une copie d'un objet c'est déjà stockées dans Amazon S3. Une opération de copie est la même le spectacle d'un OBTENEZ et d'un PUT. L'ajout de l'entête de la requête, x-amz-copie-source, effectue l'opération de placement copie de l'objet source dans la destination seau.

Il y a des échantillons respectifs pour tous les AWS Sdk disponibles, voir la Copie d'Objets en une Seule Opération. Naturellement, un script basé solution serait évidente de premier choix ici, donc, de Copier un Objet en Utilisant le SDK AWS pour Ruby pourrait être un bon point de départ; si vous préférez Python au lieu de cela, le même effet peut être obtenu via boto ainsi, bien sûr, voir la méthode copy_key() dans boto du S3 documentation de l'API.

PUT Object seulement des copies de fichiers, de sorte que vous devez explicitement supprimer un fichier via l' DELETE Object encore après le succès de l'opération de copie, mais ce sera juste quelques lignes une fois que l'ensemble de la gestion de scripts le seau et les noms de fichiers est en place (il y a des respectives des exemples, voir, par exemple, de la Suppression d'Un Objet Par Demande).

69voto

alberge Points 2771

La nouvelle AWS CLI officielle prend en charge de manière native la plupart des fonctionnalités de s3cmd . J'avais déjà utilisé s3cmd ou le SDK Ruby AWS pour faire des choses comme celle-ci, 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
 

29voto

sgimeno Points 740

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
 

14voto

Matt Dell Points 1749

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.

9voto

dk. Points 862

Si vous avez un hôte Unix dans AWS, utilisez s3cmd à partir de s3tools.org. Configurez les autorisations pour 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X