繁体   English   中英

另一个lambda函数调用lambda函数的方法-Python

[英]call method of lambda function from another lambda function - Python

我可以从另一个lambda函数调用lambda函数,但默认情况下它转到处理程序方法。 如何调用其中定义的其他方法?

假设有lambda函数master.py,它将具有可以被其他lambda函数使用的通用方法,这样我就不必在每个函数中一次又一次地编写它们。 现在,我想从其他lambda函数调用master.py的方法(比如说getTime(),authenticateUser()等)。

基本上,我想保留一个lambda函数,它将具有可以由其他lambda函数使用的通用方法。
任何帮助表示赞赏。

下面是我尝试从另一个调用一个lambda函数的代码(我从这个问题中获取了代码),但是转到了handler()方法:

Lambda函数A

def handler(event,context):
    params = event['list']
    return {"params" : params + ["abc"]}

Lambda函数B调用A

import boto3
import json

lambda_client = boto3.client('lambda')
a=[1,2,3]
x = {"list" : a}
invoke_response = lambda_client.invoke(FunctionName="functionA",
                                       InvocationType='RequestResponse',
                                       Payload=json.dumps(x))
print (invoke_response['Payload'].read())

产量

{
  "params": [1, 2, 3, "abc"]
}

您可以在调用invoke时在事件参数内传递运行所需的lambda函数方法所需的数据。 如果您在lambda_handler的顶部将以下代码从lambda函数中包含您要调用的方法。

def lambda_handler(event, context):
    """
    Intermediary method that is invoked by other lambda functions to run methods within this lambda
    function and return the results.

    Parameters
    ----------
    event : dict
            Dictionary specifying which method to run and the arguments to pass to it
            {function: "nameOfTheMethodToExecute", arguments: {arg1: val1, ..., argn: valn}}
    context : dict
            Not used

    Returns
    -------
    object : object
            The return values from the executed function. If more than one object is returned then they
            are contained within an array.
    """
    if "function" in event:
         return globals()[event["function"]](**event["arguments"])
    else:
        # your existing lambda_handler code...

然后,使用以下方法invoke来调用该方法并从另一个lambda函数获取返回值。

import json

# returns the full name for a lambda function from AWS based on a given unique part
getFullName = lambda lambdaMethodName: [method["FunctionName"] for method in lambda_client.list_functions()["Functions"] if lambdaMethodName in method["FunctionName"]][0]

# execute a method in a different lambda function and return the results
def invoke(lambda_function, method_name, params):
    # wrap up the method name to run and its parameters
    payload = json.dumps({"function": method_name, "arguments": params})
    # invoke the function and record the response
    response = lambda_client.invoke(FunctionName=getFullName(lambda_function), InvocationType='RequestResponse', Payload=payload)
    # parse the return values from the response
    return json.loads(response["Payload"].read())


[rtn_val_1, rtn_val_2] = invoke("fromLambdaA", "desiredFunction", {arg1: val1, arg2: val2})

请注意,您附加到调用另一个lambda函数的函数的lambda策略将需要两个策略:“ lambda:ListFunctions”和“ lambda:InvokeFunction”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM