2016-05-07 20 views
8

Ho un'API REST con API gateway e Lambda. Non voglio creare un endpoint per caricare un'immagine del profilo, che passa il file a una funzione Lambda, dove è stata ridimensionata, la registra nel database e restituisce il percorso dell'URL della nuova immagine.Caricamento di un'immagine tramite gateway API Amazon e lambda

Esiste un modo per farlo con tali servizi? Impossibile trovare nulla online (l'unico suggerimento che ho trovato è caricare direttamente su S3, che richiede permessi IAM, e avere un evento che attiva una funzione Lambda che ridimensiona l'immagine).

Grazie

UPDATE

AWS APIGATEWAY aggiornato e sapere che si può send binaries through an endpoint
Grazie alla @blue e @Manzo per commentare lo

+2

Il gateway API supporta ora dati binari ... – Manzo

+1

Sì, ad esempio: https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/ – balu

risposta

3

Caricamento di un file direttamente a S3 non necessariamente richiede permessi IAM. Dovresti creare un endpoint API che restituisca un pre-signed S3 URL, che potrebbe quindi essere utilizzato per caricare il file direttamente su S3. La funzione Lambda dietro l'endpoint dell'API sarebbe stata l'unica cosa che necessitava delle autorizzazioni IAM corrette per il bucket S3.

+6

Hai ragione, ma ho la mia funzione lambda che autorizza l'utente, e in base al suo id salva il file nel bucket s3. Non penso che lasciare che l'utente ottenga un URL s3 e quindi caricare il file sia una buona idea, il punto di un'API è di astrarre la logica e l'infrastruttura, l'utente non dovrebbe gestire tutte quelle cose o nemmeno sapere che usiamo s3 o aws –

1

Poiché gateway API e Lambda non supportano attualmente in modo nativo, è possibile passare il file a un'immagine in base64 codificata su gateway API quindi passare alla funzione Lambda. La tua funzione Lambda può essere decodificata in base64, quindi ridimensionata, registrarla nel database e restituire il percorso url della nuova immagine.

+0

Grazie. Ho provato quello che hai detto. Sto ottenendo 'Impossibile analizzare il corpo della richiesta in json: token non riconosciuto'. il mio 'richiesta temaplate' ha un puntello:' payload: $ input.body'. Dovrebbe restituire il corpo (file) come una stringa, ma invece genera un errore. –

+0

Risolto il problema! aggiungi '$ util.base64Encode()'. Il puntello assomiglia a questo: '" payload ":" $ util.base64Encode ($ input.body) "'. –

+0

Ora ricevo un file danneggiato. È su 'application/octet-stream', che non posso manipolare o determinare il tipo di immagine. Qualche soluzione per quello? –

Problemi correlati