# rm-rf.es

Gestionar Amazon S3 storage desde AWS CLI

Tras la entrada en la que explicaba como instalar la CLI de aws para interactuar con todo lo relacionado con Amazon Web Services y la explicación de como acceder por SSH a las instancias creadas, vamos a ver cómo podemos gestionar el servicio de almacenamiento Amazon Simple Storage Service (S3).

La CLI ya la tenemos instalada, sino echad un vistazo al artículo que he enlazado antes para ver los pasos de instalación. El comando base sobre el que realizamos las operaciones es:

$ aws s3

Todo lo que os voy a indicar en esta entrada (y más) podéis consultarlo también en la página man del comando ejecutando:

$ aws s3 help

Para ver la ayuda de cada comando es suficiente con pasar como parámetro «help». Ejemplos:

$ aws s3 cp help
$ aws s3 mv help

Listar, crear y eliminar buckets

Los «buckets» o «cubos» es el contenedor S3 donde se almacenarán los datos. Para crear uno, debemos elegir un nombre (tiene que ser válido a nivel de DNS y único) y opcionalmente la región en la que queremos crear el bucket. Esto nos puede interesar por temas de latencia. Todo esto utilizando el parámetro «mb» (make bucket):

$ aws s3 mb s3://lab01-storage
make_bucket: s3://lab01-storage/

Si quisiéramos forzar la ubicación del almacenamiento S3:

$ aws s3 mb s3://lab02-storage --region eu-west-1
make_bucket: s3://lab02-storage/

Para visualizar los buckets que tenemos en nuestra cuenta de AWS, simplemente ejecutamos aws s3 con el parámetro «ls»:

$ aws s3 ls
2014-11-14 16:21:14 lab01-storage
2014-11-14 16:22:05 lab02-storage

Para eliminar un bucket, rb (remove bucket) seguido del bucket:

$ aws s3 rb s3://lab02-storage
remove_bucket: s3://lab02-storage/

Y para forzar la eliminación en caso de que no esté vacío le pasamos el parámetro –force:

$ aws s3 rb s3://lab02-storage --force
remove_bucket: s3://lab02-storage/

Subir, descargar y eliminar objetos

Con la CLI de aws se incluyen los comandos cp, ls, mv, rm y sync. Todos ellos funcionan igual que en las shell de Linux. Sync es un añadido que permite sincronizar directorios completos. Vamos a ver unos ejemplos:

Copiar de local a remoto:

$ aws s3 cp foo.txt  s3://lab01-storage
upload: ./foo.txt to s3://lab01-storage/foo.txt

Copiar de remoto a local:

$ aws s3 cp s3://lab01-storage/bar.txt bar.txt
download: s3://lab01-storage/bar.txt to ./bar.txt

Listar archivos remotos:

$ aws s3 ls s3://lab01-storage
2014-11-14 16:27:17          0 foo.txt

Mover/renombrar un archivo remoto:

$ aws s3 mv s3://lab01-storage/foo.txt s3://lab01-storage/bar.txt
move: s3://lab01-storage/foo.txt to s3://lab01-storage/bar.txt
$ aws s3 ls s3://lab01-storage
2014-11-14 16:28:27          0 bar.txt

Borrar un archivo remoto:

$ aws s3 rm s3://lab01-storage/bar.txt
delete: s3://lab01-storage/bar.txt

Como podéis ver, muy sencillo. La parte de sincronización también es fácil de utilizar si tenemos una base de rsync, indicamos el origen y el destino y sincronizará todos los archivos y directorios que contenga. Si queremos que sea recursivo utilizaremos el parámetro «–recursive»:

$ aws s3 sync test/ s3://lab01-storage --recursive
upload: test/bar.txt to s3://lab01-storage/bar.txt
upload: test/foo.txt to s3://lab01-storage/foo.txt
upload: test/zzz.txt to s3://lab01-storage/zzz.txt
$ aws s3 ls s3://lab01-storage
2014-11-14 16:32:02          0 bar.txt
2014-11-14 16:32:03          0 foo.txt
2014-11-14 16:32:03          0 zzz.txt

Para sincronizar borrando contenido en destino que ya no exista en origen:

$ rm -f test/foo.txt 
$ aws s3 sync test s3://lab01-storage --delete
delete: s3://lab01-storage/foo.txt
$ aws s3 ls s3://lab01-storage
2014-11-14 16:32:02          0 bar.txt
2014-11-14 16:32:03          0 zzz.txt

También podemos establecer filtros de inclusión y exclusión:

$ aws s3 sync . s3://lab01-storage --exclude '*.jpg' --include 'M*.txt' --exclude 'prueba?.txt'

Privilegios

Los comandos cp, mv y sync permiten asignar permisología a usuarios en los objetos utilizando el parámetro –grants, pudiendo especificar el tipo de permiso a asignar al usuario con el atributo Permission (read, readacl, writeacl, full), el objeto al que asignarlo con el atributo Grantee_Type (uri, emailaddress, id) y el identificador/usuario al que asignarlo con Grantee_ID.

El siguiente ejemplo otorga permiso de lectura para el archivo que vamos a subir (foo.txt) a todos los usuarios

aws s3 cp foo.txt s3://bucket-name/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers/pre>

Para profundizar en este tema es recomendable revisar la documentación sobre ACLs de AWS.

--grants (string) Grant specific permissions  to  individual  users  or
  groups. You can supply a list of grants of the form:

--grants Permission=Grantee_Type=Grantee_ID [Permission=Grantee_Type=Grantee_ID ...]

  Each value contains the following elements:
    o Permission  - Specifies the granted permissions, and can be set to
      read, readacl, writeacl, or full.
    o Grantee_Type - Specifies how the grantee is to be identified,  and
      can be set to uri, emailaddress, or id.
    o Grantee_ID - Specifies the grantee based on Grantee_Type.
      The Grantee_ID value can be one of:
    o uri - The group's URI. For more information, see Who Is a Grantee?
    o emailaddress - The account's email address.
    o id - The account's canonical ID

Con esta información ya podréis tener la base para trabajar desde la CLI con el almacenamiento S3 de Amazon.

Salir de la versión móvil