Mettre à jour
Comme le souligne alberge (+1), de nos jours, l'excellente interface de ligne de commande AWS offre l'approche la plus polyvalente pour interagir avec (presque) tout ce qui concerne AWS - elle couvre la plupart des API de services et propose également des commandes S3 de plus haut niveau pour gérer votre cas d'utilisation spécifique, consultez la référence AWS CLI pour S3 :
- sync - Synchronise les répertoires et les préfixes S3. Votre cas d'utilisation est couvert par l' exemple 2 (une utilisation plus fine 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 spécifié et un compartiment avec des objets sous un autre préfixe et compartiment spécifié en copiant des objets s3. [...]
aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
Pour être complet, je mentionnerai que les commandes S3 de niveau inférieur sont également toujours disponibles via la sous-commande s3api , ce qui permettrait de traduire directement toute solution basée sur le SDK vers l'AWS CLI avant d'adopter éventuellement sa fonctionnalité de niveau supérieur.
Réponse initiale
Le déplacement de fichiers entre les compartiments S3 peut être réalisé au moyen de PUT Object - Copy API (suivi de DELETE Object ):
Cette implémentation de l'opération PUT crée une copie d'un objet qui est déjà stocké dans Amazon S3. Une opération de copie PUT équivaut à effectuer un GET puis un PUT. L'ajout de l'en-tête de demande, x-amz-copy-source, permet à l'opération PUT de copier l'objet source dans le compartiment de destination. La source
Il existe des exemples respectifs pour tous les kits SDK AWS existants, consultez Copie d'objets en une seule opération . Naturellement, une solution basée sur des scripts serait le premier choix évident ici, donc Copier un objet à l'aide du kit AWS SDK pour Ruby pourrait être un bon point de départ; si vous préférez Python à la place, la même chose peut être obtenue via boto bien sûr, voir la méthode copy_key()
dans la documentation de l'API S3 de boto .
PUT Object
copie uniquement les fichiers, vous devrez donc supprimer explicitement un fichier via DELETE Object
encore après une opération de copie réussie, mais ce ne sera que quelques lignes supplémentaires une fois que le script global gérant le bucket et les noms de fichiers sera en place (il existe également des exemples respectifs , voir par exemple Suppression d'un objet par requête ).
La nouvelle interface de ligne de commande AWS officielle prend en charge nativement la plupart des fonctionnalités de
s3cmd
. J'avais précédemment utilisés3cmd
ou le kit de développement logiciel 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
la source
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-commandPour déplacer / copier d'un seau à un autre ou au même seau, j'utilise l'outil s3cmd et fonctionne très bien. Par exemple:
la source
J'ai passé des jours à écrire mon propre outil personnalisé pour paralléliser les copies requises pour cela, mais j'ai ensuite parcouru la documentation sur la façon d'obtenir la commande de synchronisation de l'AWS S3 CLI pour synchroniser les buckets avec une parallélisation massive . Les commandes suivantes indiqueront à l'AWS CLI d'utiliser 1 000 threads pour exécuter des tâches (chacune un petit fichier ou une partie d'une copie en plusieurs parties) et anticiper 100 000 tâches:
Après les avoir exécutés, vous pouvez utiliser la commande de synchronisation simple comme suit:
Sur une machine m4.xlarge (dans AWS - 4 cœurs, 16 Go de RAM), pour mon cas (fichiers de 3 à 50 Go), la vitesse de synchronisation / copie est passée d'environ 9,5 Mio / s à 700 + Mio / s, soit une augmentation de vitesse de 70x sur 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 effectives que lorsque vous travaillez avec beaucoup de petits fichiers. Notez également que S3CMD sur Windows (uniquement sur Windows) est sérieusement limité en débit global et ne peut atteindre qu'environ 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 l'examinent.
la source
Exemple .NET comme demandé:
le client étant quelque chose comme
Il y a peut-être un meilleur moyen, mais c'est juste un code rapide que j'ai écrit pour transférer certains fichiers.
la source
Si vous avez un hôte Unix dans AWS, utilisez s3cmd depuis s3tools.org. Configurez les autorisations afin que votre clé soit un accès en lecture à votre bucket de développement. Puis exécutez:
la source
s3cmd cp
n'accepte pas l'--skip-existing
option, vous pouvez cependant exécuter à las3cmd sync
place avec skip existantPour moi, la commande suivante a fonctionné:
la source
Voici une classe ruby pour effectuer ceci: https://gist.github.com/4080793
Exemple d'utilisation:
la source
En fait, récemment, j'utilise simplement l'action copier-coller dans l'interface AWS s3. Naviguez simplement vers les fichiers que vous souhaitez copier, cliquez sur "Actions" -> "Copier" puis accédez au bucket de destination et "Actions" -> "Coller"
Il transfère les fichiers assez rapidement et cela semble être une solution moins compliquée qui ne nécessite aucune programmation, ou des solutions hors pair comme celle-là.
la source
Nous avons eu ce problème exact avec nos travaux ETL chez Snowplow , nous avons donc extrait notre code de copie de fichier parallèle (Ruby, construit au-dessus de Fog ), dans sa propre gemme Ruby, appelée Sluice:
https://github.com/snowplow/sluice
Sluice gère également la suppression, le déplacement et le téléchargement de fichiers S3; tous parallélisés et avec réessai automatique si une opération échoue (ce qu'elle fait étonnamment souvent). J'espère que c'est utile!
la source
Je sais qu'il s'agit d'un ancien fil de discussion, mais pour les autres qui y parviennent, ma suggestion est 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 peut vous aider
https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/
la source
Pour la nouvelle version aws2.
la source