D'API AWS Passerelle et Lambda de retour sur l'image
Dire que j'ai ce code HTML:
<img src="http://example.com/pic"/>
Ce que je voudrais faire est de les avoir example.com/pic carte à un API AWS Passerelle de terminaison.
Que le point de terminaison serait alors d'appeler une fonction lambda.
Que la lambda avec fonction de lecture aléatoire d'une image à partir d'un compartiment s3 et le retourner.
Donc, mon objectif est d'utiliser une NORME HTML balise d'image et de se retrouver avec une image à partir d'un compartiment s3 mais passer par une décision de code dans le lambda pour décider de l'image pour revenir.
Je sais que vous pouvez utiliser s3 pour servir du contenu statique directement (d'où le lambda de faire une décision sur l'image). Je sais aussi que je pouvais faire des trucs dans le lambda comme b64 coder la réponse et de la gérer sur le client, mais je suis visant à utiliser le standard de la balise HTML < IMG>.
Est-ce possible?
J'ai essayé d'utiliser le ResponseStreamHandler (Java SDK) pour le lambda et le retour le tableau d'octets de l'image, et a également ajouté la passerelle API config pour pas carte la sortie JSON, mais rien ne semble fonctionner!
Vous devez vous connecter pour publier un commentaire.
Il semble AWS a simplifié ce processus, de sorte que beaucoup de réponses sont obsolètes et/ou trop compliqué.
C'est comment je me suis Lambda renvoie une image par le biais de la Passerelle API, en juin 2018:
1) de l'API De la Passerelle, permettre
Use Lambda Proxy integration
pour votre API. (Ce réglage est situé sur l'Intégration de la Demande de la section, où vous avez défini le type de Lambda.)2) de l'API De la Passerelle, sélectionnez votre API et cliquez sur
Settings
. DansBinary Media Types
ajouter*/*
. (Note: j'ai essayé d'ajouter simplement 'image/jpeg', mais il semble exiger*/*
pour obtenir ce travail)3) assurez-vous de déployer votre API, sinon vos modifications ne seront pas en direct. (En Passerelle API, sélectionnez votre API, Actions > Déployer API).
4) Dans votre Lambda code de retour de votre image en Base64 (cet exemple de code C#):
Fait.
Si vous avez configuré votre API nécessite pas d'authentification, tapez simplement votre API lien dans votre navigateur, et l'image s'affiche. Ou placer l'API lien dans un
IMG
tag. par exemple,<img src="https://asdf.execute-api.us-east-1.amazonaws.com/live/myapi" />
Remarque: Même si dans l'étape 2, vous définissez la
Binary Media Types
à*/*
, Passerelle API renvoie toujours le texte si c'est ce que votre Lambda est de retour.*/*
est parce que APIG bêtement nécessite l'en-tête accept de match. Ainsi, le client doit envoyerAccept: image/jpeg
pour que le décodage binaire à se produire. Depuis chrome (tous les navigateurs?) envoyerAccept: */*
, qui le fait fonctionner.*/*
et les infos que vous avez à déployer votre api chaque fois que vous modifiez quelque chose!Accept : */*
a été utile en tant que navigateur envoie*/*
et j'étais de retour type de contenu spécifique"Content-Type": "image/jpeg"
isBase64Encoded
commetrue
dans la réponse de l'objet. Que fait le truc pour le retour des données binaires.Heureusement, maintenant, d'API AWS Passerelle prend en charge les données binaires, mais vous devez également mettre à jour votre méthode par le biais de la CLI, il n'est pas encore implémenté dans la Console. C'est ce que vous devez faire:
Ensemble
Content-Type
commeimage/jpeg
en État HTTP 200 RéponseL'en-tête
Ensemble
Content-Type
comme'image/jpeg'
dans l'en-Tête de Mappings. L'esprit les guillemets!contentHandling
attributCONVERT_TO_BINARY
sur votre Intégration RéponseVérifier à tout le processus dans cette grande étape par guide pas à pas: https://stackoverflow.com/a/41434295/720665
J'ai couru dans un problème similaire. Comme mentionné, vous ne pouvez pas retourner directement votre image dans un format binaire à partir de votre Passerelle API de point de terminaison, ce qui serait nécessaire pour que le navigateur pour l'afficher correctement.
Cependant, j'ai résolu ce problème par au lieu d'avoir de la Passerelle API retour d'un de Redirection 302, pointant vers le bon fichier dans S3. Vous pouvez avoir votre Lambda de retour de la fonction de l'url du fichier, qui est par la suite mappée à l'Emplacement de l'en-tête de la Passerelle API. Le navigateur va suivre la redirection et afficher l'image correctement.
Il y a plusieurs façons de mettre en œuvre la redirection, mais j'ai fait comme suit:
Lambda retourne un objet avec l'image de la cible comme suit:
Supprimer la normale '200' de la Méthode Statut de la Réponse de L'Intégration de la Réponse de l'API de la Passerelle. Le remplacer par un '302' état de réponse et ajouter la "Localisation" de l'en-tête mappé à la valeur de l'intégration.réponse.corps.emplacement de'
Ajouter le statut 302 de la Méthode de Réponse ainsi
Juste pour être clair, le client n'deux demandes différentes:
En d'autres termes, les données de l'image n'est pas incorporé dans le code HTML.
Basé sur cette connaissance, vous pouvez avoir un Lambda (derrière la passerelle API) comme vous le suggérez. Le Lambda de la mise en œuvre peut avoir une certaine logique qui détermine l'url de l'image stockée dans S3. Cependant, le Lambda renvoie les données JSON et non HTML (il y a des solutions de contournement comme renvoyer le code html dans une variable) ce qui rend les choses plus difficile, en particulier pour les grandes pages HTML.
Je suggère une approche légèrement différente, depuis la réception d'une balise d'image, vous n'obtiendrez pas loin. Je suppose que vous inline la balise image dans un document HTML, probablement à l'aide de JavaScript. Alors vous pourriez tout aussi bien laisser la Passerelle API /Lambda demande de retour d'un document JSON avec l'url de l'image et de laisser le JavaScript soit mettre à jour une balise image avec la nouvelle adresse ou de générer l'étiquette pour vous.
Il n'est actuellement pas possible parce que vous ne pouvez pas retourner des données binaires par le biais de l'API AWS Passerelle.
Pour que cela fonctionne, la fonction lambda aurait besoin de retourner les données de l'image comme blob binaire, et certaines méta-informations comme le type de contenu image. Puis, d'API AWS Passerelle devra être en mesure de cartographier ce à la réponse HTTP. Par exemple:-
lambda retourne:
{
contentType: 'image/png',
image: "encoded binary data"
}
puis passerelle API aurait besoin de carte contentType pour le "content-type" en-tête de la réponse, et de mettre les données de l'image dans le corps de la réponse avec le droit de l'encodage et de la longueur.
Malheureusement, il ne veut pas faire de ce droit maintenant. Il ne cartes encodages de texte comme application/json ou de l'application/xml comme le type de réponse (il est conçu pour les Api, après tout).
Vous pouvez très facilement le faire en utilisant un ElasticBeanstalk où vous avez beaucoup plus de contrôle sur la réponse http.