web-dev-qa-db-fra.com

Téléchargement du dernier fichier dans un compartiment S3 à l'aide de l'AWS CLI?

J'ai un compartiment S3 qui contient des sauvegardes de base de données. Je suis en train de créer un script que je voudrais télécharger la dernière sauvegarde (et éventuellement le restaurer ailleurs), mais je ne sais pas comment s'y prendre uniquement pour récupérer le fichier le plus récent dans un compartiment.

Est-il possible de copier uniquement le fichier le plus récent d'un compartiment s3 vers un répertoire local à l'aide des outils AWS CLI?

22
Abe Miessler

C'est une approche que vous pouvez adopter.

Vous pouvez répertorier tous les objets du compartiment avec aws s3 ls $BUCKET --recursive:

$ aws s3 ls $BUCKET --recursive
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object
2015-04-29 12:09:29      32768 yet-another-object.sh

Ils sont triés alphabétiquement par clé, mais cette première colonne correspond à la dernière modification. Un rapide sort les réorganisera par date:

$ aws s3 ls $BUCKET --recursive | sort
2015-04-29 12:09:29      32768 yet-another-object.sh
2015-05-05 15:36:17          4 an_object.txt
2015-06-08 14:14:44   16322599 some/other/object

tail -n 1 sélectionne la dernière ligne et awk '{print $4}' extrait la quatrième colonne (le nom de l'objet).

$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object

Enfin et surtout, déposez-le dans aws s3 cp pour télécharger l'objet:

$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object
39
error2007s

Et voici un script bash créé basé sur la réponse de @ error2007s. Ce script requiert votre profil aws et le nom du compartiment en tant que variables et télécharge le dernier objet dans votre dossier ~/Downloads:

#!/bin/sh
PROFILE=your_profile
BUCKET=your_bucket

OBJECT="$(aws s3 ls --profile $PROFILE $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}')"
aws s3 cp s3://$BUCKET/$OBJECT ~/Downloads/$OBJECT --profile $PROFILE
5
JBaczuk

Les solutions ci-dessus sont pour Bash si l'on veut faire la même chose dans Powershell pour le téléchargement dans Windows en utilisant le script suivant:

$s3location = 's3://bucket/'
$filename=C:\Progra~1\Amazon\AWSCLI\aws.exe s3 ls s3://bucket/PROD_FULL/ -- 
recursive | sort |select -last 3 
$Dpath='I:\Data_S3'

foreach($files in $filename)
{
#$files.ToString()
$testpath1 = Split-Path $path -leaf
$testpath1
$path=$s3location+$files

C:\Progra~1\Amazon\AWSCLI\aws.exe s3 cp $path $Dpath
echo(" ***Files Downloaded ***")

}
0
Nikki Ganju