2015-10-19 1 views
1

J'utiliseAws lambda bousille mon encodage

https://clifff.com/2015/10/01/2015-failed-experiments-with-aws-lambda/ + https://www.twilio.com/blog/2015/09/build-your-own-ivr-with-aws-lambda-amazon-api-gateway-and-twilio.html

pour créer un service de redimensionnement d'image sur aws lambda ... Je résolu la question du type de contenu le premier article a été bloqué à, mais l'encodage semble être une impasse ... toute aide serait grandement appréciée!

rubis

Base64.decode64("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 

-> image de travail

GIF89a\u0001\u0000\u0001\u0000\x80\u0000\u0000\u0000\u0000\u0000\xFF\xFF\xFF!\xF9\u0004\u0001\u0000\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0001D\u0000; 

passerelle api avec

$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 

-> image brisée

GIF89a\u0001\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000���!�\u0004\u0001\u0000\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0001D\u0000; 
+0

Votre mode d'utilisation ne convient pas pour la combinaison de la passerelle API et Lambda. API Gateway est exclusivement un proxy ou un point de terminaison JSON/XML REST. Passer des charges utiles binaires à travers est un hack. Vous devriez plutôt stocker vos données binaires directement dans S3, puis déclencher la fonction Lambda via des notifications ou via la passerelle API. Rechercher d'autres questions ici pour en savoir plus à ce sujet, il a été répondu à plusieurs reprises. – kixorz

+0

Je ne peux pas stocker dans s3 puisque c'est censé être généré des images. – grosser

+0

Je comprends. Vous devez stocker le contenu binaire généré dans S3 et renvoyer la redirection 301 vers l'URL de l'objet S3. Vous ne pourrez pas renvoyer directement le contenu binaire de Lambda via API Gateway. – kixorz

Répondre

2

OK, c'est super vieux fil, mais étant donné que la question est toujours pas résolu, et le support binaire pour API GW est lamentablement documenté, je pensais que quelqu'un pourrait trouver la solution de contournement que j'ai trouvé utile:

Je crois, que les données binaires sont transmises comme des chaînes UTF-8 quelque part dans l'API GW. Si vous avez uniquement besoin de renvoyer un pixel de suivi (et non par exemple une image générée), vous pouvez éviter le problème de l'encodage fictif en utilisant une image qui n'a pas d'octets problématiques dans ses données binaires. Par exemple, le pixel de suivi le plus court (GIF long de 26 octets) a un octet avec une représentation hexadécimale 0xFF au milieu. Cela va casser l'API GW. Mais si vous modifiez cette image dans l'éditeur hexadécimal et remplacez l'octet par 0x00, vous obtiendrez quelque chose qui reste une image valide (et même les navigateurs Microsoft ne s'en plaindront pas), mais peuvent encore être traités par API GW.

Faites votre modèle « Mapping Body » ressemble à ceci:

$util.base64Decode("R0lGODlhAQABAAAAACwAAAAAAQABAAACADs=")