AWS Serverless - Lambda支持HTTP和Cloudwatch调度事件



我在serverless.yml中的函数部分看起来类似:

functions: 
MyLambda: 
handler: handler.sayHello
name: my-lambda-say-hello
events:
-  http: 
path: /myPpath 
method: post
cors: true
-  schedule: 
name: my-schedule-event
description: 'bla bla'
rate: rate(10 minutes)
input: 
body: '{"name": "John"}'

我的handler.sayHellolambda函数看起来像:

import json  
def sayHello(event, context):
#Works for HTTP 
print(json.loads(event['body'])['name']) 
#Works for Cloudwatch schedule event 
print(event['body']['name']

基本上,我有一个lambda函数,它获取一个名称并输出它。
这个Lambda可以由HTTP请求触发(我将数据作为JSON在body中发送),也可以由预定的Cloudwatch事件触发。

正如您在Lambda函数中看到的,当我试图提取来自HTTP请求的name属性时,我需要json.loads()事件主体对象。
然而,当它来自预定的事件时,我根本不需要json.loads()它。
是否可能以某种方式使我的Lambda支持这两个事件,而不切换json.loads()?
谢谢!

Lambda函数的event有效负载将根据调用服务的不同而变化。它们在Cloudwatch、API Gateway或其他服务(如SNS、SQS、EventBridge、DynamoDB、S3等)之间是不一样的。

相反,您需要添加可以根据调用服务有条件地提取name(和其他属性)的逻辑。

你可以将json.loads封装在try/except块中,或者你可以检查event是否包含requestContext密钥;这将表明该函数是由通过API网关的HTTP请求触发的。

最新更新