Perla cultivada: Gestión de almacenamiento en Amazon S3

Tres módulos CPAN para trabajar con sectores de almacenamiento S3 y sus contenidos

Aprenda de qué manera los programadores de Perl pueden usar tres de los módulos S3 de CPAN Net::Amazon::S3, Amazon::S3 y SOAP::Amazon::S3 para clasificar, crear y eliminarsectores de almacenamiento(sectores de almacenamiento de datos S3); para clasificar, crear, recuperar y eliminar artículos de un sector de almacenamiento; y para obtener los metadatos de un artículo.

Comparta su experiencia: ¿Cuál es su modo preferido de acceder a S3? Agregue sus comentarios a continuación.

Teodor Zlatanov, Programmer, Gold Software Systems

photo- teodor zlatanovTeodor Zlatanov obtuvo un Máster en Ingeniería de Sistemas en la Universidad de Boston en 1999. Desde 1992 ha trabajado como programador, usando Perl, Java, C, y C++. Está interesado en el trabajo con código abierto para el análisis de textos, las arquitecturas de bases de datos, las interfaces de usuarios y la administración de sistemas UNIX.



05-03-2010

IBM y Amazon Web Services

Cloud computing ofrece un modo de desarrollar aplicaciones en un entorno virtual, en el cual la capacidad informática, la amplitud de banda, el almacenamiento, la seguridad y la confiabilidad no constituyen ningún tipo de problema—no es necesario que usted instale el software en su propio sistema. En un entorno informático virtual, usted puede desarrollar, implementar y gestionar aplicaciones, pagando sólo por el tiempo y la capacidad que usted use, mientras se expande o se reduce según los cambios producidos en las necesidades o los requerimientos del negocio.

IBM se ha asociado a Amazon Web Services para brindarle acceso a los productos de software de IBM en el entorno virtual de Amazon Elastic Compute Cloud (EC2). Nuestras ofertas de software sobre EC2 incluyen:

  • DB2 Express-C 9.5
  • Informix Dynamic Server Developer Edition 11.5
  • WebSphere Portal Server y Lotus Web Content Management Standard Edition
  • WebSphere sMash

Este es un código del nivel del producto, con todas las características y opciones habilitadas. Obtenga más información y descargue Amazon Machine Images para estos productos en el IBM developerWorks Cloud Computing Resource Center (Centro de Recursos para Cloud Computing de IBM developerWorks).

Para ver más recursos de cloud computing, consulte el espacio de Cloud Computing de developerWorks.

Los desarrolladores de Perl cuentan con un magnífico recurso, la Comprehensive Perl Archive Network (CPAN). Amazon también cuenta con un magnífico recurso — el Simple Storage Service (S3). A pesar de que existe una biblioteca oficial sobre Amazon S3 Perl (denominada "S3") en CPAN, existen por lo menos cinco o seis módulos (si bien algunos no son totalmente independientes) para hablar con S3. Es como si hubiera un concurso gastronómico de chile y en lugar de 200 personas, se presentaran 2.000.

Bien, aquí estoy el día después del concurso, con un trapo y un balde, compartiendo las mejores recetas con usted. Estos módulos y estas herramientas se encuentran en CPAN, disponibles para todos, y usted puede comenzar a utilizarlas de inmediato. Las tres recetas que le recomiendo pertenecen a estos tres módulos: Net::Amazon::S3, Amazon::S3, y SOAP::Amazon::S3.

Consulte la discusión sobre los beneficios y las desventajas de S3 en la serie de artículosCultured Perl: Perl and the Amazon cloud (Perla cultivada: Perl y la nube Amazon)de developerWorks. En este momento no es necesario repasarlos todos, pero sí les ofrezco un breve resumen.

S3 es un servicio de almacenamiento que brinda y gestiona Amazon. Amazon cobra a los usuarios por el acceso al mismo, de manera que los usuarios no deben preocuparse por los servidores, las copias de seguridad, la disponibilidad y la distribución de la amplitud de banda, etc. De modo que S3 es, como casi todo en la vida, algo conveniente que se ofrece a un costo, y solamente usted está en condiciones de decidir si es adecuado para su negocio o uso personal.

Los datos de S3 están organizados en sectores de almacenamiento (más o menos vinculados a un nombre de dominio) y en artículos de datos dentro de estos sectores de almacenamiento. Como nota aparte, recuerde que es muy importante que incluya la escritura MIME durante la carga, u obtendrá datos binarios en crudo (lo cual es particularmente desagradable en el caso de las imágenes). La escritura MIME, al igual que otros metadatos, no puede modificarse una vez escrita — usted deberá eliminar y volver a crear el artículo.

Antes de comenzar, vale la pena mencionar que este artículo está dirigido a los programadores de Perl de nivel intermedio. No explica en absoluto los detalles sobre las técnicas básicas de Perl. Además, deberá saber qué es el S3 de Amazon y cómo se instala un módulo de CPAN. De lo contrario, consulte la sección Recursos para ver artículos relacionados con estos temas.

¿Cuál es el objetivo?

Comuníquese con Ted

Ted es uno de nuestros autores más famosos y prolíficos. De un vistazo a todos los artículos de Ted en developerWorks. Consulte el perfil de Ted y comuníquese con él, con otros autores y otros lectores en My developerWorks.

Usando los tres módulos (Net::Amazon::S3, Amazon::S3, and SOAP::Amazon::S3), explico cómo realizar una serie de operaciones básicas de S3 y maestro el código fuente necesario, de la siguiente manera:

  • Clasificar, crear y eliminar sectores de almacenamiento
  • Clasificar, crear, recuperar y eliminar artículos en un sector de almacenamiento
  • Obtener los metadatos de un artículo

para que las tareas sean comparables entre los módulos, he reutilizado las mismas opciones de la línea de comando y la misma estructura general.


Net::Amazon::S3

Amar a Moose

El principal objetivo de Moose es hacer que Perl 5 OOP se vuelva más sencilla, más coherente y con menos posibilidades de enloquecer a los programadores con tareas tediosas. Se supone que Moose lo ayuda a centrarse en lo que usted desea lograr ayudándolo a despedirse de los mecanismos de la programación orientada a los objetos. Construido sobre Class::MOP, Moose facilita también la programación de metaclases. Si todavía no lo ha probado, realmente debería hacerlo; es una forma magnífica de hacer OOP en Perl. Vea más detalles sobre Moose en Recursos.

El módulo Net::Amazon::S3 es un módulo reconocido, e integral con gran soporte. Posee unos pocos requisitos previos, pero nada tan ridículo como Moose, si es que usted está familiarizado con ello.

Almacenaremos las claves de S3 en el entorno como S3KEY y S3SECRET. De ese modo, podremos acceder a las mismas desde Perl con $ENV{S3KEY} y $ENV{S3SECRET}. Este método para almacenar los datos en un archivo constituye un modo bastante seguro de proteger valores secretos (recuerde que si le roban las calves de S3, usted terminará pagando la amplitud de banda de otra persona).

Bien, entonces, Net::Amazon::S3 se encuentra instalada. (En realidad le conviene la interfaz sugerida Net::Amazon::S3::Client, ya que Net::Amazon::S3 se describe como la "interfaz de legado," pero la versión 0.50 de Net::Amazon::S3::Client tenía una falla de programación debido al módulo de Moose que me impedía usarla al momento de escribir este artículo. La misma fue reparada en la versión 0.51, y la versión usada actualmente es la 0.52.) De todos modos, volvamos al ejemplo. Como de costumbre, todos los scripts se encuentran en la sección descargas.

Listado 1. Preliminares de net-amazon-s3.pl
#!/usr/bin/perl use warnings; use
strict; use Data::Dumper; use Getopt::Long; use Net::Amazon::S3; use MIME::Types; my
$mime = MIME::Types->new();

Todo esto es estándar, incluyendo Data::Dumper con fines de depuración. Se crea un objeto MIME genérico, aunque sólo lo usaremos para las cargas..

Listado 2. Opciones y auxiliares de net-amazon-s3.pl y conexión inicial a S3
my
%opts = ( key => $ENV{S3KEY}, secret => $ENV{S3SECRET}, separator
=> '/', ); GetOptions( \%opts, "create|c=s", "delete|d=s", "list|l:s", # the
parameter is optional "keys|k", "metadata|m", "get=s", "put=s", "separator=s",
"help|h", ); unless ($opts{key} && $opts{secret} ) { die "$0
requires the S3KEY and S3SECRET environment variables to be set."; } # handle -h
usage() if exists $opts{help}; my $s3 = Net::Amazon::S3->new(
aws_access_key_id => $opts{key}, aws_secret_access_key =>
$opts{secret}, retry => 1, ); die "Could not connect to S3" unless defined
$s3; sub read_filename { print "\nEnter filename: "; my $name = <>;
chomp $name; return $name; } sub usage { print lt;<EOHIPPUS; $0 [OPTIONS]
Pass your S3 key and secret in the S3KEY and S3SECRET environment entries. Options:
--help or -h : this help --separator $opts{separator} : BUCKET and KEY separator
character (for --get and --put) --create BUCKET (or -c BUCKET) : create BUCKET
--delete BUCKET (or -d BUCKET) : delete BUCKET --delete BUCKET$opts{separator}KEY :
delete KEY in BUCKET --list [BUCKET] (or -l) : list a specific bucket or all buckets
--keys (or -k) : list the keys in each bucket (requires --list) --metadata (or -m) :
show the keys' metadata (requires --keys and --list) --get BUCKET$opts{separator}KEY
: download KEY from BUCKET --put BUCKET$opts{separator}KEY : upload a file to KEY in
BUCKET EOHIPPUS exit 0; }

Más cosas estándar. Aquí se establecen las opciones. La función usage() es bastante integral para que el programa resulte útil. Se enumera y explica brevemente cada una de las opciones.

Listado 3. Operaciones create y delete (crear y eliminar) de net-amazon-s3.pl
if
(exists $opts{create}) { my $bucket = $s3->add_bucket( { bucket =>
$opts{create}} ) or die sprintf ("%s: %s", $s3->err, $s3->errstr);
print "Created bucket '$opts{create}' successfully.\n"; } elsif (exists
$opts{delete}) { my ($b, $key) = split $opts{separator}, $opts{delete}; my $bucket =
$s3->bucket($b); die "Could not retrieve bucket $b" unless $bucket; if
(defined $key) { $bucket->delete_key($key) or die sprintf ("%s: %s",
$s3->err, $s3->errstr); print "Deleted key '$key' in bucket '$b'
successfully.\n"; } else { $bucket->delete_bucket() or die sprintf ("%s: %s",
$s3->err, $s3->errstr); print "Deleted bucket '$b' successfully.\n"; }
}

La opción --create resulta bastante simple. Usted sólo crea el sector de almacenamiento y regresa.

Para --delete, maneje la eliminación de un sector de almacenamiento (que no es recursiva, por lo cual el usuario deberá eliminar primero todas las claves del sector de almacenamiento) o la eliminación de las claves dentro de un sector de almacenamiento. El carácter de separación interviene en este momento como el punto de separación entre el nombre del sector de almacenamiento y el nombre de la clave.

Listado 4. Operaciones get y put (obtener y colocar) de net-amazon-s3.pl
... elsif
(exists $opts{get}) { my ($b, $key) = split $opts{separator}, $opts{get}; my $bucket
= $s3->bucket($b); die "Could not get the bucket $b" unless $bucket; my
$where = read_filename(); my $response = $bucket->get_key_filename( $key,
'GET', $where ) or die sprintf ("%s: %s", $s3->err, $s3->errstr); die
"Could not create file $where" unless -f $where; print "Successfully downloaded $key
from bucket $b into $where\n"; } elsif (exists $opts{put}) { my ($b, $key) = split
$opts{separator}, $opts{put}; my $bucket = $s3->bucket($b); die "Could not
get the bucket $b" unless $bucket; my $where = read_filename(); die "File $where
does not exist or is not readable" unless -f $where && -r $where; my
$response = $bucket->add_key_filename( $key, $where, { content_type =>
$mime->mimeTypeOf($where), }, ) or die sprintf ("%s: %s", $s3->err,
$s3->errstr); print "Successfully uploaded $where into $key in bucket $b\n";
}

Get y put son muy similares, porque ambas operan sobre el nombre de un archivo y el nombre de una clave. Lo único interesante aquí es el objeto MIME::Types $mime, que usamos para obtener el tipo de contenido. Recuerde que una vez cargado, no puede modificarse.

Listado 5. Operaciones list (clasificar) de net-amazon-s3.pl
... elsif (exists
$opts{list}) { print "Available buckets:\n"; my @todo; if ($opts{list}) { push
@todo, map { $s3->bucket($_) } $opts{list}; } else { print "(Getting all
buckets)\n"; my $response = $s3->buckets; die "Could not get the bucket list"
unless $response; @todo = @{$response->{buckets}}; } foreach my $bucket (
@todo ) { printf "\t%s\n", $bucket->bucket; if (exists $opts{keys}) { my
$response = $bucket->list_all or die sprintf ("%s: %s", $s3->err,
$s3->errstr); foreach my $key (@{$response->{keys}}) { printf
"\t\t%10s\t%s\n", $key->{size}, $key->{key}; if (exists
$opts{metadata}) { my $detail = $bucket->get_key($key->{key}); foreach
my $entry (qw/content_length content_type etag/) { printf "\t\t\t%20s=%s\n", $entry,
($detail->{$entry}||'UNDEFINED'); } } } } } }

Por último, y de manera más extensa, el controlador --list controlará un único sector de almacenamiento o a múltiples sectores de almacenamiento. Mostrará la lista de claves y sus metadatos con los conmutadores adecuados.

Los caracteres \t se traducirán en pestañas; esta es una manera burda de organizar con sangrías los resultados para que se vean bien en una terminal de texto

Net::Amazon::S3 es, como usted puede ver, un módulo bastante limpio. Si bien algunos de sus métodos son un poco extraños, funcionan de manera correcta. Se produce un intervalo entre la obtención de un artículo y su uso con los metadatos que requiere una llamada adicional a get_key(). En todos lados, el código es simple y breve.


Amazon::S3

El módulo Amazon::S3 es un reemplazo temporario de Net::Amazon::S3. Tuve que cambiar la llamada new() para usar una referencia hash, pero ese fue el único cambio (obviamente, además de cambiar todas las referencias a Net::Amazon::S3 por Amazon::S3).

Listado 6. Cambio de amazon-s3.pl desde net-amazon-s3.pl
my $s3 =
Amazon::S3->new({ aws_access_key_id => $opts{key},
aws_secret_access_key => $opts{secret}, retry => 1, });

Amazon::S3 soporta numerosas opciones; consulte la documentación si cree que las puede usar. Por lo general, Amazon::S3 en apariencia tiene objetivos algo diferentes de los de Net::Amazon::S3, pero desde el punto de vista del desarrollador, la API es la misma. Esto constituye un buen punto de vista sobre la interoperabilidad de la biblioteca.

Una de las características de Amazon::S3 que le resultará conveniente es que no depende de tantos módulos como Net::Amazon::S3. Su autor enfatiza el hecho de que es transportable, lo cual constituye una ventaja adicional para aquellos que lo necesitan.


SOAP::Amazon::S3

Conocimiento de File::Slurp

El módulo File::Slurp ofrece subs que le permiten leer o escribir archives completes son una simple llamada. Están diseñados para un uso simple y eficiente, con maneras flexible de pasar u obtener los contenidos de los archivos. También existe un sub para leer todos los archives en un directorio que no sea . y ... Los subs funcionan para los archives, canales y sockets, y para stdio, pseudo-archivos, y DATA. Para más información sobre File::Slurp, consulte la sección Recursos.

El módulo SOAP::Amazon::S3 requiere cierto tipo de información que simplificaré en este artículo. SOAP es una manera de acceder a la información en HTTP (la Web) diferente de las solicitudes HTTP comunes que usan la ruta para indicar un recurso. Estas solicitudes se llaman comúnmente de estilo REST y tienden a surgir en muchas variaciones de URL; SOAP, por otro lado, solo toca unos pocos URL y ofrece muchos archivos XML al servidor.

Me gustaría explayarme acerca de SOAP, pero este es un tema amplio, de manera que lo dejaré libre para consultar libros y motores de búsqueda si siente curiosidad al respecto. Por si sirve de algo, SOAP y REST no son tan diferentes. Usted puede escribir códigos buenos o pésimos con ambos de igual manera.

Desafortunadamente, SOAP::Amazon::S3 está señalada como experimental en la documentación pertinente. Quizás le sirva probarla por sí mismo para decidir si le resulta de utilidad.

Volvamos a los cambios. En primer lugar, necesitamos el módulo File::Slurp debido a que SOAP::Amazon::S3 no cuenta con métodos convenientes para colocar y obtener un archivo, a diferencia de Net::Amazon::S3 y Amazon::S3 que sí los tiene.

Listado 7. Preliminares sobre soap-amazon-s3.pl
# set Debug to 0 if you don't want to see all
the XML my $s3 = SOAP::Amazon::S3->new( $opts{key}, $opts{secret}, { Debug
=> 1, RaiseError => 1 } );

Dejé Debug=1 debido a que probablemente usted sienta curiosidad de ver todo el tráfico SOAP que genera SOAP::Amazon::S3. Ninguna de las verificaciones de errores que hice con Net::Amazon::S3 fue necesaria debido a RaiseError=1, aunque en un entorno de producción esta puede no ser una buena idea.

La creación de un sector de almacenamiento (my $bucket = $s3->createbucket($opts{create});) difiere de la creación de uno con Net::Amazon::S3, del mismo modo que la eliminación de un bucket ($bucket->delete()) o un objeto ($bucket->object($key)->delete();).

Escribir en un archivo era levemente más complicado porque, como dije anteriormente, SOAP::Amazon::S3 no posee las convenientes funciones que vimos en Net::Amazon::S3.

Listado 8. Archivo de escritura soap-amazon-s3.pl
open W, '>', $where or
die "Could not write to $where: $!"; print W
$bucket->object($key)->getdata(); close W;

Lo mismo se aplica a la carga desde un archivo.

Listado 9. Archivo de carga soap-amazon-s3.pl
my $type =
''.$mime->mimeTypeOf($where); # force $type to be a string # use
File::Slurp::read_file in scalar context to grab the whole file's contents my $data
= read_file($where); $bucket->putobject($key, $data, { 'Content-Type'
=> $type });

El tipo de MIME se debe forzar a una cadena, o los módulos auxiliares del XML lo sentirán. Además, el tipo de contenidos se capitaliza de manera diferente a Net::Amazon::S3.

Por último, llegamos al listado de los artículos. Aquí, SOAP::Amazon::S3 no resultó tan poderosa como Net::Amazon::S3 porque no se disponía de los metadatos de los objetos. SOAP::Amazon::S3 cuenta con un buen método $object->url(), pero no convierte los espacios a %20, por ejemplo, de manera que usted deberá probarlo para asegurarse de que funcione para sus necesidades. Yo he ebviado un error de programación (recuerde que es un módulo experimental), pero por ahora, trataría de evitar el método $object->url() en un entorno de producción.

Listado 10. soap-amazon-s3.pl con enumeración de los sectores de almacenamiento y objetos que contienen
... elsif (exists $opts{list}) { print "Available
buckets:\n"; my @todo; if ($opts{list}) { push @todo, map { $s3->bucket($_) }
$opts{list}; } else { print "(Getting all buckets)\n"; @todo =
$s3->listbuckets; } foreach my $bucket ( @todo ) { printf "\t%s\n",
$bucket->name; if (exists $opts{keys}) { foreach my $key
($bucket->list()) { printf "\t\t%10s\t%-30s\t%s\n", $key->{Size},
$key->name, $key->url; if (exists $opts{metadata}) { foreach my $entry
(qw/Size ETag LastModified/) { printf "\t\t\t%20s=%s\n", $entry,
($key->{$entry}||'UNDEFINED'); } } } } } }

Como podrá observar, SOAP::Amazon::S3 no obtiene los metadatos, de manera que usted no puede ver el tipo de contenido del objeto, por ejemplo. Esta puede resultar una restricción desagradable si usa los metadatos para almacenar información importante sobre un objeto. En los demás aspectos, SOAP::Amazon::S3 se compara bien con Net::Amazon::S3 en lo que se refiere al listado de los sectores de almacenamiento y sus elementos.


Conclusión

No evalué en detalle los otros dos módulos de CPAN de S3, pero a continuación le presento un breve resumen de los mismos:

  • Net::Amazon::S3::Tools es adecuado si desea obtener acceso por línea de comandos S3. Es mejor que escribir su propio código, de manera que para una caja de herramientas lista para usar, será conveniente probarla.
  • Tie::Amazon::S3 es un buen módulo para trabajar con un único sector de almacenamiento. Usted puede eliminar o modificar las entradas hash, agregar nuevas entradas, etc. Desafortunadamente, no permite operaciones a nivel de los sectores de almacenamiento (crear sector de almacenamiento, eliminar sector de almacenamiento, etc.) ni operaciones con metadatos (en especial, establecer el tipo de contenidos en una nueva clave). Así, Tie::Amazon::S3 resulta útil si usted desea almacenar datos puros en S3, pero no será de demasiada utilidad para las imágenes.

En general, Net::Amazon::S3 y Amazon::S3 son actualmente las mejores opciones para el trabajo con S3. Su API intercambiable facilita el cambio cuando éste sea necesario. Soportan todas las operaciones, desde las operaciones de sectores de almacenamiento hasta la recuperación de metadatos de los artículos. Su API es algo extraña, pero resulta fácil de usar una vez que la configura.

Observe cuidadosamente SOAP::Amazon::S3; posee un buen potencial. Si usted trabaja con datos puros en un único sector de almacenamiento, le conviene Tie::Amazon::S3 porque hará su vida más fácil.

¡Buena suerte con S3!


Descargar

DescripciónNombretamaño
Sample scriptsamazon-s3-scripts.zip5KB

Recursos

Aprender

  • Conozca más acerca de Amazon S3.
  • La serie Cultured Perl: Perl and the Amazon cloud (Perla cultivada: Perl y la nube Amazon) (developerWorks, marzo – junio de 2009) lo acompaña en la construcción de un simple sitio Web para compartir fotos que usa Perl y Apache para acceder a Simple Storage Service (S3) y a SimpleDB de Amazon:
    • La Parte 1 presenta los beneficios y las desventajas de S3 y SimpleDB realizando un recorrido por sus arquitecturas.
    • La Parte 2le muestra cómo cargar un archivo a S3 desde una página Web a través de un formulario HTML con el fin de minimizar la carga del servidor y mantener una política de seguridad inviolable.
    • La Parte 3 detalla cómo el URL crea un registro de SimpleDB para el archivo cargado y cómo crear, editar y eliminar comentarios como registros de SimpleDB en una foto para un usuario en particular.
    • La Parte 4 examina toda la base del código de mod_perl, incluyendo cómo configurar el nivel superior, qué hacer con los controladores, y cómo establecer las dependencias externas.
    • La Parte 5 examina todas las plantillas del sitio mod_perl, incluyendo una de generación de índices, tres de caga (general, formularios S3 y agregados de URL), una para navegación en imágenes y comentarios, y una para la navegación repetida por los comentarios para una imagen (o subprocesamiento descendente).
  • ¿Lo intrigó Moose? Compruébelo. Haga lo mismo con File::Slurp.
  • Para más información sobre SOAP y REST, pruebe con la zona de SOA y servicios Web de developerWorks.
  • En la zona Linux de developerWorks, encuentre más recursos para desarrolladores de Linux, y lea nuestros artículos y tutoriales más conocidos.
  • vea todos los artículos sobre Linux y tutoriales sobre Linux en developerWorks.
  • Manténgase actualizado con los eventos técnicos y las transmisiones por Internet de developerWorks.

Obtener los productos y tecnologías

Comentar

  • Involúcrese en la comunidad My developerWorks. Conéctese con otros usuarios de developerWorks mientras explora los blogs, foros, grupos y wikis orientados a desarrolladores.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que se registra en developerWorks, se crea un perfil para usted. Información sobre su perfil (nombre, país/región y compañia) estará disponible al público y acompañará cualquiera de sus publicaciones. Puede actualizar su cuenta IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux, Cloud computing
ArticleID=480682
ArticleTitle=Perla cultivada: Gestión de almacenamiento en Amazon S3
publish-date=03052010