Acceso S3

This commit is contained in:
Isidoro Nevares Martín 2026-05-03 10:57:06 +02:00
parent 35908fe7c0
commit 9f1c623f7d
2 changed files with 51 additions and 55 deletions

View File

@ -6,19 +6,16 @@ import java.time.Duration;
import org.lapaloma.pfc.gestores.GestorClientesServiciosAWS; import org.lapaloma.pfc.gestores.GestorClientesServiciosAWS;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest; import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
public class AppPrincipal { public class AppPrincipal {
private final static String NOMBRE_BUCKET_EN_S3 = "s3-obj-proyecto1"; private final static String NOMBRE_BUCKET_EN_S3 = "s3-obj-proyecto1";
private static final int TIEMPO_VIDA_MINUTOS_URL = 60; private static final int TIEMPO_VIDA_MINUTOS_URL = 10;
public static void main(String[] args) { public static void main(String[] args) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@ -30,58 +27,51 @@ public class AppPrincipal {
File documentoEjemplo = new File("fichero/subida_archivos_a_s3.jpg"); File documentoEjemplo = new File("fichero/subida_archivos_a_s3.jpg");
String claveDocumento = idProyecto + "/" + numeroHito + "/" + documentoEjemplo.getName(); String claveDocumento = idProyecto + "/" + numeroHito + "/" + documentoEjemplo.getName();
app.almacenarDocumentoEnS3(claveDocumento, documentoEjemplo); String urlDocumentoAlmacenado = app.almacenarDocumentoEnS3(claveDocumento, documentoEjemplo);
System.out.println("URL del objeto en S3 para hacer un 'PUT': " + urlDocumentoAlmacenado);
String url = app.obtenerURLObjetoS3(claveDocumento); String urlDocumentoConsultado = app.consultarDocumentoEnS3(claveDocumento);
System.out.println("URL del objeto en S3: " + url); System.out.println("URL del objeto en S3 para hacer un 'GET': " + urlDocumentoConsultado);
} }
private String almacenarDocumentoEnS3(String clave, File documento) {
private void almacenarDocumentoEnS3(String clave, File documento) {
// Crear el cliente de S3 (usando SDK v2)
S3Client clienteS3 = GestorClientesServiciosAWS.getClienteBucketS3();
// Solicitud para subir el archivo
PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(clave)
.build();
try {
// Realizar la carga del archivo
PutObjectResponse response = clienteS3.putObject(putObjectRequest, documento.toPath());
// Imprimir respuesta de éxito
System.out.println("Archivo subido correctamente. ETag: " + response.eTag());
} catch (S3Exception e) {
System.err.println("No se pudo insertar el ítem: " + e.getMessage());
e.printStackTrace();
} finally {
clienteS3.close();
}
}
private String obtenerURLObjetoS3(String claveDocumento) {
String urlObjetoS3 = null; String urlObjetoS3 = null;
// Crear el cliente de S3 (usando SDK v2)
//S3Client clienteS3 = GestorClientesServiciosAWS.getClienteBucketS3();
// Usar el perfil `learnerlab-profile` (el nombre del perfil en `~/.aws/credentials`) // Solicitud para subir el archivo (método PUT)
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create("default"); PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(clave).build();
// Crear el cliente presigner de S3 con el perfil específico // Crear el cliente presigner de S3
S3Presigner presigner = S3Presigner.builder().region(GestorClientesServiciosAWS.REGION_AWS) S3Presigner presigner = GestorClientesServiciosAWS.getClientePrefirmadorBucketS3();
.credentialsProvider(credentialsProvider) // Usar el perfil especificado
.build();
// Crear la solicitud de obtención de objeto // Generar la URL firmada
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Tiempo expiración URL firmada
.putObjectRequest(putObjectRequest)
.build();
// Obtener la URL firmada
URL presignedUrl = presigner.presignPutObject(presignRequest).url();
urlObjetoS3 = presignedUrl.toString();
// Cerrar el presigner
presigner.close();
return urlObjetoS3;
}
private String consultarDocumentoEnS3(String claveDocumento) {
String urlObjetoS3 = null;
// Crear la solicitud de obtención de objeto (método GET)
GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(claveDocumento) GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(NOMBRE_BUCKET_EN_S3).key(claveDocumento)
.build(); .build();
// Crear el cliente presigner de S3
S3Presigner presigner = GestorClientesServiciosAWS.getClientePrefirmadorBucketS3();
// Generar la URL firmada // Generar la URL firmada
PresignedGetObjectRequest presignedRequest = presigner.presignGetObject( PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(builder -> builder
builder -> builder.getObjectRequest(getObjectRequest).signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Duración de la URL firmada .getObjectRequest(getObjectRequest).signatureDuration(Duration.ofMinutes(TIEMPO_VIDA_MINUTOS_URL)) // Tiempo expiración URL firmada
); );
// Obtener la URL firmada // Obtener la URL firmada

View File

@ -2,21 +2,27 @@ package org.lapaloma.pfc.gestores;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.presigner.S3Presigner;
public class GestorClientesServiciosAWS { public class GestorClientesServiciosAWS {
public final static Region REGION_AWS = Region.US_EAST_1; private static final String PERFIL_CREDENCIALES_AWS = "default";
public final static Region REGION_AWS = Region.US_EAST_1;
// Evita que pueda construirse un objeto de la clase. // Evita que pueda construirse un objeto de la clase.
private GestorClientesServiciosAWS() { private GestorClientesServiciosAWS() {
} }
public static S3Client getClienteBucketS3() { public static S3Presigner getClientePrefirmadorBucketS3() {
S3Client clienteS3 = S3Client.builder()
.credentialsProvider(ProfileCredentialsProvider.create())
.region(REGION_AWS).build();
return clienteS3;
// Usar el perfil `learnerlab-profile` (el nombre del perfil en `~/.aws/credentials`)
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(PERFIL_CREDENCIALES_AWS);
// Crear el cliente presigner de S3 con el perfil específico
S3Presigner presigner = S3Presigner.builder().region(GestorClientesServiciosAWS.REGION_AWS)
.credentialsProvider(credentialsProvider) // Usar el perfil especificado
.build();
return presigner;
} }
} }