【问题标题】:POST JSON object to aws lambda将 JSON 对象发布到 aws lambda
【发布时间】:2017-10-09 23:46:36
【问题描述】:

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    我想通了。现在我有一个 API Gateway 接受客户端发布指定格式的 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 区域中。我将整个“事件”变量转储到 SQS,因为它只包含发布的 JSON 数据。

    第 2 步-

    现在在 AWS 控制台中转到“API Gateway”,然后创建一个新的 API Gateway,然后在资源下创建一个“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 时都重新部署 API。

    【讨论】:

    • 感谢您的详细解答!你能用这个标记这个问题吗?
    • 嗨,@AbhignaNagaraja 感谢您的认可。我将此问题标记为已回答。
    • 我看不到你创建后如何使用response 对象?
    • 嗨@CpILL 我没有在这个特定的例子中使用响应对象。这只是一个示例,展示了如何将数据发布到 SQS,同时通过 AWS-Gateway API 将其作为 JSON 对象传递。但如果你有兴趣,你可以通过这个article。但是,如果您想创建一个 .NET lambda 函数以在 SQS 中发布数据(或者,可能使用 DynamoDB),我建议您使用 AWS SDK for Visual Studio。在那里,您可以使用无服务器函数项目模板直接发布您的函数。
    • 被困在这个问题上好几个星期了,一直在试图破解它。这是一个实际的解决方案,我可以将其扩展到我的无服务器工作流的其余部分 - 做得好@Sudip
    【解决方案2】:

    是的,你可以,

    如果您使用 Lambda 代理集成从 API Gateway 触发 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
      }
    

    【讨论】:

    • 谢谢@Mark。我实际上以不同的方式做到了。我在 API Gateway 中创建了一个 JSON Schema 模型并在 API Body 模板中使用它。然后我从连接的 Lambda 的偶数变量中获取所有数据,然后将其转储到 AWS SQS 中。这对我来说效果很好。我会为这个问题写一个单独的答案来解释这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2015-11-16
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多