2015-07-24 16 views
11

Sto cercando di utilizzare AWS API Gateway come proxy di fronte a un servizio di immagini. Sono in grado di far passare l'immagine ma viene visualizzata come una grossa porzione di ASCII perché Content-Type viene impostato su "application/json".Restituzione delle immagini tramite il gateway API AWS

C'è un modo per dire al gateway di non modificare affatto il tipo di contenuto di origine?

Voglio solo "immagine/jpeg", "immagine/png", ecc.

+0

Perché gateway API? Il tuo servizio di immagini viene eseguito in Lambda? Inoltre, il tipo di contenuto "fonte"? Presumibilmente ti stai riferendo alla "risposta". –

+0

C'è un motivo specifico per cui l'immagine deve essere restituita da Lambda? Un'alternativa sarebbe avere la funzione Lambda caricare l'immagine su S3 e restituire un collegamento a quell'immagine. – JaredHatfield

+0

@ Michael-sqlbot: potrei lanciare un proxy con qualcos'altro, ma poi avrei dovuto mantenerlo. AWS può presumibilmente gestire qualsiasi carico che potrei essere in grado di lanciare contro di esso. Inoltre, la memorizzazione nella cache potrebbe essere utile. La necessità di un proxy in primo luogo è la ricerca di google che vede le risorse sulla mia pagina come da un altro servizio della mia azienda (il tizio del SEO dice che pensa che stiamo raschiando). Dobbiamo utilizzare le stesse risorse, quindi voglio solo che assomiglino a un indirizzo diverso. Non è necessaria alcuna manipolazione/manipolazione per questa cosa, solo un proxy. Se puoi consigliare un altro servizio, controllerei. – kjs3

risposta

3

Mi scuso, in anticipo, per dare una risposta che non risponde direttamente alla domanda e suggerisce invece di adottare un approccio diverso ... ma basato sulla domanda e sui commenti, e sulla mia esperienza personale con ciò in cui credo di essere un'applicazione simile, sembra che tu stia usando lo strumento sbagliato per il problema, o almeno uno strumento che non è la scelta ottimale all'interno dell'ecosistema di AWS.

Se il servizio di immagini era in esecuzione all'interno di Amazon Lambda, la necessità di gateway API sarebbe più evidente. Assente, non lo vedo.

Amazon CloudFront fornisce il recupero di contenuti da un server back-end, memorizzazione nella cache del contenuto (in oltre 50 posizioni "edge" a livello globale), nessun addebito per la memorizzazione del contenuto memorizzato nella cache ed è possibile configurare fino a 100 nomi host distinti che puntano a una singola distribuzione di Cloudfront, oltre al nome host predefinito xxxxxxxx.cloudfront.net. Supporta anche SSL. Questo sembra quello che stai cercando di fare, e poi alcuni.

Io lo uso, con molto successo esattamente per lo scenario che descrivi: "un proxy di fronte a un servizio di immagine". Esattamente quello che fanno il mio servizio di immagini e il tuo servizio di immagine (il mio è un resizer che può cercare l'URL sorgente di immagini mancanti/mai prima richieste, recuperare e ridimensionare) ma fondamentalmente sembra che stiamo realizzando uno scopo simile . Curiosamente, la struttura dei prezzi di CloudFront in alcune regioni (come us-east-1 e us-west-2) è tale che non è solo conveniente, ma in realtà l'utilizzo di CloudFront può essere quasi $ 0,005 più economico di non usarlo per gigabyte scaricato.

Nel mio caso, oltre al servizio di immagine di back-end, ho anche un bucket S3 con un singolo file, collegato a un singolo percorso nella distribuzione CloudFront (come una seconda "origine personalizzata"), al solo scopo di servire fino /robots.txt, per controllare l'accesso diretto alle mie immagini da crawler ben educati. Ciò consente al file robots.txt di essere gestito separatamente dal servizio immagini stesso.

Se questo non sembra soddisfare le vostre esigenze, sentitevi liberi di commentare e io chiarirò o ritirare questa risposta.

+1

Ho esitato a contrassegnarlo come la risposta "corretta" perché sono ancora curioso di mantenere Content-Type con AWS API Gateway, ma questo è stato assolutamente utile ed è quello che ho finito per fare. – kjs3

+0

@ kjs3 Sono contento che mi abbia aiutato, e non ti biasimo affatto. Sentiti libero di resistere per una risposta più diretta. La tua domanda è interessante e forse otterremo una risposta che la indirizzi in modo più preciso. Se avrò l'opportunità di eseguire test più estesi su AWS API Gateway, riferirò su ciò che trovo. –

5

Stavo cercando di formattare una stringa da restituire senza preventivi e ho scoperto la funzionalità di risposta di integrazione.Non ho provato io stesso fissare, ma qualcosa in questo senso dovrebbe funzionare:

  • Vai alla pagina esecuzione Metodo della risorsa,
  • click sull'integrazione di risposta,
  • espandere Metodo di stato di risposta 200,
  • espandere Modelli Mapping,
  • click "application/json",
  • fare clic sulla matita accanto uscita Passthrough,
  • cambiamento "applicatio n/json "a" image/png "

Spero che funzioni!

+1

Appena provato funziona. @ tgig Grazie –

+0

Sono molto sospettoso di questa risposta. Altre informazioni sembrano indicare che NON è possibile (in modo affidabile) restituire dati binari tramite API Gateway. – Jason

1

@kjsc: abbiamo finalmente capito come ottenere questo lavoro su una questione si alternano a Base64 dati di immagine codificata che si possono trovare utili nella soluzione:

AWS Gateway API base64Decode produces garbled binary?

per rispondere alla tua domanda, per ottenere il Content-Type deve essere considerato come un valore hard-coded, si dovrebbe prima entrare nella schermata di risposta del metodo e aggiungere un'intestazione Content-Type e qualunque tipo di contenuto si desidera.

api gateway method response

Poi devi andare nella finestra Integrazione di risposta e di impostare il tipo di contenuto per il valore desiderato (image/png in questo esempio). Avvolgi 'immagine/png' tra virgolette singole.

enter image description here

Problemi correlati