Administración de buckets Amazon S3 desde la línea de órdenes

JR Javier Rojas Javier Rojas

Javier Rojas

Senior Software Engineer
3 min read.

Introducción


Amazon S3 (Simple Storage Service) es un servicio que permite el almacenamiento y acceso de archivos de cualquier tipo por Internet mediante una API basada en
web services que cuenta con múltiples clientes y bibliotecas de acceso disponibles.


En Axiacore usamos S3 para almacenar algunos de los archivos que manejan las aplicaciones web que desarrollamos; en particular, para almacenar y servir los archivos que los usuarios cargan a las aplicaciones, para simplificar el manejo de espacio en disco en nuestros servidores.


Los archivos se almacenan en
buckets (baldes) específicos; cada balde tiene una cuenta asociada, y puede considerarse como el mecanismo para agrupar todos los archivos que se suban (quedan en un balde (bucket)).


Con cierta frecuencia tenemos que interactuar directamente con un
bucket, para, por ejemplo, ver si un archivo efectivamente se encuentra allí, cargar archivos en lote, o copiar archivos de un bucket a otro. El cliente web de amazon es útil para esto, pero más que todo para operaciones cortas, que se puedan realizar manualmente. Para operaciones masivas no es muy útil; sencillamente dicha interfaz no está orientada a ese tipo de usos.


Para operaciones complejas que involucran muchos archivos, con frecuencia utilizamos la herramienta
s3cmd, que permite llevar a cabo precisamente ese tipo de operaciones, desde la comodidad de la línea de órdenes :)


A continuación describiré la instalación, configuración y uso básico de esta herramienta.

Instalación


s3cmd se encuentra disponible como paquete en Debian/Ubuntu. Para instalarlo, ejecute:

apt-get install s3cmd

Configuración


En este ejemplo mostraré cómo configurar un balde llamado
caneco

s3cmd --configure s3://caneco


En la configuración se debe indicar cuál es la llave de acceso (algo así como el nombre de usuario) y la llave secreta (equivalente a la contraseña). El proceso es similar a lo siguiente:

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3
Access Key: NOT-YOUR-REAL-KEY
Secret Key: NOT-YOUR-SECRET-KEY
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 
Path to GPG program [/usr/bin/gpg]: 
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: 
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name: 
New settings:
  Access Key: NOT-YOUR-REAL-KEY
  Secret Key: NOT-YOUR-SECRET-KEY
  Encryption password: 
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: False
  HTTP Proxy server name: 
  HTTP Proxy server port: 0
Test access with supplied credentials? [Y/n]
Please wait, attempting to list bucket: s3://caneco
Success. Your access key and secret key worked fine :-)
Now verifying that encryption works...
Not configured. Never mind.
Save settings? [y/N] y
Configuration saved to '/home/snake/.s3cfg'


una vez configuradas las credenciales, es posible manipular el bucket, y los archivos dentro de él.

Uso


Con
s3cmd es posible:

  • Crear, borrar buckets:
    s3cmd mb s3://caneco  # crear
    s3cmd rb s3://caneco  # eliminar
  • Obtener información sobre el bucket, o sobre archivos en el bucket:
    • Listar contenidos:
      s3cmd ls s3://caneco/
                             DIR   s3://caneco/img/
                             DIR   s3://caneco/inlines/
                             DIR   s3://caneco/media/
                             DIR   s3://caneco/misc/
                             DIR   s3://caneco/uploads/
    • Calcular espacio utilizado (disk usage/du):
      s3cmd du s3://caneco/inlines
      137631365 s3://sabios/inlines
    • Descargar archivos:
      s3cmd get s3://caneco/inlines/archivo.txt
  • Modificar el bucket:
    • copiar/mover archivos entre distintos buckets (también funciona con directorios)
      s3cmd cp s3://caneco/inlines/archivo.txt s3://tonel/inlines/archivo.txt
      s3cmd mv s3://caneco/inlines/archivo.txt s3://tonel/inlines/archivo.txt
    • borrar archivos de un bucket:
      s3cmd del s3://caneco/inlines/archivo.txt
    • cambiar los permisos de acceso a un archivo/archivos en un bucket:
      s3cmd setacl s3://caneco/inlines/archivo.txt

Además de lo anterior,
s3cmd cuenta con una orden tremendamente útil: s3cmd sync. Ésta orden recibe como argumento un par de buckets (origen y destino), y se encarga de copiar todos los archivos del bucket origen al bucket destino.

s3cmd sync s3://caneco s3://tonel


Esta operación difiere de una copia en que, al sincronizar,
s3cmd sólo copia los archivos que no están en el destino. Gracias a esto, es posible sincronizar dos buckets muy grandes con rapidez, luego de la sincronización inicial.


s3cmd sync también facilita la carga de archivos en lote, desde un directorio del sistema de archivos local, a un bucket, o viceversa:

s3cmd sync s3://caneco /tmp/copia_caneco


Algo a tener en cuenta al hacer s3cmd sync desde un directorio del sistema de archivos local a un bucket, es que es conveniente ajustar los permisos de acceso al hacer la carga (especialmente en migraciones/cargas de muchos archivos). El siguiente ejemplo ajusta los permisos para permitir el acceso anónimo a cualquier archivo en el bucket:

s3cmd sync --acl-public /tmp/copia_caneco/ s3://caneco

La única desventaja que he encontrado al usar s3cmd sync es que la sincronización entre buckets sólo funciona bien entre buckets que están asociados a la misma cuenta de Amazon. Para sincronizar buckets que pertenecen a cuentas distintas es necesario ajustar los permisos de acceso, como se describe aquí

A pesar de eso, es una herramienta muy útil y que facilita enormemente las tareas de administración de los buckets que usamos en nuestras aplicaciones.


Written by Javier Rojas

JR Javier Rojas Javier Rojas

A seasoned developer, Javier brings expertise in designing and building complex software systems. With a focus on quality and performance, they lead projects that drive innovation and deliver reliable solutions to meet user needs.

Newsletter

Subscribe to our newsletter:

Read more

Colores RGBA, HSL y HSLA en CSS3

Tradicionalmente en CSS los valores de los colores se han expresado en valores RGB. CSS3 da una vuelta a este sistema y añade...

1 min read.

Build Once. Own Forever.