【发布时间】: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
如何通过 aws API 网关将 json 对象发布到 aws lambda 函数?
p.s.- 我的目标是在 python 中编写 lambda 函数,然后将其发布到 aws SQS。
提前致谢。
【问题讨论】:
标签: json http-post aws-lambda aws-api-gateway
我想通了。现在我有一个 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”操作。
现在,在发布操作下,点击“集成请求”。现在像下面给出的示例一样向它添加一个正文模板-
{
"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。
【讨论】:
response 对象?
是的,你可以,
如果您使用 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
}
【讨论】: