Configuración Inicial del Entorno
Para comenzar a utilizar el Object Storage Service (OSS) de Alibaba Cloud, es necesario acceder a la consola de administración y crear un contenedor de almacenamiento (Bucket). Al configurar el Bucket, defina un nombre único y asigne los permisos de lectura/escritura según sus necesidades. Para entornos de prueba o activos públicos, se suele configurar como "Public Read" (Lectura Pública).
Integración del SDK en el Proyecto
Para aplicaciones basadas en Java y Maven, añada la siguiente dependencia en su archivo pom.xml para habilitar las funcionalidades del SDK oficial de Alibaba Cloud OSS:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
Si su proyecto utiliza Java 9 o superior, es indispensable incluir las librerías JAXB, ya que fueron removidas del JDK estándar:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
Gestión de Seguridad Mediante STS
Por razones de seguridad, se recomienda no utilizar las credenciales permanentes de la cuenta principal. En su lugar, utilice el Security Token Service (STS) para generar accesos temporales. El proceso implica:
- Crear un usuario RAM: Acceda a Resource Access Management (RAM) y cree un usuario específico con acceso para llamadas OpenAPI.
- Asignar permisos STS: Otorgue la política
AliyunSTSAssumeRoleAccessal usuario creado. - Definir un Rol RAM: Cree un rol que el usuario RAM pueda asumir, vinculándole una política personalizada que permita acciones como
oss:PutObjectsobre su Bucket específico.
Ejemplo de política JSON para limitar el acceso a un Bucket específico:
{
"Version": "1",
"Statement": [
{
"Action": ["oss:PutObject"],
"Resource": ["acs:oss:*:*:nombre-de-tu-bucket/*"],
"Effect": "Allow"
}
]
}
Implementación de la Obtención de Tokens Temporales
El siguiente fragmento de código muestra cómo solicitar un token de accceso temporal mediante el cliente STS de Alibaba Cloud:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.profile.DefaultProfile;
public class GeneradorTokensSTS {
public static void main(String[] args) {
String endpointSts = "sts.cn-hangzhou.aliyuncs.com";
String idAcceso = "TU_ACCESS_KEY_ID";
String secretoAcceso = "TU_ACCESS_KEY_SECRET";
String arnRol = "acs:ram::12345678:role/tu-rol";
try {
DefaultProfile profile = DefaultProfile.getProfile("", idAcceso, secretoAcceso);
DefaultAcsClient client = new DefaultAcsClient(profile);
AssumeRoleRequest peticion = new AssumeRoleRequest();
peticion.setRoleArn(arnRol);
peticion.setRoleSessionName("SesionDeCarga");
peticion.setDurationSeconds(3600L);
AssumeRoleResponse respuesta = client.getAcsResponse(peticion);
System.out.println("ID Temporal: " + respuesta.getCredentials().getAccessKeyId());
System.out.println("Token de Seguridad: " + respuesta.getCredentials().getSecurityToken());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Clase de Utilidad para Carga de Archivos en Spring Boot
Para encapsular la lógica de negocio, se puede definir un servicio que gestione la carga de archivos utilizando las credenciales obtenidas. Este ejemplo utiliza un generador de nombres únicos mediante UUID para evitar colisiones de archivos.
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
@Service
public class AlmacenamientoOSSService {
public String subirArchivo(MultipartFile archivo, String endpoint, String bucket, String idTemp, String secretTemp, String tokenTemp) {
OSS ossClient = new OSSClientBuilder().build(endpoint, idTemp, secretTemp, tokenTemp);
try {
String nombreOriginal = archivo.getOriginalFilename();
String extension = nombreOriginal.substring(nombreOriginal.lastIndexOf("."));
String nombreFinal = UUID.randomUUID().toString() + extension;
InputStream entrada = archivo.getInputStream();
ossClient.putObject(new PutObjectRequest(bucket, nombreFinal, entrada));
// Construcción de la URL pública del recurso
return "https://" + bucket + "." + endpoint.replace("https://", "") + "/" + nombreFinal;
} catch (Exception e) {
return "Error en la subida: " + e.getMessage();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Gestión Automática de Credenciales
En aplicaciones de nivel profesional, es recomendable implementar un proveedor de credenciales dinámico que se encargue de refrescar el token automáticamente antes de su expiración. La librería aliyun-java-sdk-credentials permite configurar un cliente que gestione la rotación del RAM Role ARN de forma transparente para el cliente OSS, mejorando la robustez y disponibilidad del sistema de carga.