Ottieni object da S3 nella funzione AWS Lambda e invia ad Api Gateway

Sto cercando di ottenere un file .jpg da un bucket e di inviarlo al gateway API. Credo di avere il setup corretto visto che vedo cose che vengono registrate. Cattura il file da s3 bene, e gm è la libreria graphicsmagick. Non sono sicuro se lo sto usando giusto però.

Nella funzione lambda lo faccio (un sacco di codice viene dall’esempio aws):

async.waterfall([ function download(next) { console.log(srcKey); console.log(srcBucket); // Download the image from S3 into a buffer. s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function transform(response, next) { console.log(response); next(null, 'image/jpeg', gm(response.Body).quality(85)); }, function sendData(contentType, data, next){ console.log(contentType); console.log(data); imageBuffer = data.sourceBuffer; context.succeed(imageBuffer); } ] ); 

L’intestazione della risposta ha una lunghezza del contenuto: 85948, che non sembra corretta perché il file originale è solo 36kb. Qualcuno sa cosa sto sbagliando?

È ansible ottenere l’integrazione <-> Gateway API <-> Lambda <-> S3 con facilità.

In lambda, invece di json, restituisce la rappresentazione di stringa base64 dell’immagine ( buffer.toString('base64') ), forza il gateway API per convertire la stringa in binario e aggiungere specifici Content-Type (in modo da non dover usare il loro limitato supporto binario che ti impone di inviare un’intestazione Accept specifica).

Nella console AWS, vai a Gateway API, quindi vai al metodo pertinente e aggiorna le impostazioni:

  • Richiesta di integrazione

    • Deselezionare: utilizza l’integrazione del proxy Lambda
  • Risposta al metodo

    • Aggiungi risposta -> Stato HTTP: 200
    • Aggiungi intestazione: tipo di contenuto
  • Integration Response -> Header Mapping -> Response header -> Content-Type

    • Valore di mapping: ‘image / jpeg’ (materia a quota singola)

Dalla riga di comando, eseguire il comando seguente per forzare la conversione della stringa in binario. Per prima cosa, recupera il rest-api-id e l’ id-risorsa dal gateway API. Quindi, esegui in CLI (sostituisci rest-api-id e resource-id con il tuo):

 aws apigateway put-integration-response --rest-api-id  --resource-id  --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY 

Non utilizzare API Gateway per trasferire il contenuto binario quando lo si utilizza con Lambda . API Gateway con Lambda sono configurati per rispondere con dati XML/JSON . Leggi di più sul perché e come qui .

Prova a cambiare la catena di callback in modo che rimandi l’immagine modificata a S3 . Dopo aver completato il caricamento, rimanda l’ URI dell’object target e reindirizza il tuo client su di esso.