AWS S3 med Java

1. Introduksjon

I denne opplæringen lærer vi hvordan vi kan samhandle med Amazon S3 (Simple Storage Service) lagringssystem programmatisk, fra Java.

Husk at S3 har en veldig enkel struktur - hver bøtte kan lagre et hvilket som helst antall objekter som er tilgjengelige med enten et SOAP-grensesnitt eller et REST-API.

Fremover bruker vi AWS SDK for Java til å opprette, liste opp og slette S3 bøtter. Vi vil også laste opp, liste opp, laste ned, kopiere, flytte, gi nytt navn og slette objekter i disse bøttene.

2. Maven-avhengigheter

Før vi begynner, må vi erklære AWS SDK-avhengighet i prosjektet vårt:

 com.amazonaws aws-java-sdk 1.11.163 

For å se den nyeste versjonen, sjekk Maven Central.

3. Forutsetninger

For å bruke AWS SDK trenger vi noen få ting:

  1. AWS-konto: vi trenger en Amazon Web Services-konto. Hvis du fremdeles ikke har noen, kan du opprette en konto
  2. AWS sikkerhetsinformasjon: Dette er våre tilgangsnøkler som lar oss ringe programmatiske samtaler til AWS API-handlinger. Vi kan få disse legitimasjonene på to måter, enten ved å bruke AWS root-kontolegitimasjon fra tilgangsnøkkelen på sikkerhetsinformasjonen eller ved å bruke IAM-brukerlegitimasjon fra IAM-konsollen
  3. Velge AWS-region: Vi må velge en AWS-region (er) der vi vil lagre Amazon S3-dataene våre. Husk at S3-lagringsprisene varierer etter region. For mer informasjon, gå til den offisielle dokumentasjonen. For denne opplæringen bruker vi US East (Ohio) (region us-øst-2)

4. Opprette klientforbindelse

Først må vi opprette en klientforbindelse for å få tilgang til Amazon S3 webtjeneste. Vi bruker AmazonS3 grensesnitt for dette formålet:

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

Og konfigurer deretter klienten:

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

5. Amazon S3 bøtteoperasjoner

5.1. Å lage en bøtte

Det er viktig å merke seg at navnet på bøtta deles av alle brukere av systemet. Så bøttenavnet vårt må være unikt på tvers av alle eksisterende bøttenavn i Amazon S3 (vi finner ut hvordan vi kan sjekke det om et øyeblikk).

Dessuten, som spesifisert i den offisielle dokumentasjonen, må Bucket-navnene oppfylle følgende krav:

  • navn skal ikke inneholde understrekninger
  • navnene skal være mellom 3 og 63 tegn lange
  • navn skal ikke ende med en bindestrek
  • navn kan ikke inneholde tilstøtende perioder
  • navn kan ikke inneholde bindestreker ved siden av perioder (f.eks. “my-.bucket.com” og “my.-bucket” er ugyldige)
  • navn kan ikke inneholde store bokstaver

La oss lage en bøtte:

String bucketName = "baeldung-bucket"; if (s3client.doesBucketExist (bucketName)) {LOG.info ("Bucket name is not available." + "Prøv igjen med et annet Bucket-navn."); komme tilbake; } s3client.createBucket (bucketName);

Her bruker vi s3client som vi opprettet i forrige trinn. Før vi oppretter en bøtte, sjekker vi om bøttenavnet vårt er tilgjengelig eller ikke ved hjelp av det doesBucketExist () metode. Hvis dette navnet er tilgjengelig, bruker vi createBucket () metode.

5.2. Listing Bucket

Nå som vi har laget noen få bøtter, la oss nå skrive ut en liste over alle bøttene som er tilgjengelige i vårt S3-miljø ved hjelp av listBøtter () metode. Denne metoden returnerer en liste over alle skuffene:

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

Dette vil liste opp alle skuffene som finnes i vårt S3-miljø:

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

5.3. Slette en bøtte

Det er viktig å sikre at bøtta vår er tom før vi kan slette den. Ellers vil et unntak bli kastet. Vær også oppmerksom på at bare eieren av en bøtte kan slette den uavhengig av tillatelser (tilgangskontrollpolicyer):

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

6. Amazon S3-objektoperasjoner

En fil eller en samling data i Amazon S3-bøtte er kjent som et objekt. Vi kan utføre flere operasjoner på objekter som å laste opp, oppføre, laste ned, kopiere, flytte, gi nytt navn og slette.

6.1. Laster opp objekter

Å laste opp et objekt er en ganske grei prosess. Vi bruker en putObject () metode som godtar tre parametere:

  1. bucketName: Navnet på bøtta der vi vil laste opp objektet
  2. nøkkel: Dette er hele banen til filen
  3. fil: Den faktiske filen som inneholder dataene som skal lastes opp
s3client.putObject (bucketName, "Document / hello.txt", ny fil ("/ Users / user / Document / hello.txt"));

6.2. Oppføring av objekter

Vi bruker listObjects () metode for å liste opp alle tilgjengelige objekter i vår S3-bøtte:

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

Ringer listObjects () metoden for s3client objektet vil gi Objektliste objekt, som kan brukes til å få en liste over alle objektsammendragene i den angitte bøtta. Vi skriver bare ut nøkkelen her, men det er også et par andre alternativer tilgjengelig, som størrelse, eier, sist endret, lagringsklasse osv ...

Dette vil nå skrive ut en liste over alle gjenstandene i bøtta vår:

Dokument / hallo.txt

6.3. Laste ned et objekt

For å laste ned et objekt bruker vi først getObject () metode på s3client som vil returnere en S3Objekt gjenstand. Når vi har fått dette, ringer vi getObjectContent () på dette for å få en S3ObjectInputStream objekt som oppfører seg som et vanlig Java InputStream.

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

Her bruker vi FileUtils.copyInputStreamToFile () metode av Apache Commons. Du kan også besøke denne Baeldung-artikkelen for å utforske andre måter å konvertere en InputStream til en Fil.

6.4. Kopiere, gi nytt navn og flytte et objekt

Vi kan kopiere et objekt ved å ringe copyObject () metode på vår s3client som godtar fire parametere:

  1. kilde bøtte navn
  2. objektnøkkel i kildebøtte
  3. destinasjon bøtte navn (det kan være det samme som kilde)
  4. objektnøkkel i destinasjonsbøtte
s3client.copyObject ("baeldung-bucket", "picture / pic.png", "baeldung-bucket2", "document / picture.png");

Merk: Vi kan bruke en kombinasjon av copyObject () metode deleteObject () for å utføre flytting og endre navn på oppgaver. Dette vil innebære å kopiere objektet først og deretter slette det fra det gamle stedet.

6.5. Slette et objekt

For å slette et objekt, vil vi ringe deleteObject () metode på s3client og send bøttenavnet og objektnøkkelen:

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

6.6. Slette flere objekter

For å slette flere objekter samtidig, oppretter vi først DeleteObjectsRequest motsette deg og gi bøttenavnet til konstruktøren. Så sender vi en matrise med alle objektnøklene vi vil slette.

Når vi har fått dette DeleteObjectsRequest objekt, kan vi overføre det til deleteObjects () metode for vår s3client som argument. Hvis det lykkes, vil dette slette alle objektene vi har levert:

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

7. Konklusjon

I denne artikkelen fokuserte vi på det grunnleggende om å kommunisere med Amazon S3-nettjenesten - både på bøtte og objektnivå.

Som alltid kan den fulle implementeringen av denne opplæringen finnes på Github.


$config[zx-auto] not found$config[zx-overlay] not found