AWS S3 mit Java

AWS S3 mit Java

1. Einführung

In diesem Tutorial erfahren Sie, wie Sie programmgesteuert mit dem Amazon S3-Speichersystem (Simple Storage Service) von Java aus interagieren.

Denken Sie daran, dass S3 eine sehr einfache Struktur hat - jeder Bucket kann eine beliebige Anzahl von Objekten speichern, auf die über eine SOAP-Schnittstelle oder eine API im REST-Stil zugegriffen werden kann.

In Zukunft verwenden wir das AWS SDK für Java, um S3-Buckets zu erstellen, aufzulisten und zu löschen. Wir werden auch Objekte in diesen Buckets hochladen, auflisten, herunterladen, kopieren, verschieben, umbenennen und löschen.

2. Maven-Abhängigkeiten

Bevor wir beginnen, müssen wir die AWS SDK-Abhängigkeit in unserem Projekt deklarieren:


    com.amazonaws
    aws-java-sdk
    1.11.163

Aktivieren SieMaven Central, um die neueste Version anzuzeigen.

3. Voraussetzungen

Um AWS SDK verwenden zu können, benötigen wir einige Dinge:

  1. AWS Account: benötigen wir ein Amazon Web Services-Konto. Wenn Sie noch keine haben, fahren Sie fort undcreate an account

  2. AWS Security Credentials: Dies sind unsere Zugriffsschlüssel, mit denen wir programmgesteuert AWS-API-Aktionen aufrufen können. Wir können diese Anmeldeinformationen auf zwei Arten abrufen, entweder indem wir die Anmeldeinformationen des AWS-Stammkontos aus dem Abschnitt "Zugriffsschlüssel" vonhttps://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? [IAM-Konsole] verwenden.

  3. Choosing AWS Region: Wir müssen eine oder mehrere AWS-Regionen auswählen, in denen wir unsere Amazon S3-Daten speichern möchten. Beachten Sie, dass die Preise für S3-Speicher je nach Region variieren. Weitere Informationen finden Sie unterofficial documentation. Für dieses Tutorial verwenden wir US East (Ohio) (Regionus-east-2).

4. Client-Verbindung erstellen

Zunächst müssen wir eine Client-Verbindung herstellen, um auf den Amazon S3-Webdienst zugreifen zu können. Zu diesem Zweck verwenden wir die Schnittstelle vonAmazonS3:

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

Und dann konfigurieren Sie den Client:

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

5. Amazon S3-Bucket-Operationen

5.1. Einen Eimer erstellen

Es ist wichtig zu beachten, dass der Bucket-Namespace von allen Benutzern des Systems gemeinsam genutzt wird. So our bucket name must be unique across all existing bucket names in Amazon S3 (wir werden gleich herausfinden, wie wir das überprüfen können).

Darüber hinaus müssen die Bucket-Namen, wie inthe official documentation angegeben, die folgenden Anforderungen erfüllen:

  • Namen dürfen keine Unterstriche enthalten

  • Namen sollten zwischen 3 und 63 Zeichen lang sein

  • Namen sollten nicht mit einem Bindestrich enden

  • Namen dürfen keine angrenzenden Punkte enthalten

  • Namen dürfen keine Bindestriche neben Punkten enthalten (z. B. "my-.bucket.com" und "my.-bucket" sind ungültig)

  • Namen dürfen keine Großbuchstaben enthalten

Erstellen wir einen Eimer:

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);

Hier verwenden wirs3client, die wir im vorherigen Schritt erstellt haben. Bevor wir einen Bucket erstellen, prüfen wir mithilfe derdoesBucketExist()-Methode, ob unser Bucket-Name verfügbar ist oder nicht. Wenn dieser Name verfügbar ist, verwenden wir diecreateBucket()-Methode.

5.2. Listing Buckets

Nachdem wir einige Buckets erstellt haben, drucken wir jetzt eine Liste aller in unserer S3-Umgebung verfügbaren Buckets mit der MethodelistBuckets(). Diese Methode gibt eine Liste aller Buckets zurück:

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

Dies listet alle Buckets auf, die in unserer S3-Umgebung vorhanden sind:

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

5.3. Einen Bucket löschen

It’s important to ensure that our bucket is empty before we can delete it. Andernfalls wird eine Ausnahme ausgelöst. Beachten Sie außerdem, dass nur der Eigentümer eines Buckets ihn ungeachtet seiner Berechtigungen löschen kann (Zugriffssteuerungsrichtlinien):

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

6. Amazon S3-Objektoperationen

Eine Datei oder eine Sammlung von Daten in einem Amazon S3-Bucket wird als Objekt bezeichnet. Wir können verschiedene Vorgänge für Objekte ausführen, z. B. Hochladen, Auflisten, Herunterladen, Kopieren, Verschieben, Umbenennen und Löschen.

6.1. Objekte hochladen

Das Hochladen eines Objekts ist ein ziemlich einfacher Vorgang. Wir verwenden eineputObject()-Methode, die drei Parameter akzeptiert:

  1. bucketName: Der Bucket-Name, in den das Objekt hochgeladen werden soll

  2. key: Dies ist der vollständige Pfad zur Datei

  3. file: Die tatsächliche Datei mit den hochzuladenden Daten

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

6.2. Objekte auflisten

Wir verwenden die MethodelistObjects(), um alle verfügbaren Objekte in unserem S3-Bucket aufzulisten:

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

Wenn Sie die MethodelistObjects()des Objektss3clientaufrufen, erhalten Sie das ObjektObjectListing, mit dem eine Liste aller Objektzusammenfassungen im angegebenen Bucket abgerufen werden kann. Wir drucken hier nur den Schlüssel, aber es stehen auch einige andere Optionen zur Verfügung, z. B. Größe, Besitzer, zuletzt geändert, Speicherklasse usw.

Dies wird nun eine Liste aller Objekte in unserem Eimer drucken:

Document/hello.txt

6.3. Ein Objekt herunterladen

Um ein Objekt herunterzuladen, verwenden wir zuerst diegetObject()-Methode fürs3client, die einS3Object-Objekt zurückgibt. Sobald wir dies erhalten, rufen wirgetObjectContent() auf, um einS3ObjectInputStream-Objekt zu erhalten, das sich wie ein herkömmliches JavaInputStream. verhält

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

Hier verwenden wir die MethodeFileUtils.copyInputStreamToFile()von Apache Commons. Sie können auchthis example article besuchen, um andere Möglichkeiten zum Konvertieren vonInputStream inFile. zu erkunden

6.4. Kopieren, Umbenennen und Verschieben eines Objekts

Wir können ein Objekt kopieren, indem wir die MethodecopyObject()auf unserens3client aufrufen, die vier Parameter akzeptiert:

  1. Name des Quell-Buckets

  2. Objektschlüssel im Quell-Bucket

  3. Name des Ziel-Buckets (kann mit dem Namen der Quelle identisch sein)

  4. Objektschlüssel im Ziel-Bucket

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

Hinweis: Wir können eine Kombination voncopyObject() MethodedeleteObject() zum Ausführen von Verschiebungs- und Umbenennungsaufgaben verwenden. Dazu muss das Objekt zuerst kopiert und dann von seinem alten Speicherort gelöscht werden.

6.5. Objekt löschen

Um ein Objekt zu löschen, rufen wir die MethodedeleteObject()fürs3client auf und übergeben den Bucket-Namen und den Objektschlüssel:

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

6.6. Mehrere Objekte löschen

Um mehrere Objekte gleichzeitig zu löschen, erstellen wir zuerst dasDeleteObjectsRequest-Objekt und übergeben den Bucket-Namen an den Konstruktor. Anschließend übergeben wir ein Array aller Objektschlüssel, die wir löschen möchten.

Sobald wir diesesDeleteObjectsRequest-Objekt haben, können wir es als Argument an diedeleteObjects()-Methode unserers3client übergeben. Bei Erfolg werden alle von uns gelieferten Objekte gelöscht:

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

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

7. Fazit

In diesem Artikel haben wir uns auf die Grundlagen der Interaktion mit dem Amazon S3-Webdienst konzentriert - sowohl auf Bucket- als auch auf Objektebene.

Wie immer finden Sie die vollständige Implementierung dieses Tutorials inover on Github.