lunes, 24 de enero de 2011

Amazon S3

Amazon tiene espacio de almacenamiento en Internet: Amazon Simple Storage Service (Amazon S3). Proporciona una interface que puede utilizarse para almacenar y recuperar datos, en cualquier momento y en cualquier parte de la web.

La funcionalidad y datos prácticos los podemos encontrar en el siguiente link: http://aws.amazon.com/es/s3/#functionality

Estos son los principales pasos a seguir en el almacenamiento de un objeto:

(http://docs.amazonwebservices.com/AmazonS3/latest/gsg/)

En la web en la que trabajo hemos subido los videos y las imágenes a Amazon, por lo que tuve que hacer un pequeño proyecto para hacer el upload desde la web y el backoffice.

Lo primero que hice fue instalar el Plugin de AWS para Eclipse (http://aws.amazon.com/es/eclipse/), y lo que aconsejan en su web, crear un “sample code”. Es una forma sencilla de empezar a probar la API.

Una vez familiarizada con las librerías, creé un Project para el upload de los videos y las imágenes. Este se compone de dos ficheros: una clase que he llamado s3Access y un fichero de properties.

El fichero de properties contiene la Secret Key y la Access Key de Amazon. De esta forma, si por alguna razón cambian no es necesario modificar el proyecto.

La clase la explico un poco, quitando código superfluo, así no alargo demasiado el post.

A partir de este proyecto se generará un JAR que incluiremos en el path de la web, de forma que crearemos un objeto en la web de la clase s3Access, y llamaremos a sus métodos según convenga.

La clase se compone de un constructor que al ser llamado creará el objeto S3 y cargará los buckets (espacios propios en Amazon):

public S3Access() {

this.s3 = new AmazonS3Client(new PropertiesCredentials(

S3Access.class.getResourceAsStream(awsCredentialsProperties)));

loadMXMBuckets();

}

private void loadMXMBuckets() {

for (Bucket bucket : this.s3.listBuckets()) {

__for (int i=0; i< listObjectType.length; i++) {

____if (bucket.getName().indexOf(listObjectType[i]) != -1) {

______ listMXMBuckets.put(listObjectType[i], bucket.getName());

____ }

__}

}

}

El método uploadFile hace el upload de un fichero en una carpeta en un bucket determinado, y devuelve la url de acceso a ese fichero:

public String uploadFile (String filePath, String objectType, String folderName) {

__String urlFile = null;

__String bucketName = this.listMXMBuckets.get(objectType);

__String key = extractNameFileFromPath(filePath);

__String pathBucket = bucketName + "/" + folderName;

__try {

____File file = new File(filePath);

____s3.putObject(new PutObjectRequest(pathBucket, key, file));

____s3.setObjectAcl(pathBucket, key,

CannedAccessControlList.PublicRead);

____urlFile = urlAmazonAws + pathBucket + "/" + key;

__} catch (AmazonServiceException ase) {

__} catch (AmazonClientException ace) {

__} catch (Exception e) {

__}

return urlFile;

}

Un método interesante para el backoffice sería el de borrar un objeto:

public boolean deleteObject (String filePath, String objectType, String folderName) {

__String bucketName = this.listMXMBuckets.get(objectType);

__String pathBucket = bucketName + "/" + folderName;

__boolean objectDeleted = true;

__try {

____this.s3.deleteObject(pathBucket, filePath);

__} catch (AmazonClientException e) {

__objectDeleted = false;

__}

__return objectDeleted;

}

Recomiendo ver el video: http://media.amazonwebservices.com/videos/eclipse-java-sdk-video.html

3 comentarios:

  1. Muy buen post, como todo lo tuyo que he leído.. ¿cuando espacio te provee Amazon?
    Me interesa para un proyecto que tenemos en marcha.

    ResponderEliminar
  2. Yo no llevo el tema de la gestión con Amazon, pero por lo que sé el espacio es ilimitado, y se paga por el espacio utilizado y el tráfico.

    Las tarifas las puedes encontrar en:
    http://aws.amazon.com/es/s3/#pricing

    Gracias por el comment ;)

    ResponderEliminar
  3. estaria bien que hicieras algun articulo nuevo :P

    ResponderEliminar