我在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.sayHello
lambda函数看起来像:
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请求触发的。