Este proyecto permite subir archivos a Amazon S3 mediante una API construida con FastAPI y desplegada en AWS Lambda. Los archivos se reciben en formato base64, se validan y se suben a un bucket de S3. Además, se permite especificar la partición (carpeta) en la que se desea almacenar el archivo.
- Python 3.8+
- AWS Account (con permisos para crear Lambda y S3)
- AWS CLI (si se usa para despliegue)
fastapi==0.85.0
boto3==1.24.12
python-multipart==0.0.5
python-magic==0.4.18
pydantic==1.9.0
uvicorn==0.18.3-
Clona este repositorio:
git clone https://github.com/tuusuario/s3-upload-lambda.git cd s3-upload-lambda -
Crea un entorno virtual:
python3 -m venv venv source venv/bin/activate # Para macOS/Linux venv\Scripts\activate # Para Windows
-
Instala las dependencias:
pip install -r requirements.txt
-
Compila y despliega en AWS Lambda:
-
Crea un archivo
lambda_function.pyque importe y ejecute tu API FastAPI utilizandoMangum, que permite ejecutar FastAPI en AWS Lambda:from mangum import Mangum from app import app handler = Mangum(app)
-
Empaqueta el proyecto para Lambda:
Usa la herramienta
Zappao cualquier otra solución que prefieras para empaquetar y desplegar el código en Lambda. Ejemplo de comando usandozappa:zappa deploy dev
-
-
Configura tu Bucket de S3:
Asegúrate de tener un bucket de S3 disponible. La configuración del bucket debe incluir las políticas adecuadas de permisos para permitir la carga de archivos.
-
Prueba el despliegue:
Una vez desplegado en AWS Lambda, puedes probar la API con el ejemplo de solicitud
curl.
Aquí tienes un ejemplo de cómo hacer una solicitud curl para subir un archivo codificado en base64 a la API de Lambda:
curl -X POST "https://your-api-endpoint.amazonaws.com/dev/upload" -H "Content-Type: application/json" -d '{
"file_content": "BASE64_ENCODED_FILE_CONTENT",
"folder": "myfolder",
"filename": "example.png"
}'file_content: El contenido del archivo codificado en base64. Debes convertir tu archivo a base64 para enviarlo de esta forma.folder: La partición (o carpeta) dentro de S3 donde deseas almacenar el archivo. Si no se proporciona, el archivo se guardará en la raíz del bucket.filename: El nombre con el que deseas guardar el archivo en S3.
{
"message": "File uploaded successfully",
"s3_path": "myfolder/example.png",
"s3_url": "https://your-bucket-name.s3.amazonaws.com/myfolder/example.png"
}- Permisos de AWS Lambda: Asegúrate de que tu función Lambda tenga permisos suficientes para interactuar con S3 (política de IAM adecuada).
- Validación de Archivos: Actualmente, el sistema permite solo ciertos tipos de archivos no ejecutables (por ejemplo, imágenes, documentos PDF, texto, etc.). Asegúrate de que los tipos de archivo sean validados correctamente antes de proceder con la carga.
Las contribuciones son bienvenidas. Si tienes alguna mejora o corrección, abre un Pull Request.