AWS S3 avec Java

AWS S3 avec Java

1. introduction

Dans ce didacticiel, nous allons apprendre à interagir avec le système de stockage Amazon S3 (Simple Storage Service) par programmation, à partir de Java.

N'oubliez pas que S3 a une structure très simple: chaque compartiment peut stocker un nombre illimité d'objets auxquels vous pouvez accéder à l'aide d'une interface SOAP ou d'une API de style REST.

À l'avenir, nous utiliserons le kit AWS SDK pour Java pour créer, répertorier et supprimer des compartiments S3. Nous allons également importer, répertorier, télécharger, copier, déplacer, renommer et supprimer des objets dans ces buckets.

2. Dépendances Maven

Avant de commencer, nous devons déclarer la dépendance du kit SDK AWS dans notre projet:


    com.amazonaws
    aws-java-sdk
    1.11.163

Pour afficher la dernière version, cochezMaven Central.

3. Conditions préalables

Pour utiliser AWS SDK, nous avons besoin de quelques éléments:

  1. AWS Account: nous avons besoin d'un compte Amazon Web Services. Si vous n'en avez toujours pas, allez-y etcreate an account

  2. AWS Security Credentials: Ce sont nos clés d'accès qui nous permettent d'effectuer des appels programmatiques aux actions d'API AWS. Nous pouvons obtenir ces informations d'identification de deux manières, soit en utilisant les informations d'identification du compte racine AWS à partir de la section des clés d'accès dehttps://console.aws.amazon.com/iam/home?security_credential[Security Credentials] page or by using IAM user credentials from https://console.aws.amazon.com/iam/home? [console IAM]

  3. Choosing AWS Region: Nous devons sélectionner une ou plusieurs régions AWS dans lesquelles nous voulons stocker nos données Amazon S3. Gardez à l'esprit que les prix de stockage S3 varient selon les régions. Pour plus de détails, rendez-vous sur lesofficial documentation. Pour ce didacticiel, nous utiliserons US East (Ohio) (regionus-east-2)

4. Création de la connexion client

Tout d'abord, nous devons créer une connexion client pour accéder au service Web Amazon S3. Nous utiliserons l’interface deAmazonS3à cette fin:

AWSCredentials credentials = new BasicAWSCredentials(
  "",
  ""
);

Et puis configurez le client:

AmazonS3 s3client = AmazonS3ClientBuilder
  .standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion(Regions.US_EAST_2)
  .build();

5. Opérations de compartiment Amazon S3

5.1. Création d'un compartiment

Il est important de noter que l'espace de noms du bucket est partagé par tous les utilisateurs du système. So our bucket name must be unique across all existing bucket names in Amazon S3 (nous verrons comment vérifier cela dans un instant).

De plus, comme spécifié dansthe official documentation, les noms de bucket doivent respecter les exigences suivantes:

  • les noms ne doivent pas contenir de soulignement

  • les noms doivent comporter entre 3 et 63 caractères

  • les noms ne doivent pas se terminer par un tiret

  • les noms ne peuvent pas contenir de périodes adjacentes

  • les noms ne peuvent pas contenir de tirets à côté des points (par exemple, «my-.bucket.com» et «my.-bucket» sont invalides)

  • les noms ne peuvent pas contenir de caractères majuscules

Créons un bucket:

String bucketName = "example-bucket";

if(s3client.doesBucketExist(bucketName)) {
    LOG.info("Bucket name is not available."
      + " Try again with a different Bucket name.");
    return;
}

s3client.createBucket(bucketName);

Ici, nous utilisons less3client que nous avons créés à l'étape précédente. Avant de créer un bucket, nous vérifions si le nom de notre bucket est disponible ou non à l'aide de la méthodedoesBucketExist(). Si ce nom est disponible, nous utiliserons la méthodecreateBucket().

5.2. Liste des seaux

Maintenant que nous avons créé quelques compartiments, imprimons maintenant une liste de tous les compartiments disponibles dans notre environnement S3 à l'aide de la méthodelistBuckets(). Cette méthode retournera une liste de tous les Buckets:

List buckets = s3client.listBuckets();
for(Bucket bucket : buckets) {
    System.out.println(bucket.getName());
}

Ceci listera tous les compartiments présents dans notre environnement S3:

example-bucket
example-bucket-test2
elasticbeanstalk-us-east-2

5.3. Supprimer un bucket

It’s important to ensure that our bucket is empty before we can delete it. Sinon, une exception sera levée. Notez également que seul le propriétaire d'un compartiment peut le supprimer, quelles que soient ses autorisations (stratégies de contrôle d'accès):

try {
    s3client.deleteBucket("example-bucket-test2");
} catch (AmazonServiceException e) {
    System.err.println("e.getErrorMessage());
    return;
}

6. Opérations sur les objets Amazon S3

Un fichier ou une collection de données dans le compartiment Amazon S3 est appelé un objet. Nous pouvons effectuer plusieurs opérations sur des objets tels que le téléchargement, la liste, le téléchargement, la copie, le déplacement, le changement de nom et la suppression.

6.1. Téléchargement d'objets

Le téléchargement d'un objet est un processus assez simple. Nous utiliserons une méthodeputObject() qui accepte trois paramètres:

  1. bucketName: le nom du compartiment dans lequel nous voulons télécharger l'objet

  2. key: il s'agit du chemin d'accès complet au fichier

  3. file: le fichier réel contenant les données à télécharger

s3client.putObject(
  bucketName,
  "Document/hello.txt",
  new File("/Users/user/Document/hello.txt")
);

6.2. Liste des objets

Nous utiliserons la méthodelistObjects() pour répertorier tous les objets disponibles dans notre compartiment S3:

ObjectListing objectListing = s3client.listObjects(bucketName);
for(S3ObjectSummary os : objectListing.getObjectSummaries()) {
    LOG.info(os.getKey());
}

L'appel de la méthodelistObjects() de l'objets3client donnera l'objetObjectListing, qui peut être utilisé pour obtenir une liste de tous les résumés d'objets dans le compartiment spécifié. Nous imprimons simplement la clé ici, mais il y a aussi quelques autres options disponibles, comme la taille, le propriétaire, la dernière modification, la classe de stockage, etc.

Cela va maintenant imprimer une liste de tous les objets dans notre compartiment:

Document/hello.txt

6.3. Téléchargement d'un objet

Pour télécharger un objet, nous allons d'abord utiliser la méthodegetObject() surs3client qui renverra un objetS3Object. Une fois que nous obtenons cela, nous appelleronsgetObjectContent() dessus pour obtenir un objetS3ObjectInputStream qui se comporte comme un JavaInputStream. conventionnel

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png");
S3ObjectInputStream inputStream = s3object.getObjectContent();
FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

Ici, nous utilisons la méthodeFileUtils.copyInputStreamToFile() d'Apache Commons. Vous pouvez également visiterthis example article pour explorer d'autres façons de convertir unInputStream enFile.

6.4. Copier, renommer et déplacer un objet

Nous pouvons copier un objet en appelant la méthodecopyObject() sur notres3client qui accepte quatre paramètres:

  1. nom du compartiment source

  2. clé d'objet dans le compartiment source

  3. nom du compartiment de destination (il peut être identique à la source)

  4. clé d'objet dans le compartiment de destination

s3client.copyObject(
  "example-bucket",
  "picture/pic.png",
  "example-bucket2",
  "document/picture.png"
);

Remarque: nous pouvons utiliser une combinaison de la méthodecopyObject()deleteObject() pour effectuer des tâches de déplacement et de changement de nom. Cela impliquera de copier d'abord l'objet, puis de le supprimer de son ancien emplacement.

6.5. Supprimer un objet

Pour supprimer un objet, nous allons appeler la méthodedeleteObject() surs3client et transmettre le nom du bucket et la clé d'objet:

s3client.deleteObject("example-bucket","picture/pic.png");

6.6. Suppression de plusieurs objets

Pour supprimer plusieurs objets à la fois, nous allons d'abord créer l'objetDeleteObjectsRequest et transmettre le nom du bucket à son constructeur. Ensuite, nous passerons un tableau de toutes les clés d'objet que nous voulons supprimer.

Une fois que nous avons cet objetDeleteObjectsRequest, nous pouvons le passer à la méthodedeleteObjects() de notres3client comme argument. En cas de succès, tous les objets fournis seront supprimés:

String objkeyArr[] = {
  "document/hello.txt",
  "document/pic.png"
};

DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("example-bucket")
  .withKeys(objkeyArr);
s3client.deleteObjects(delObjReq);

7. Conclusion

Dans cet article, nous nous sommes concentrés sur les bases de l'interaction avec le service Web Amazon S3 - à la fois au niveau du compartiment et au niveau de l'objet.

Comme toujours, l'implémentation complète de ce tutoriel peut être trouvéeover on Github.