POST JSON对象到aws lambda

时间:2017-05-11 05:53:34

标签: json http-post aws-lambda aws-api-gateway

如何通过aws API网关将json对象发布到aws lambda函数?

p.s.-我的目标是在python中编写lambda函数,然后将其发布到aws SQS。

提前致谢。

2 个答案:

答案 0 :(得分:5)

我明白了。现在,我有一个API Gateway acceptiong客户端发布了指定格式的JSON数据,然后将其传递给AWS-Lambda函数,该函数将数据转储到AWS-SQS中。这些步骤将在下面详细说明 -

第1步 -

使用任何支持的语言创建lambda函数(我使用过Python 3.6)。这是一个示例代码。

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"]
            }

注意:我已经导入了aws上下文中可用的json和boto3库,无需再添加任何文件。另请注意,除了名称之外,我没有为SQS指定任何详细信息,因为我的Lambda函数和SQS都位于同一AWS区域。我将整个“event”变量转储到SQS,因为它只包含发布的JSON数据。

第2步 -

现在在AWS控制台中转到“API网关”,然后创建一个新的API网关,然后在资源下创建一个“POST”操作。

Please check the screenshot

现在,在帖子操作下,点击“整合请求”。现在添加一个正文模板,如下面给出的示例 -

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

另外,请确保您的API的“集成类型”为“Lambda”,并且我们在STEP-1中创建的Lambda函数已连接到API。

现在,我们差不多完成了。现在我们所要做的就是为我们创建的API创建一个阶段并部署API。 ***

请注意部署后API的HTTP URL。

第3步 -

现在转到“简单排队服务(SQS)”,然后创建一个简单的SQS并保留所有默认参数。确保队列名称与Lambda函数中提供的队列名称匹配,并且Lambda函数和SQS都位于同一AWS区域。

现在,您可以将相同格式的JSON数据发送到您的API,您的Lambda函数会将其转储到SQS队列,您可以在那里查看数据。

您还可以使用Fidler等工具测试API。

***确保每次对其进行更改时都重新部署API。

答案 1 :(得分:0)

是的,你可以,

如果使用Lambda Proxy集成从API网关触发Lambda函数,请求将使用如下所示的有效负载调用该函数。如您所见,您需要做的就是解析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
  }