Trabalho com S3 e armazenamentos em nuvem em Java usando AWS SDK e MinIO
Os armazenamentos de objetos em nuvem compatíveis com o protocolo Amazon S3 (Simple Storage Service) tornaram-se o padrão de facto para armazenar dados não estruturados: imagens, vídeos, logs, backups e artefatos de build. Em Java, a principal ferramenta para interagir com esses armazenamentos é o AWS SDK for Java (módulo S3). No entanto, para desenvolvimento local, testes ou trabalho com soluções self-hosted, o MinIO é frequentemente utilizado — um armazenamento de alto desempenho compatível com S3 com seu próprio cliente Java. Neste artigo, abordaremos ambas as abordagens.
1. Preparação e adição de dependências
Para começar, adicione as dependências ao seu pom.xml (Maven):
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.30.0</version></dependency>
<!-- Para MinIO (alternativa ao AWS SDK) --><dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.17</version></dependency>2. Criação do cliente S3
Vamos considerar duas formas de criar um cliente: para Amazon S3 (AWS) e para MinIO (armazenamento local/personalizado).
2.1. Cliente para Amazon S3 (AWS SDK)
Use o builder estático, especificando a região e o método de autenticação (por exemplo, através de variáveis de ambiente ou perfil IAM).
import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;
public class AwsS3Example { public static S3Client createAwsS3Client() { return S3Client.builder() .region(Region.EU_CENTRAL_1) // Frankfurt .build(); // Usa a cadeia de provedores padrão }}2.2. Cliente para MinIO
O MinIO exige a especificação explícita do endpoint, access key e secret key.
import io.minio.MinioClient;
public class MinioExample { public static MinioClient createMinioClient() { return MinioClient.builder() .endpoint("http://localhost:9000") .credentials("minioadmin", "minioadmin") .build(); }}3. Operações principais com buckets e objetos
Independentemente do cliente escolhido, a lógica de trabalho com S3 é universal. Vamos considerar os cenários principais.
3.1. Verificação de existência e criação de bucket
// AWS SDKpublic boolean bucketExists(S3Client s3, String bucketName) { return s3.headBucket(HeadBucketRequest.builder() .bucket(bucketName) .build()) .sdkHttpResponse().isSuccessful();}
// MinIO SDKpublic boolean bucketExists(MinioClient minio, String bucketName) { return minio.bucketExists(BucketExistsArgs.builder() .bucket(bucketName) .build());}
// Criação de bucket (AWS)s3.createBucket(CreateBucketRequest.builder() .bucket("my-unique-bucket-123") .createBucketConfiguration( CreateBucketConfiguration.builder() .locationConstraint("eu-central-1") .build()) .build());
// Criação de bucket (MinIO)minio.makeBucket(MakeBucketArgs.builder() .bucket("my-local-bucket") .build());3.2. Upload de arquivo
Upload de arquivo a partir de um caminho local ou de um fluxo de dados.
// AWS SDK - a partir de arquivos3.putObject(PutObjectRequest.builder() .bucket("my-bucket") .key("uploads/report.pdf") .build(), Paths.get("/local/path/report.pdf"));
// MinIO SDK - a partir de InputStreamtry (InputStream is = new FileInputStream("/local/path/photo.jpg")) { minio.putObject(PutObjectArgs.builder() Também na biblioteca
Registro para Swift (iOS/macOS): melhores soluções
Processamento JSON em Swift: Codable, JSONSerialization e exemplos práticos
Autorização e Autenticação em C# (.NET) — Guia Completo