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.