Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/crissalvarezh/upload-multipart-to-s3

Upload big files with multipart signed urls to s3
https://github.com/crissalvarezh/upload-multipart-to-s3

Last synced: 17 days ago
JSON representation

Upload big files with multipart signed urls to s3

Awesome Lists containing this project

README

        

## Descripción
En este proyecto se expone una forma de subir archivos grandes a aws s3 por partes usando url prefirmadas evitando pasar por servicios propios para no tener problemas de storage o timeout

## Proceso
La idea principal es llevar el procesamiento del archivo al frontend, el cual será encargado de partir el archivo y enviar cada parte directamente a aws s3, para esto requerirá de urls
prefirmadas las cuales consultará al backend. El backend se encargará de generar las urls prefirmadas para cada parte del archivo a subir así como tambien de comunicarse con s3 para
notificar que todas las partes han sido subidas exitosamente, completando así el proceso.

Es posible ejecutar asincronamente el envío de cada parte, tambien se puede configurar el envio por batches, de esta forma si deseamos enviar de 3 partes al tiempo se vería de la siguiente manera:

Una vez completada la subida de todas las partes el frontend realiza una llamada final a `/complete`

## Requerimientos
Aparte de tener credenciales de aws con permisos suficiente para subir archivos ya sea cargados por sesión o por variables de entorno directamente en el codigo, tambien será
necesario configurar los CORS del bucket para aceptar por un lado la subida directa del frontend así como tambien la lectura del header Etag que permite identficar cada parte subida.
La configuración se ve de la siguiente manera en la consola de aws:

```json
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"PUT"
],
"AllowedOrigins": [
"http://localhost:3000"
],
"ExposeHeaders": [
"Etag"
],
"MaxAgeSeconds": 3600
}
]

```
`MaxAgeSeconds` en 3600 (1 hora) permite evitar la ejecución de muchas peticiones preflight

> Esta configuración se encuentra en: AWS S3 > Bucker > Permissions tab > CORS configuration

Por otro lado, el rol encargado de subir iniciar la multipart upload, generar las urls prefirmadas y completar la carga debe tener los siguientes permisos
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts",
"s3:ListBucketMultipartUploads",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::/*",
"arn:aws:s3:::"
],
"Effect": "Allow"
}
]
}
```

## Correr localmente

```bash
npm run dev
```