Ampliando la vida útil de tu pre-sign URL en S3 (hasta 7 días!)
Guillermo Ruiz
Posted on August 30, 2023
Hace unos días me encontré en la situación de tener que compartir un archivo almacenado en S3. Si alguna vez habéis utilizado el servicio, os habréis dado cuenta que por defecto todos los objetos almacenados son privados y que para compartir, es necesario crear un pre-sign URL. El problema surge cuando lo haces directamente desde la consola, porque el tiempo máximo que puedes tener una URL prefirmada es de 12 horas. Esto puede limitar el intercambio de información, especialmente cuando existe una diferencia horaria con tus contactos.
¿Qué podemos hacer?
Afortunadamente, AWS ofrece opciones para extender la duración de tu pre-sign URL. Puedes utilizas la línea de comandos (CLI) o el SDK, ¡y extender hasta 7 días la URL!
Veamos cómo hacerlo. Para ello utilizaremos un episodio del podcast Charlas Técnicas en AWS a modo de ejemplo.
Pre-requisitos:
- Disponer de cuenta en AWS.
- Terminal en tu ordenador (ej: iTerm o equivalente)
- Acceso a la documentación oficial de AWS CLI: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
En el enlace anterior podréis ver cómo hacerlo en Linux, Windows o Mac. En nuestro caso, lo haremos en macOS:
STEP 1: Abrimos un terminal en nuestro ordenador y descargamos el archivo CLI utilizando el comando curl. Al descargarlo tendremos que especificarle el nombre del archivo con el que queremos guardarlo en nuestro directorio. Esto lo haremos con la opción -o y mantendremos el mismo nombre que el fichero original: AWSCLIV2.pkg.
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
STEP 2 : Una vez descargado, es el momento de la instalación. Ejecutamos el siguiente comando:
$ sudo installer -pkg ./AWSCLIV2.pkg -target /
donde:
- -pkg: especificamos el nombre del archivo a instalar, en nuestro caso AWSCLIV2.pkg.
- -target/ : indicamos dónde queremos instalarlo. Los ficheros se instalarán en /usr/local/aws-cli y se creará una entrada en /usr/local/bin.
STEP 3 : Verificamos que la instalación se ha completado y comprobamos la versión de CLI instalada:
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.12.7 Python/3.11.4 Darwin/22.4.0 exe/x86_64 prompt/off
Probemos a ver si podemos ejecutar algún comando…
$ aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
Oups! Parece que tenemos que darle permisos, así que es hora de saltar a la consola (de forma temporal. En cuanto tengamos los permisos configurados nos olvidaremos de ella).
STEP 4: Desde la consola buscamos el servicio IAM y accedemos a él:
Una vez abierta la consola en IAM > Users , le damos al botón Add users
Tendremos 3 pasos por delante:
- Especificar los datos de usuario. En nuestro caso: s3-cli
- Establecer los permisos. Asociaremos nuestro usuario a un nuevo grupo que llamaremos s3-cli-admin y al que le pasaremos las policies de S3 (así para futuras operaciones con otros servicios ya lo tendremos configurado).
- Verificar los parámetros y crear el usuario.
STEP 4.1 : Datos de Usuario
STEP 4.2: Crearemos un grupo de usuario s3-cli-admin (1) al que le aplicaremos las policies de s3:
Una vez creado el grupo con los permisos le asignamos nuestro usuario s3-cli:
STEP 4.3: Ya tendríamos nuestro usuario s3-cli con los permisos necesarios para operar sobre el servicio s3. Nos queda un último detalle, las credenciales. Vayamos a la pestaña Security Credentials
En nuestro caso utilizaremos la línea de comandos (CLI). AWS nos recomienda utilizar CloudShell o usar la CLI que nos acabamos de instalar (AWS CLI V2) a través de un usuario en el IAM Identity center.
Mi madre siempre decía “cuando te recomiendan algo por algo será”…aunque por ahora, simplemente crearemos nuestra clave de acceso.
El siguiente paso (añadir una descripción al tag) es opcional, así que nos vamos directamente y le damos a crear. Nos bajaremos el fichero .csv donde tendremos las credenciales para nuestro usuario.
Ya estamos listos para empezar!
STEP 5: Creando perfil
TIP Si tienes múltiples cuentas en AWS te interesará crear diferentes perfiles que te ayuden a saber en qué cuenta estás (si vives permanentemente en un terminal). En nuestro caso, crearemos un perfil llamado s3-cli-profile y le pasaremos las credenciales obtenidas en el paso anterior:
$ aws configure —profile s3-cli-profile
AWS Access Key ID [None]: AIDAUDDLJ7UPL7GGL5GRE
AWS Secret Access Key [None]: <password_from_csv_file>
Default region name [None]: eu-south-1
Default output format [None]:
$
Una vez creado los perfiles tendremos qué indicar qué perfil vamos a utilizar. En nuestro caso solo hemos definido uno, por lo que exportaremos en la variable de entorno AWS_PROFILE el nombre del perfil:
$ export AWS_PROFILE=s3-cli-profile
Para verificar si nuestro perfil está activo:
$ aws sts get-caller-identity
{
"UserId": "AIDAUDDLJ7UPL7GGL5GRE",
"Account": "777117770702",
"Arn": "arn:aws:iam::777117770702:user/s3-cli"
}
$
Estamos en la cuenta correcta, así que comprobamos si podemos listar todos los buckets de S3 que tenemos configurados:
$ aws s3 ls
2023-03-30 10:43:54 awscharlastenicas
2023-02-08 19:15:07 cloudtrail-awslogs-xxxx
2023-04-14 15:26:32 do-not-delete-xxxx
$
STEP 6: Generando pre-sign URL
Ya solo nos queda crear la URL pre-signed y darle el máximo tiempo que nos permite que son 7 días (604800 segundos). Y con esto estaremos listo para compartir y olvidarnos de tener que estar pendientes si expira o no el acceso al archivo durante la semana.
Nota Tened cuidado a la hora de nombrar los archivos que tenéis en el bucket. Es recomendable seguir las mejores prácticas, de lo contrario os podéis encontrar que al copiar el S3 URI tengáis problemas al intentar generar el enlace.
$ aws s3 presign s3://awscharlastenicas/411_IA_Generativa_Final.mp4 —expires-in 604800
https://awscharlastenicas.s3.eu-west-1.amazonaws.com/411_IA_Generativa_Final.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AIDAUDDLJ7UPL7GGL5GRE%2F20230707%2Feu-south-1%2Fs3%2Faws4_request&X-Amz-Date=20230707T090579Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=f1bd693f06ee73b950de8fe34216ea385aaaec4b45731dd908a1dbea0ed06155$
Copiamos la URL generada en nuestro navegador y voilá! Ya lo tenemos.
TAGS: awsdevelopersS3
Posted on August 30, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.