如何从aws lambda函数返回哈希?
使用boto3模块。
这是我的代码片段
def lambda_handler(event, context):
global cnt
any = []
for node in ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]):
inst= node.instance_type
any.append(inst)
cnt=collections.Counter(any)
return cnt
for key, val in cnt.items():
print key
print val
确切的代码在python IDE中有效。我的目标是从AWS lambda函数返回一个变量,并在同一个lambda函数中使用其他函数。
lambda日志中的错误
module initialization error: global name 'cnt' is not defined
答案 0 :(得分:2)
编辑:添加错误消息后,问题似乎是没有在顶级范围内声明全局。见this answer。相应地修复我的样本。
如果需要,AWS会将您的代码加载到容器中,然后调用Lambda Function Handler属性指示的方法。该函数可能引发错误或返回数据,AWS将传递回调用者(例如:API网关方法)。
所以,例如你可以:
cnt = []
def lambda_handler(event, context):
global cnt
cnt = [{'id': 1, 'label': 'One'}, {'id': 2, 'label': 'Two'}]
print "cnt: {0!s}".format(cnt)
other_method()
return cnt
def other_method():
global cnt
print "cnt length is: {0!s}.format(len(cnt))
return
(我还没有在AWS上对此进行测试,因此请注意可能的错误)
但可以说,你也可以让lambda_handler
方法将cnt
变量作为参数传递给other_method
。
或者创建一个类并在其上调用一些方法,让类将cnt
变量作为自己的数据进行管理(例如:通过受保护的变量)。
请记住,在对任何给定Lambda的连续调用之间,全局变量可能存在也可能不存在。请参阅Understanding Container Reuse in AWS Lambda。
HTH
答案 1 :(得分:1)
AWS将调用您定义的lambda入口点,一旦返回,将终止lambda进程。除非您的入口点调用这些函数,否则没有机会在其他函数中使用全局函数。如果入口点调用其他函数,则可以将cnt
作为参数传递 - 不需要全局。如果您的入口点没有调用其他功能,那么它们根本不会运行 - 仍然不需要全局:)