返回aws lambda中的变量

时间:2017-04-16 15:45:32

标签: python amazon-web-services lambda aws-lambda

如何从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

2 个答案:

答案 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作为参数传递 - 不需要全局。如果您的入口点没有调用其他功能,那么它们根本不会运行 - 仍然不需要全局:)