¿Cómo configurar una aplicación para subir imágenes a Amazon S3?
En el entorno de desarrollo actual, la implementación de aplicaciones serverless se ha vuelto una habilidad fundamental. En esta sección, exploraremos cómo crear una aplicación que permite almacenar imágenes en un bucket de Amazon S3 utilizando funciones lambda y API Gateway. Este proceso te permitirá generar URLs firmadas para que los usuarios puedan cargar imágenes de manera segura.
¿Cómo construir una función Lambda para firmar URLs?
La función Lambda es un componente crucial en este flujo, ya que genera la URL firmada que permite cargar imágenes al bucket de S3:
- Importar SDK de Amazon: Asegúrate de incluir el SDK de Amazon para crear un cliente de S3.
- Versión de firma: Utiliza el 'signature version 4'; permite firmar URLs, lo que es esencial para la seguridad de la aplicación.
- Manejador (Handler): Define una función asíncrona que actúe como manejador, utilizando el objeto
event
y context
.
- Parámetros URL: Extrae el nombre del archivo del
event
dentro de queryStringParameters
para que S3 reciba el nombre adecuado.
- Generación de URL firmada: Usa el método
putObject
del cliente S3 para determinar el método que se empleará con esa URL, especificando el key
, el bucket
y el tiempo de expiración.
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
signatureVersion: 'v4',
});
exports.handler = async (event) => {
const filename = event.queryStringParameters.filename;
const signedURL = s3.getSignedUrl('putObject', {
Bucket: process.env.BUCKET,
Key: `upload/${filename}`,
Expires: 300,
});
return {
statusCode: 200,
body: signedURL,
};
};
¿Cómo configurar el archivo serverless.yaml
?
El archivo serverless.yaml
es fundamental para describir la infraestructura serverless de tu aplicación:
- Variables de entorno: Define las variables dentro del proveedor con un nuevo
key
llamado environment
donde se configurará, por ejemplo, el bucket.
provider:
environment:
BUCKET: nombreDelBucket
- Definición de funciones Lambda: Crea una nueva función lambda en el archivo para firmar URLs, definiendo su handler y otros parámetros.
- Eventos y parámetros HTTP: Usa un evento HTTP tipo GET en el que especifiques query strings necesarios, como
filename
.
functions:
signedURL:
handler: signedURL.handler
events:
- http:
path: signedURL
method: get
request:
parameters:
querystrings:
filename: true
¿Cómo otorgar permisos adecuados a las funciones?
Para asegurar que tu función pueda interactuar con S3:
- Permisos IAM: Añade permisos al rol de la función lambda para interactuar con el bucket S3, asegurándote de especificar el ARN del bucket.
iamRoleStatements:
- Effect: 'Allow'
Action:
- 's3:*'
Resource:
- 'arn:aws:s3:::nombreDelBucket/*'
Esta configuración de permisos es básica para este tutorial, pero deberías ajustarla a solo los permisos necesarios para mejorar la seguridad.
¿Cómo probar la URL firmada con Postman?
Después de desplegar tu aplicación, es importante verificar su funcionalidad:
- Crear un request GET: Usa Postman para enviar un request GET a tu endpoint de firma, asegurándote que incluya el parámetro
filename
.
- Verificar respuesta: Debe devolver una URL larga, lo que indica que fue firmada correctamente.
- Subir una imagen: Utiliza la URL firmada para un request PUT en Postman, adjuntando la imagen en el
body
-> Binary
.
Conclusiones y recomendaciones de buenas prácticas
- Seguridad de URLs: Las URLs firmadas proporcionan transacciones seguras y limitan el tiempo de accesibilidad, lo que aumenta la seguridad del bucket.
- Documentación Serverless: Familiarízate con la documentación oficial de Serverless Framework para modelos de permisos más detallados.
- Optimización de permisos: Ajusta los permisos del bucket S3 y de la función lambda para mantener la seguridad de tu aplicación siguiendo las mejores prácticas de AWS.
Estas instrucciones te permitirán construir una aplicación robusta que capitaliza los servicios serverless de AWS, proporcionando a tus usuarios una experiencia segura y eficiente al manejar almacenamiento de imágenes. ¡Continúa practicando y explorando para perfeccionar tus habilidades!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?