AWS S3 med Java

1. Introduktion

I denne vejledning lærer vi, hvordan man interagerer med Amazon S3 (Simple Storage Service) -lagringssystem programmatisk fra Java.

Husk, at S3 har en meget enkel struktur - hver spand kan gemme et hvilket som helst antal objekter, der er tilgængelige via enten en SOAP-grænseflade eller en REST-API.

Fremover bruger vi AWS SDK til Java til at oprette, liste og slette S3-spande. Vi vil også uploade, liste, downloade, kopiere, flytte, omdøbe og slette objekter i disse spande.

2. Maven-afhængigheder

Inden vi kommer i gang, skal vi erklære AWS SDK-afhængighed i vores projekt:

 com.amazonaws aws-java-sdk 1.11.163 

For at se den nyeste version skal du tjekke Maven Central.

3. Forudsætninger

For at bruge AWS SDK har vi brug for et par ting:

  1. AWS-konto: vi har brug for en Amazon Web Services-konto. Hvis du stadig ikke har nogen, skal du oprette en konto
  2. AWS sikkerhedsoplysninger: Dette er vores adgangsnøgler, der giver os mulighed for at foretage programmatiske opkald til AWS API-handlinger. Vi kan få disse legitimationsoplysninger på to måder, enten ved at bruge AWS root-kontooplysninger fra sektionen med adgangsnøgler på siden med sikkerhedsoplysninger eller ved at bruge IAM-brugerlegitimationsoplysninger fra IAM-konsol
  3. Valg af AWS-region: Vi er nødt til at vælge en AWS-region (er), hvor vi vil gemme vores Amazon S3-data. Husk, at S3-lagerpriser varierer efter region. For flere detaljer, gå over til den officielle dokumentation. Til denne tutorial bruger vi US East (Ohio) (region os-øst-2)

4. Oprettelse af klientforbindelse

Først skal vi oprette en klientforbindelse for at få adgang til Amazon S3-webservice. Vi bruger AmazonS3 interface til dette formål:

AWSCredentials-legitimationsoplysninger = nye BasicAWSCredentials ("", ""); 

Og konfigurer derefter klienten:

AmazonS3 s3client = AmazonS3ClientBuilder .standard () .withCredentials (ny AWSStaticCredentialsProvider (legitimationsoplysninger)) .withRegion (Regions.US_EAST_2) .build ();

5. Amazon S3 bucket-operationer

5.1. Oprettelse af en spand

Det er vigtigt at bemærke, at bucket-navneområdet deles af alle brugere af systemet. Så vores bucket-navn skal være unikt på tværs af alle eksisterende bucket-navne i Amazon S3 (vi finder ud af, hvordan vi kontrollerer det om et øjeblik).

Som specificeret i den officielle dokumentation skal Bucket-navnene desuden overholde følgende krav:

  • navne bør ikke indeholde understregninger
  • navne skal være mellem 3 og 63 tegn lange
  • navne skal ikke ende med en bindestreg
  • navne kan ikke indeholde tilstødende perioder
  • navne kan ikke indeholde bindestreger ved siden af ​​perioder (f.eks. "my-.bucket.com" og "my.-bucket" er ugyldige)
  • navne kan ikke indeholde store bogstaver

Lad os oprette en spand:

String bucketName = "baeldung-bucket"; if (s3client.doesBucketExist (bucketName)) {LOG.info ("Bucket name is not available." + "Prøv igen med et andet Bucket-navn."); Vend tilbage; } s3client.createBucket (bucketName);

Her bruger vi s3client som vi oprettede i det forrige trin. Før vi opretter en spand, kontrollerer vi, om vores spandnavn er tilgængeligt eller ikke ved hjælp af doesBucketExist () metode. Hvis dette navn er tilgængeligt, bruger vi createBucket () metode.

5.2. Listing spande

Nu, hvor vi har oprettet et par spande, lad os nu udskrive en liste over alle de spande, der er tilgængelige i vores S3-miljø ved hjælp af listBuckets () metode. Denne metode returnerer en liste over alle skovle:

Liste spande = s3client.listBuckets (); til (Bucket bucket: bucket) {System.out.println (bucket.getName ()); }

Dette viser alle skovle, der findes i vores S3-miljø:

baeldung-bucket baeldung-bucket-test2 elasticbeanstalk-us-east-2

5.3. Sletning af en spand

Det er vigtigt at sikre, at vores spand er tom, før vi kan slette den. Ellers kastes en undtagelse. Bemærk også, at kun ejeren af ​​en spand kan slette den uanset dens tilladelser (adgangskontrolpolitikker):

prøv {s3client.deleteBucket ("baeldung-bucket-test2"); } fange (AmazonServiceException e) {System.err.println ("e.getErrorMessage ()); return;}

6. Amazon S3-objektfunktioner

En fil eller en samling af data inde i Amazon S3 bucket er kendt som et objekt. Vi kan udføre flere operationer på objekter som at uploade, notere, downloade, kopiere, flytte, omdøbe og slette.

6.1. Upload af objekter

Upload af et objekt er en ret ligetil proces. Vi bruger en putObject () metode, der accepterer tre parametre:

  1. bucketName: Bucket-navnet, hvor vi vil uploade objektet
  2. nøgle: Dette er den fulde sti til filen
  3. fil: Den faktiske fil, der indeholder de data, der skal uploades
s3client.putObject (bucketName, "Document / hello.txt", ny fil ("/ Brugere / bruger / Document / hello.txt"));

6.2. Liste over objekter

Vi bruger listObjects () metode til at liste alle tilgængelige objekter i vores S3-spand:

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

Ringer listObjects () metode til s3client objekt vil give Objektliste objekt, som kan bruges til at få en liste over alle objektsammendragene i den angivne spand. Vi udskriver bare nøglen her, men der er også et par andre muligheder tilgængelige, som størrelse, ejer, sidst ændret, lagerklasse osv ...

Dette udskriver nu en liste over alle objekter inde i vores spand:

Dokument / hej.txt

6.3. Download af et objekt

For at downloade et objekt bruger vi først getObject () metode til s3client som vil returnere en S3Object objekt. Når vi først har fået dette, ringer vi getObjectContent () på dette for at få en S3ObjectInputStream objekt, der opfører sig som en konventionel Java InputStream.

S3Object s3object = s3client.getObject (bucketName, "picture / pic.png"); S3ObjectInputStream inputStream = s3object.getObjectContent (); FileUtils.copyInputStreamToFile (inputStream, ny fil ("/ Brugere / bruger / Desktop / hello.txt"));

Her bruger vi FileUtils.copyInputStreamToFile () metode af Apache Commons. Du kan også besøge denne Baeldung-artikel for at udforske andre måder at konvertere en InputStream til en Fil.

6.4. Kopiering, omdøbning og flytning af et objekt

Vi kan kopiere et objekt ved at ringe copyObject () metode på vores s3client der accepterer fire parametre:

  1. kilde spand navn
  2. objektnøgle i kildespand
  3. destinationsskovens navn (det kan være det samme som kilden)
  4. objektnøgle i destinationsspand
s3client.copyObject ("baeldung-bucket", "picture / pic.png", "baeldung-bucket2", "document / picture.png");

Bemærk: Vi kan bruge en kombination af copyObject () metode deleteObject () til udførelse af flytning og omdøbning af opgaver. Dette involverer først at kopiere objektet og derefter slette det fra dets gamle placering.

6.5. Sletning af et objekt

For at slette et objekt ringer vi deleteObject () metode til s3client og send skovnavn og objektnøgle:

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

6.6. Sletning af flere objekter

For at slette flere objekter på én gang opretter vi først DeleteObjectsRequest objekt og videregive skovlenavnet til dens konstruktør. Derefter passerer vi en matrix med alle objektnøglerne, som vi vil slette.

Når vi har dette DeleteObjectsRequest objekt, kan vi videregive det til deleteObjects () metode til vores s3client som et argument. Hvis det lykkes, slettes dette alle objekter, som vi har leveret:

String objkeyArr [] = {"document / hello.txt", "document / pic.png"}; DeleteObjectsRequest delObjReq = ny DeleteObjectsRequest ("baeldung-bucket") .withKeys (objkeyArr); s3client.deleteObjects (delObjReq);

7. Konklusion

I denne artikel fokuserede vi på det grundlæggende i at interagere med Amazon S3-webservicen - både på spanden og på objektniveau.

Som altid kan den fulde implementering af denne vejledning findes på Github.