Arbeit mit S3 und Cloud-Speichern in Java mit AWS SDK und MinIO
\n\nCloud-Objektspeicher, die mit dem Amazon S3 (Simple Storage Service)-Protokoll kompatibel sind, haben sich zum De-facto-Standard für die Speicherung unstrukturierter Daten entwickelt: Bilder, Videos, Logs, Backups und Build-Artefakte. In Java ist das wichtigste Werkzeug für die Interaktion mit solchen Speichern das AWS SDK for Java (Modul S3). Für die lokale Entwicklung, das Testen oder die Arbeit mit Self-Hosted-Lösungen wird jedoch häufig MinIO verwendet – ein leistungsstarker S3-kompatibler Speicher mit eigenem Java-Client. In diesem Artikel betrachten wir beide Ansätze.
\n\n1. Vorbereitung und Einbindung von Abhängigkeiten
\n\nFügen Sie zunächst die Abhängigkeiten zu Ihrer pom.xml (Maven) hinzu:
<dependency>\n <groupId>software.amazon.awssdk</groupId>\n <artifactId>s3</artifactId>\n <version>2.30.0</version>\n</dependency>\n\n<!-- Für MinIO (Alternative zum AWS SDK) -->\n<dependency>\n <groupId>io.minio</groupId>\n <artifactId>minio</artifactId>\n <version>8.5.17</version>\n</dependency>\n\n2. Erstellen eines S3-Clients
\n\nBetrachten wir zwei Möglichkeiten, einen Client zu erstellen: für Amazon S3 (AWS) und für MinIO (lokaler/benutzerdefinierter Speicher).
\n\n2.1. Client für Amazon S3 (AWS SDK)
\n\nVerwenden Sie den statischen Builder und geben Sie die Region und die Authentifizierungsmethode an (z. B. über Umgebungsvariablen oder ein IAM-Profil).
\n\nimport software.amazon.awssdk.regions.Region;\nimport software.amazon.awssdk.services.s3.S3Client;\n\npublic class AwsS3Example {\n public static S3Client createAwsS3Client() {\n return S3Client.builder()\n .region(Region.EU_CENTRAL_1) // Frankfurt\n .build(); // Verwendet die Standard-Anbieterkette\n }\n}\n\n2.2. Client für MinIO
\n\nMinIO erfordert die explizite Angabe von Endpoint, Access Key und Secret Key.
\n\nimport io.minio.MinioClient;\n\npublic class MinioExample {\n public static MinioClient createMinioClient() {\n return MinioClient.builder()\n .endpoint("http://localhost:9000")\n .credentials("minioadmin", "minioadmin")\n .build();\n }\n}\n\n3. Grundlegende Operationen mit Buckets und Objekten
\n\nUnabhängig vom gewählten Client ist die Logik der Arbeit mit S3 universell. Betrachten wir die wichtigsten Szenarien.
\n\n3.1. Überprüfen der Existenz und Erstellen eines Buckets
\n\n// AWS SDK\npublic boolean bucketExists(S3Client s3, String bucketName) {\n return s3.headBucket(HeadBucketRequest.builder()\n .bucket(bucketName)\n .build())\n .sdkHttpResponse().isSuccessful();\n}\n\n// MinIO SDK\npublic boolean bucketExists(MinioClient minio, String bucketName) {\n return minio.bucketExists(BucketExistsArgs.builder()\n .bucket(bucketName)\n .build());\n}\n\n// Bucket erstellen (AWS)\ns3.createBucket(CreateBucketRequest.builder()\n .bucket("my-unique-bucket-123")\n .createBucketConfiguration(\n CreateBucketConfiguration.builder()\n .locationConstraint("eu-central-1")\n .build())\n .build());\n\n// Bucket erstellen (MinIO)\nminio.makeBucket(MakeBucketArgs.builder()\n .bucket("my-local-bucket")\n .build());\n\n3.2. Hochladen einer Datei (Upload)
\n\nHochladen einer Datei von einem lokalen Pfad oder aus einem Datenstrom.
\n\n// AWS SDK - aus Datei\ns3.putObject(PutObjectRequest.builder()\n .bucket("my-bucket")\n .key("uploads/report.pdf")\n .build(),\n Paths.get("/local/path/report.pdf"));\n\n// MinIO SDK - aus InputStream\ntry (InputStream is = new FileInputStream("/local/path/photo.jpg")) {\n minio.putObject(PutObjectArgs.builder()\n