Searching...
viernes, 23 de octubre de 2020

Comandos esenciales de la CLI de AWS S3

En este artículo voy a explicar los conceptos básicos de cómo gestionar buckets de S3 y sus objetos mediante la CLI de AWS S3.

Crear un nuevo Bucket S3

Utiliza la opción mb para esto. mb son las siglas de Make Bucket.

$ aws s3 mb s3://tgsbucket
make_bucket: tgsbucket
En el ejemplo anterior, el bucket se crea en la región us-east-1, como se especifica en el archivo de configuración del usuario que se muestra a continuación.

$ cat ~/.aws/config
[profile ramesh]
region = us-east-1
Para configurar tu archivo de configuración correctamente, usa el comando aws configure como se explica aquí: Ejemplos de comandos de configuración de AWS para gestionar múltiples perfiles para CLI

Si el bucket ya existe y eres el propietario del mismo, recibirás el siguiente mensaje de error.

$ aws s3 mb s3://tgsbucket
make_bucket failed: s3://tgsbucket An error occurred (BucketAlreadyOwnedByYou) when calling the CreateBucket operation: Your previous request to create the named bucket succeeded and you already own it.
Si el bucket ya existe, pero es propiedad de otro usuario, aparecerá el siguiente mensaje de error.

$ aws s3 mb s3://paloalto
make_bucket failed: s3://paloalto An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
En alguna situación, también puedes recibir el siguiente mensaje de error.

$ aws s3 mb s3://demo-bucket
make_bucket failed: s3://demo-bucket An error occurred (IllegalLocationConstraintException) when calling the CreateBucket operation: The unspecified location constraint is incompatible for the region specific endpoint this request was sent to.

Crear nuevo bucket de S3: región diferente

Para crear un depósito en una región específica (diferente a la de su archivo de configuración), use la opción –region como se muestra a continuación.

$ aws s3 mb s3://tgsbucket --region us-west-2
make_bucket: tgsbucket

Eliminar bucket S3 (que está vacío)

Utilice la opción rb para esto, que significa Remove Bucket.

El siguiente comando elimina un bucket dado.

$ aws s3 rb s3://tgsbucket
remove_bucket: tgsbucket
Si el bucket que estás intentando eliminar no existe, recibirás el siguiente mensaje de error.

$ aws s3 rb s3://tgsbucket1
remove_bucket failed: s3://tgsbucket1 An error occurred (NoSuchBucket) when calling the DeleteBucket operation: The specified bucket does not exist

Eliminar bucket S3 (y todos sus objetos)

Si el bucket contiene algún objeto, aparecerá el siguiente mensaje de error:

$ aws s3 rb s3://tgsbucket
remove_bucket failed: s3://tgsbucket An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty
Para eliminar un bucket junto con todos sus objetos, usa la opción –force como se muestra a continuación.

$ aws s3 rb s3://tgsbucket --force
delete: s3://tgsbucket/demo/getdata.php
delete: s3://tgsbucket/ipallow.txt
delete: s3://tgsbucket/demo/servers.txt
delete: s3://tgsbucket/demo/
remove_bucket: tgsbucket

Listado de todos los buckets S3

Para ver todos los buckets que posee el usuario, ejecuta el siguiente comando ls.

$ aws s3 ls
2019-02-06 11:38:55 tgsbucket
2018-12-18 18:02:27 etclinux
2018-12-08 18:05:15 readynas
..
..
En la salida anterior, la marca de tiempo es la fecha en que se creó el depósito. La zona horaria se ha ajustado para que se muestre en la zona horaria de tu ordenador portátil.

El siguiente comando es el mismo que el anterior:

aws s3 ls s3://

Listado de todos los objetos de un bucket

El siguiente comando muestra todos los objetos y prefijos que hay debajo del bucket.

$ aws s3 ls s3://tgsbucket
                           PRE config/
                           PRE data/
2019-04-07 11:38:20         13 getdata.php
2019-04-07 11:38:20       2546 ipallow.php
2019-04-07 11:38:20          9 license.php
2019-04-07 11:38:20       3677 servers.txt
En la salida anterior:
  • Dentro del bucket, hay dos carpetas de configuración y datos (indicadas por PRE).
  • PRE significa Prefijo de un objeto S3.
  • Dentro del bucket tenemos 4 archivos en el nivel raiz.
  • La marca de tiempo es cuando se creó el archivo.
  • La segunda columna muestra el tamaño del objeto S3.
Nota: El resultado anterior no muestra el contenido de las subcarpetas de configuración y datos.

Listado de todos los objetos de un bucket de forma recursiva

Para mostrar todos los objetos de forma recursiva, incluyendo el contenido de las subcarpetas, ejecuta el siguiente comando.

$ aws s3 ls s3://tgsbucket --recursive
2019-04-07 11:38:19       2777 config/init.xml
2019-04-07 11:38:20         52 config/support.txt
2019-04-07 11:38:20       1758 data/database.txt
2019-04-07 11:38:20         13 getdata.php
2019-04-07 11:38:20       2546 ipallow.php
2019-04-07 11:38:20          9 license.php
2019-04-07 11:38:20       3677 servers.txt
Nota: Cuando estés listando todos los archivos, observa que no hay un indicador PRE en la segunda columna de las carpetas.

Tamaño total de todos los objetos en un bucket S3

Puedes identificar el tamaño total de todos los archivos de tu bucket S3 mediante la combinación de las siguientes tres opciones: recursive (recursivo), human-readable (legible por humanos) y summarize (resumen).

Nota: A continuación se muestra el tamaño y cantidad total de archivos del bucket S3.

$ aws s3 ls s3://tgsbucket --recursive  --human-readable --summarize
2019-04-07 11:38:19    2.7 KiB config/init.xml
2019-04-07 11:38:20   52 Bytes config/support.txt
2019-04-07 11:38:20    1.7 KiB data/database.txt
2019-04-07 11:38:20   13 Bytes getdata.php
2019-04-07 11:38:20    2.5 KiB ipallow.php
2019-04-07 11:38:20    9 Bytes license.php
2019-04-07 11:38:20    3.6 KiB servers.txt

Total Objects: 7
   Total Size: 10.6 KiB
En la salida anterior:
  • La opción recursive se asegura de que muestran todos los archivos del bucket s3, incluyendo las subcarpetas.
  • La opción human-readable muestra el tamaño de archivos en formato legible. Los valores posibles que verás en la segunda columna para el tamaño son: Bytes / MiB / KiB / GiB / TiB / PiB / EiB.
  • La opción summarize se asegura de mostrar las dos últimas líneas en la salida anterior, que indica la cantidad total de objetos del bucket S3 y el tamaño total de todos esos objetos.

Solicitar listado de pagador

Si un bucket específico está configurado como el solicitante paga los buckets, entonces si accedes a los objetos de ese bucket, entiendes que eres responsable del pago de esa solicitud de acceso. En este caso, el propietario del bucket no tiene que pagar por el acceso.

Para indicar esto en tu comando ls, tendrás que especificar la opción –request-payer como se muestra a continuación.

$ aws s3 ls s3://tgsbucket --recursive --request-payer requester
2019-04-07 11:38:19       2777 config/init.xml
2019-04-07 11:38:20         52 config/support.txt
2019-04-07 11:38:20       1758 data/database.txt
2019-04-07 11:38:20         13 getdata.php
2019-04-07 11:38:20       2546 ipallow.php
2019-04-07 11:38:20          9 license.php
2019-04-07 11:38:20       3677 servers.txt
Para una URL firmada, asegúrate de incluir x-amz-request-payer = requester en la solicitud.

Copiar archivos locales al bucket S3

En el siguiente ejemplo, estamos copiando el archivo getdata.php del ordenador portátil local al bucket S3.

$ aws s3 cp getdata.php s3://tgsbucket
upload: ./getdata.php to s3://tgsbucket/getdata.php
Si quieres copiar getdata.php a un bucket S3 con un nombre diferente, haz lo siguiente:

$ aws s3 cp getdata.php s3://tgsbucket/getdata-new.php
upload: ./getdata.php to s3://tgsbucket/getdata-new.php
Para el archivo local, también puedes especificar la ruta completa como se muestra a continuación.

$ aws s3 cp /home/project/getdata.php s3://tgsbucket
upload: ../../home/project/getdata.php to s3://tgsbucket/getdata.php

Copiar una carpeta local con todos sus archivos al bucket S3

En este ejemplo, estamos copiando todos los archivos de la carpeta "data" que se encuentra en el directorio /home/projects al bucket S3.

$ cd /home/projects

$ aws s3 cp data s3://tgsbucket --recursive
upload: data/parameters.txt to s3://tgsbucket/parameters.txt
upload: data/common.txt to s3://tgsbucket/common.txt
..
En el ejemplo anterior, observa que solo se suben los archivos de la carpeta local data/, no la carpeta "data" en sí.

Si quieres subir la carpeta de datos desde local al bucket s3 como, especifica el nombre de la carpeta después del nombre del bucket como se muestra a continuación.

$ aws s3 cp data s3://tgsbucket/data --recursive
upload: data/parameters.txt to s3://tgsbucket/data/parameters.txt
upload: data/common.txt to s3://tgsbucket/data/common.txt
..
..

Descargar un archivo de un bucket S3

Para descargar un archivo específico de un bucket S3, haz lo siguiente. A continuación se copia getdata.php del bucket s3 dado al directorio actual.

$ aws s3 cp s3://tgsbucket/getdata.php .
download: s3://tgsbucket/getdata.php to ./getdata.php
Se puede descargar el archivo a la máquina local con un nombre diferente, como se muestra a continuación.

$ aws s3 cp s3://tgsbucket/getdata.php getdata-local.php
download: s3://tgsbucket/getdata.php to ./getdata-local.php
Descarga el archivo del bucket S3 a una carpeta específica de la máquina local como se muestra a continuación. En el siguiente ejemplo descargamos el archivo getdata.php a la carpeta /home/project de la máquina local.

$ aws s3 cp s3://tgsbucket/getdata.php /home/project/
download: s3://tgsbucket/getdata.php to ../../home/project/getdata.php

Descargar todos los archivos de forma recursiva desde un bucket S3 (usando cp)

En el siguiente ejemplo se descargan todos los archivos del bucket al directorio actual de tu ordenador portátil.

$ aws s3 cp s3://tgsbucket/ . --recursive
download: s3://tgsbucket/getdata.php to ./getdata.php
download: s3://tgsbucket/config/init.xml ./config/init.xml
..
Si quieres descargar todos los archivos de un bucket S3 a una carpeta específica en local, especifica la ruta completa del directorio local como se muestra a continuación.

$ aws s3 cp s3://tgsbucket/ /home/projects/tgsbucket --recursive
download: s3://tgsbucket/getdata.php to ../../home/projects/tgsbucket/getdata.php
download: s3://tgsbucket/config/init.xml to ../../home/projects/tgsbucket/config/init.xml
..
En el comando anterior, si la carpeta tgsbucket no existe en /home/projects, la creará automáticamente.

Copiar un archivo de un bucket a otro

El siguiente comando copiará el archivo config/init.xml del bucket original al bucket de respaldo como se muestra a continuación.

$ aws s3 cp s3://tgsbucket/config/init.xml s3://backup-bucket
copy: s3://tgsbucket/config/init.xml to s3://backup-bucket/init.xml
En el ejemplo anterior, aunque el archivo init.xml estaba en la carpeta de configuración del bucket de origen, en el bucket de destino se copió el archivo init.xml en el nivel superior del bucket de respaldo.

Si quieres copiar la misma carpeta desde el origen al destino junto con el archivo, especifica el nombre de la carpeta en los buckets, como se muestra a continuación.

$ aws s3 cp s3://tgsbucket/config/init.xml s3://backup-bucket/config
copy: s3://tgsbucket/config/init.xml to s3://backup-bucket/config/init.xml
Si el bucket de destino no existe, recibirás el siguiente mensaje de error.

$ aws s3 cp s3://tgsbucket/test.txt s3://backup-bucket-777
copy failed: s3://tgsbucket/test.txt to s3://backup-bucket-777/test.txt An error occurred (NoSuchBucket) when calling the CopyObject operation: The specified bucket does not exist

Copiar todos los archivos de forma recursiva de un bucket a otro

El siguiente ejemplo copia todos los archivos del bucket de origen, incluyendo los archivos de las subcarpetas, en el bucket de destino.

$ aws s3 cp s3://tgsbucket s3://backup-bucket --recursive
copy: s3://tgsbucket/getdata.php to s3://backup-bucket/getdata.php
copy: s3://tgsbucket/config/init.xml s3://backup-bucket/config/init.xml
..

Mover un archivo de local a un bucket S3

Cuando mueves un archivo de la máquina local al bucket S3, como es de esperar, el archivo se moverá físicamente de la máquina local al bucket S3.

$ ls -l source.json
-rw-r--r--  1 ramesh  sysadmin  1404 Apr  2 13:25 source.json

$ aws s3 mv source.json s3://tgsbucket
move: ./source.json to s3://tgsbucket/source.json
Como se puede ver, el archivo no existe en la máquina local después de moverlo. Ahora solo está en el bucket S3.

$ ls -l source.json
ls: source.json: No such file or directory

Mover un archivo de un bucket S3 a local

El siguiente ejemplo es lo inverso al ejemplo anterior. Aquí, el archivo se mueve desde el bucket S3 a la máquina local.

Como se puede ver a continuación, el archivo ahora existe en el bucket s3.

$ aws s3 ls s3://tgsbucket/getdata.php
2019-04-06 06:24:29       1758 getdata.php
Movemos el archivo desde el bucket S3 al directorio /home/project de la máquina local.

$ aws s3 mv s3://tgsbucket/getdata.php /home/project
move: s3://tgsbucket/getdata.php to ../../../home/project/getdata.php
Una vez movido, el archivo ya no existe en el bucket S3.

$ aws s3 ls s3://tgsbucket/getdata.php

Mover un archivo de un bucket S3 a otro

Antes del movimiento, el archivo source.json está en el bucket de origen.

$ aws s3 ls s3://tgsbucket/source.json
2019-04-06 06:51:39       1404 source.json
Este archivo no está en el bucket de respaldo.

$ aws s3 ls s3://backup-bucket/source.json
$
Movemos el fichero desde el bucket de origen al bucket de respaldo.

$ aws s3 mv s3://tgsbucket/source.json s3://backup-bucket
move: s3://tgsbucket/source.json to s3://backup-bucket/source.json
Ahora, el archivo está solo en el bucket de respaldo.

$ aws s3 ls s3://tgsbucket/source.json
$

$ aws s3 ls s3://backup-bucket/source.json
2019-04-06 06:56:00       1404 source.json

Mover todos los archivos desde una carpeta local a un bucket S3

En este ejemplo, tenemos los siguientes archivos en la carpeta de datos.

$ ls -1 data
dnsrecords.txt
parameters.txt
dev-setup.txt
error.txt
Movemos todos los archivos que hay en el directorio de datos de la máquina local al bucket.

$ aws s3 mv data s3://tgsbucket/data --recursive
move: data/dnsrecords.txt to s3://tgsbucket/data/dnsrecords.txt
move: data/parameters.txt to s3://tgsbucket/data/parameters.txt
move: data/dev-setup.txt to s3://tgsbucket/data/dev-setup.txt
move: data/error.txt to s3://tgsbucket/data/error.txt

Mover todos los archivos del bucket S3 a la carpeta local

En este ejemplo partimos de una carpeta de datos local vacía.

$ ls -1 localdata
$
Movemos todos los archivos de la carpeta de datos del bucket S3 a la carpeta de datos de tu máquina local.

$ aws s3 mv s3://tgsbucket/data/ localdata --recursive
move: s3://tgsbucket/data/dnsrecords.txt to localdata/dnsrecords.txt
move: s3://tgsbucket/data/parameters.txt to localdata/parameters.txt
move: s3://tgsbucket/data/dev-setup.txt to localdata/dev-setup.txt
move: s3://tgsbucket/data/error.txt to localdata/error.txt
Aquí está la salida después del movimiento anterior.

$ aws s3 ls s3://tgsbucket/data/
$

$ ls -1 localdata
dnsrecords.txt
parameters.txt
dev-setup.txt
error.txt

Mover todos los archivos de un bucket S3 a otro

Utiliza la opción recursive para mover todos los archivos de un bucket a otro como se muestra a continuación.

$ aws s3 mv s3://tgsbucket s3://backup-bucket --recursive
move: s3://tgsbucket/dev-setup.txt to s3://backup-bucket/dev-setup.txt
move: s3://tgsbucket/dnsrecords.txt to s3://backup-bucket/dnsrecords.txt
move: s3://tgsbucket/error.txt to s3://backup-bucket/error.txt
move: s3://tgsbucket/parameters.txt to s3://backup-bucket/parameters.txt

Eliminar un archivo de un bucket S3

Para eliminar un archivo específico de un bucket S3, usa la opción rm como se muestra a continuación. El siguiente ejemplo elimina el archivo queries.txt del bucket S3.

$ aws s3 rm s3://tgsbucket/queries.txt
delete: s3://tgsbucket/queries.txt

Eliminar todos los objetos de un bucket S3

Cuando se especifica la opción rm con un único nombre de bucket, no hace nada. Esto no eliminará ningún archivo del bucket.

aws s3 rm s3://tgsbucket
Para eliminar todos los archivos de un bucket S3, usa la opción –recursive como se muestra a continuación.

$ aws s3 rm s3://tgsbucket --recursive
delete: s3://tgsbucket/dnsrecords.txt
delete: s3://tgsbucket/common.txt
delete: s3://tgsbucket/parameters.txt
delete: s3://tgsbucket/config/init.xml
..

Sincronizar archivos desde el portatil a un bucket S3

Cuando uses el comando sync, este copia recursivamente solo los archivos nuevos o actualizados del directorio de origen al destino.

El siguiente ejemplo sincroniza los archivos del directorio de respaldo desde la máquina local al bucket.

$ aws s3 sync backup s3://tgsbucket
upload: backup/docker.sh to s3://tgsbucket/docker.sh
upload: backup/address.txt to s3://tgsbucket/address.txt
upload: backup/display.py to s3://tgsbucket/display.py
upload: backup/getdata.php to s3://tgsbucket/getdata.php
Si desea sincronizarlo con una subcarpeta de copia de seguridad en el bucket S3, incluye el nombre de la carpeta en el bucket s3 como se muestra a continuación.

$ aws s3 sync backup s3://tgsbucket/backup
upload: backup/docker.sh to s3://tgsbucket/backup/docker.sh
upload: backup/address.txt to s3://tgsbucket/backup/address.txt
upload: backup/display.py to s3://tgsbucket/backup/display.py
upload: backup/getdata.php to s3://tgsbucket/backup/getdata.php
Una vez que realices la sincronización una vez, si vuelves a ejecutar el comando de manera inmediata, no hará nada, ya que no hay archivos nuevos o actualizados en el directorio de respaldo local.

$ aws s3 sync backup s3://tgsbucket/backup
$
Vamos a probar a crear un nuevo archivo en la máquina local.

echo "New file" > backup/newfile.txt
Si ejecutamos ahora el sync, sincronizará solo este nuevo archivo con el bucket S3.

$ aws s3 sync backup s3://tgsbucket/backup
upload: backup/newfile.txt to s3://tgsbucket/backup/newfile.txt

Sincronizar un archivo desde el bucket S3 a local

Esto es lo inverso al ejemplo anterior. Aquí, estamos sincronizando los archivos del bucket S3 con la máquina local.

$ aws s3 sync s3://tgsbucket/backup /tmp/backup
download: s3://tgsbucket/backup/docker.sh to ../../tmp/backup/docker.sh
download: s3://tgsbucket/backup/display.py to ../../tmp/backup/display.py
download: s3://tgsbucket/backup/newfile.txt to ../../tmp/backup/newfile.txt
download: s3://tgsbucket/backup/getdata.php to ../../tmp/backup/getdata.php
download: s3://tgsbucket/backup/address.txt to ../../tmp/backup/address.txt

Sincronizar archivos de un bucket S3 a otro

El siguiente ejemplo sincroniza los archivos de un bucket de origen a un bucket de respaldo.

$ aws s3 sync s3://tgsbucket s3://backup-bucket
copy: s3://tgsbucket/backup/newfile.txt to s3://backup-bucket/backup/newfile.txt
copy: s3://tgsbucket/backup/display.py to s3://backup-bucket/backup/display.py
copy: s3://tgsbucket/backup/docker.sh to s3://backup-bucket/backup/docker.sh
copy: s3://tgsbucket/backup/address.txt to s3://backup-bucket/backup/address.txt
copy: s3://tgsbucket/backup/getdata.php to s3://backup-bucket/backup/getdata.php

Configurar el bucket S3 como sitio web

También se puede hacer que el bucket S3 aloje un sitio web estático como se muestra a continuación. Para ello, debes especificar tanto el documento de índice como el documento de error.

aws s3 website s3://tgsbucket/ --index-document index.html --error-document error.html
Este bucket está en la región us-east-1, por lo que una vez que hayas hecho lo anterior, podrás acceder al bucket como un sitio web utilizando la siguiente URL: http://tgsbucket.s3-website-us-east-1.amazonaws.com/

Para que esto funcione correctamente, asegúrate de configurar el acceso público a este bucket S3, ya que ahora actúa como un sitio web.

URL con firma previa de un objeto S3 para acceso temporal

Cuando realizas una firma previa de una URL para un archivo S3, cualquier persona a la que se le haya proporcionado esta URL puede recuperar el archivo S3 con una solicitud HTTP GET.

Por ejemplo, si quieres dar acceso al archivo dnsrecords.txt a alguien temporalmente, realiza la firma previa de este objeto específico de S3 como se muestra a continuación.

$ aws s3 presign s3://tgsbucket/dnsrecords.txt
https://tgsbucket.s3.amazonaws.com/error.txt?AWSAccessKeyId=AAAAAAAAAAAAAAAAAAAA&Expires=1111111111&Signature=ooooooooooo%2Babcdefghijlimmm%3A
La salida del comando anterior será una URL HTTPS, que se puede entregar a alguien que debería poder descargar el archivo dnsrecords.txt de tu bucket S3.

La URL anterior será válida de forma predeterminada durante 3600 segundos (1 hora).

Si quieres especificar un tiempo de vencimiento corto, usa la siguiente opción de vencimiento. El siguiente ejemplo creará una URL pre-firmada que es válida solo por 1 minuto.
Expires-in (entero) Número de segundos hasta que caduca la URL firmada previamente. El valor predeterminado es de 3600 segundos.

$ aws s3 presign s3://tgsbucket/dnsrecords.txt --expires-in 60
https://tgsbucket.s3.amazonaws.com/error.txt?AWSAccessKeyId=AAAAAAAAAAAAAAAAAAAA&Expires=1111111111&Signature=ooooooooooo%2Babcdefghijlimmm%3A
Si alguien intenta acceder a la URL después del tiempo de vencimiento, verá el siguiente mensaje de Acceso denegado.

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<Expires>2019-04-07T11:38:12Z</Expires>
<ServerTime>2019-04-07T11:38:21Z</ServerTime>
<RequestId>1111111111111111</RequestId>
<HostId>
mmmmmmmmmm/ggggggggg
</HostId>
</Error>
Buen aprendizaje !!!

0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!