Travailler avec S3 et les stockages cloud en Java à l'aide d'AWS SDK et MinIO
\n\nLes stockages d'objets cloud compatibles avec le protocole Amazon S3 (Simple Storage Service) sont devenus le standard de facto pour le stockage de données non structurées : images, vidéos, logs, sauvegardes et artefacts de build. En Java, l'outil principal pour interagir avec ces stockages est le AWS SDK for Java (module S3). Cependant, pour le développement local, les tests ou le travail avec des solutions auto-hébergées, on utilise souvent MinIO — un stockage compatible S3 haute performance avec son propre client Java. Dans cet article, nous aborderons les deux approches.
\n\n1. Préparation et ajout des dépendances
\n\nPour commencer, ajoutez les dépendances dans votre pom.xml (Maven) :
<dependency>\n <groupId>software.amazon.awssdk</groupId>\n <artifactId>s3</artifactId>\n <version>2.30.0</version>\n</dependency>\n\n<!-- Pour MinIO (alternative à AWS SDK) -->\n<dependency>\n <groupId>io.minio</groupId>\n <artifactId>minio</artifactId>\n <version>8.5.17</version>\n</dependency>\n\n2. Création du client S3
\n\nExaminons deux façons de créer un client : pour Amazon S3 (AWS) et pour MinIO (stockage local/personnalisé).
\n\n2.1. Client pour Amazon S3 (AWS SDK)
\n\nUtilisez le constructeur statique en spécifiant la région et la méthode d'authentification (par exemple, via des variables d'environnement ou un profil IAM).
\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) // Francfort\n .build(); // Utilise la chaîne de fournisseurs par défaut\n }\n}\n\n2.2. Client pour MinIO
\n\nMinIO nécessite de spécifier explicitement l'endpoint, l'access key et le 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. Opérations de base avec les buckets et les objets
\n\nQuel que soit le client choisi, la logique de travail avec S3 est universelle. Examinons les scénarios clés.
\n\n3.1. Vérification de l'existence et création d'un bucket
\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// Création d'un bucket (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// Création d'un bucket (MinIO)\nminio.makeBucket(MakeBucketArgs.builder()\n .bucket("my-local-bucket")\n .build());\n\n3.2. Upload d'un fichier
\n\nUpload d'un fichier depuis un chemin local ou depuis un flux de données.
\n\n// AWS SDK - depuis un fichier\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 - depuis un InputStream\ntry (InputStream is = new FileInputStream("/local/path/photo.jpg")) {\n minio.putObject(PutObjectArgs.builder()\n