web-dev-qa-db-fra.com

POST Objet JSON à aws lambda

Comment puis-je publier un objet JSON sur la fonction aws lambda via la passerelle API aws?

p.s.- Mon objectif est d’écrire la fonction lambda en python, puis de la poster sur aws SQS.

Merci d'avance.

5
Sudip

Je l'ai compris. Maintenant, j'ai un client acceptiong de passerelle API qui a publié des données JSON d'un format spécifié, puis les transmet à une fonction AWS-Lambda, qui les transfère dans un AWS-SQS. Les étapes sont expliquées ci-dessous en détail-

ÉTAPE 1-

Créez une fonction lambda dans n’importe quel langage pris en charge (j’ai utilisé Python 3.6). Voici un exemple de code.

import boto3  
import json

def lambda_handler(event, context):

    sqs = boto3.resource('sqs')

    queue = sqs.get_queue_by_name(QueueName='userData')

    response = queue.send_message(MessageBody=json.dumps(event))

    return {
                "status":"0",
                "message":"",
                "pubId":event["ClientID"],
                "routetitle":event["routeTitle"]
            }

Remarque: j'ai importé les bibliothèques json et boto3, qui sont disponibles dans un contexte aws, sans avoir besoin d'ajouter de fichier supplémentaire. Vérifiez également que je n'ai pas spécifié de détails pour SQS autres que le nom, car ma fonction Lambda et SQS se trouvent dans la même région AWS. Je vide toute la variable "événement" dans SQS, car celle-ci contient uniquement les données JSON publiées.

ÉTAPE 2-

Maintenant, dans la console AWS, allez dans "API Gateway" puis créez une nouvelle passerelle API, puis créez une action "POST" sous "resources". 

S'il vous plaît vérifier la capture d'écran

Maintenant, sous l'action post, cliquez sur "Demande d'intégration". Ajoutez maintenant un modèle de corps comme dans l'exemple ci-dessous.

{
  "userMobile" : "$input.params('userMobile')",
  "ClientID" : "$input.params('ClientID')",
  "routeTitle" : "$input.params('routeTitle')"
}

Assurez-vous également que le "type d'intégration" de votre API est "Lambda" et que la fonction Lambda créée dans STEP-1 est connectée à l'API.

Maintenant, nous avons presque fini. il ne nous reste plus qu'à créer une étape pour l'API que nous avons créée et à la déployer. ***

Veuillez noter l'URL HTTP de l'API après le déploiement.

ÉTAPE 3-

Allez maintenant dans le "Service de mise en file d'attente simple (SQS)", puis créez un SQS simple en conservant tous les paramètres par défaut. Assurez-vous que le nom de la file d'attente correspond à celui que vous avez fourni dans votre fonction Lambda et que votre fonction Lambda et votre SQS se trouvent dans la même région AWS.

Vous pouvez maintenant POST données JSON au même format que votre API et votre fonction Lambda les videra dans la file d'attente SQS, où vous pourrez accéder aux données.

Vous pouvez également tester l'API à l'aide d'outils tels que Fidler.

*** Assurez-vous de redéployer l'API chaque fois que vous apportez une modification.

5
Sudip

Oui, vous pouvez,

Si vous déclenchez la fonction Lambda à partir d'API Gateway à l'aide de l'intégration du proxy Lambda, la requête appellera la fonction avec une charge similaire à celle ci-dessous. Comme vous pouvez le constater, il suffit d'analyser l'attribut du corps JSON.

  {
    "resource": /path",
    "path": "/path",
    "httpMethod": "PUT",
    "headers": {
      "Accept": "*/*",
      "Accept-Encoding": "gzip, deflate, sdch, br",
      "Accept-Language": "en-US,en;q=0.8,pl;q=0.6,en-GB;q=0.4",
      "Cache-Control": "no-cache",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "PL",
      "Content-Type": "application/json",
      "DNT": "1",
      "Host": "api.stockflare.com",
      "Origin": "http://localhost:3000",
      "Pragma": "no-cache",
      "Referer": "http://localhost:3000/databank",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
      "Via": "1.1 XXXXX.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "XXXXXX==",
      "X-Amzn-Trace-Id": "Root=XXXXXX",
      "X-Forwarded-For": "XXXXX",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "queryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "path": "/path",
      "accountId": "XXXXX",
      "resourceId": "p0flbp",
      "stage": "v1",
      "requestId": "XXXXX",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "apiKey": "",
        "sourceIp": "XXXXXX",
        "accessKey": null,
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
        "user": null
      },
      "resourcePath": "/path",
      "httpMethod": "PUT",
      "apiId": "XXXXXX"
    },
    "body": "{\"fields\":[\"forecast_pe\"],\"countries\":[\"_all\",\"amer\",\"apac\",\"emea\"],\"sectors\":[\"50\",\"51\"]}",
    "isBase64Encoded": false
  }
0
Mark Stratmann